「YouTube (Music)のプレイリストのギャップレス再生」の版間の差分
Notion-MW |
Notion-MW |
||
(同じ利用者による、間の4版が非表示) | |||
11行目: | 11行目: | ||
インストールは実行ファイル単体でダウンロードしてもいいし、pipのパッケージとして入れてもよい。 | インストールは実行ファイル単体でダウンロードしてもいいし、pipのパッケージとして入れてもよい。 | ||
例えば、<code>yt-dlp -F 動画URL</code>とすると、ダウンロード可能なフォーマット(画質・音質に差がある)が一覧表示される。なおURLに& | 例えば、<code>yt-dlp -F 動画URL</code>とすると、ダウンロード可能なフォーマット(画質・音質に差がある)が一覧表示される。なおURLに&が含まれる場合は””で囲うこと。これを見るとわかるが、YouTubeの動画は内部では動画と音声に分けて管理されており、再生時にブラウザで両者を合成している。最も高品質な音声データは”251”というフォーマット番号のもので、Opus形式で圧縮されたWebMオーディオとなっている。これをギャップレス再生することができれば目的は達成できそうである。なお、動画によっては(アップロード日が古いもの?)”251”がないものもある。 | ||
WebMオーディオのギャップレス再生に対応したソフトは少なく、筆者が知っているものは[https://mpv.io/ mpv]のみである。mpvの使い方やオプションについては[[MPVとギャップレス再生|MPVとギャップレス再生]]も参照。mpv以外だとWindows Media PlayerやFoobar2000などはwavやflacのギャップレス再生には対応しているが、webaの再生においてはわずかに隙間が聴こえる。従ってこの記事ではmpvを使用する。 | WebMオーディオのギャップレス再生に対応したソフトは少なく、筆者が知っているものは[https://mpv.io/ mpv]のみである。mpvの使い方やオプションについては[[MPVとギャップレス再生|MPVとギャップレス再生]]も参照。mpv以外だとWindows Media PlayerやFoobar2000などはwavやflacのギャップレス再生には対応しているが、webaの再生においてはわずかに隙間が聴こえる。従ってこの記事ではmpvを使用する。 | ||
96行目: | 96行目: | ||
<ul> | <ul> | ||
<li><p>ytp.bat(最初に呼ばれるランチャー)</p> | <li><p>ytp.bat(最初に呼ばれるランチャー)</p> | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="c">cd %~dp0 | ||
set "snd=%2" | |||
if "%2"=="" set "snd=0" | |||
< | start "" "ytp-invisible.vbs" %1 %snd% "--fs=yes" "\'--af=lavfi=[pan=stereo|c0=0.75*c0+0.25*c1|c1=0.25*c0+0.75*c1]\'"</syntaxhighlight> | ||
< | <p>再生曲数が指定されていない場合は0を補う。<code>--af</code>オプションに関してはバックスラッシュとシングルクォートでエスケープしている(試行錯誤のすえ、とりあえずこれで問題なく動いている)。</p></li> | ||
<li><p>ytp-invisible.vbs(bashを非表示で起動するためのvbs)</p> | <li><p>ytp-invisible.vbs(bashを非表示で起動するためのvbs)</p> | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="vb.net">Dim oWshShell | ||
Set oWshShell = CreateObject("WScript.Shell") | |||
Dim mpv_args | |||
< | For cnt = 2 To WScript.Arguments.Count - 1 | ||
< | mpv_args = mpv_args & " " & WScript.Arguments(cnt) | ||
Next | |||
oWshShell.Run """C:\Program Files\Git\bin\bash.exe"" -c 'ytpx.sh """ & Wscript.Arguments(0) & """ " & Wscript.Arguments(1) & mpv_args & "'", 0, False</syntaxhighlight> | |||
<p>2つ目以降の引数をつなげて渡している。Runのオプションで0(非表示)、False(終了を待たない)を指定している。デバッグ時は0を1に変えておくとウィンドウが表示される。</p></li> | |||
<li><p>ytpx.sh(処理を行う本体)</p> | <li><p>ytpx.sh(処理を行う本体)</p> | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="shell">#!/bin/sh | ||
cd /path/to/mpv_dir | |||
NA_OPTION="--compat-options no-youtube-unavailable-videos" | ARR=(`echo $1 | sed -r "s/^.*(www|music)\.youtube\.com\/watch\?v=[^&]+&list=([^&]+)&index=([^&]+)$/\1 \2 \3/"`) | ||
if [ ${ARR[0]} = "www" ]; then | |||
NA_OPTION="--compat-options no-youtube-unavailable-videos" | |||
fi | |||
INDEX=${ARR[2]} | |||
if [ "$2" != "0" ]; then | |||
END_INDEX=`expr $INDEX + $2 - 1` | |||
fi | fi | ||
shift 2 | |||
yt-dlp $NA_OPTION -f bestaudio --extractor-args "youtube:lang=ja" -O title -O url -I $INDEX:$END_INDEX ${ARR[1]} | sed '1~2 s/^/#EXTINF:-1,/' | sed '1i#EXTM3U' | ./mpv.exe --player-operation-mode=pseudo-gui --prefetch-playlist=yes --playlist=- $@</syntaxhighlight> | |||
< | <p>まず3行目で、長さ3の配列ARRに①”www”または”music”②プレイリストID③index、をそれぞれ入れる(動画IDは捨てる)。4~6行目で<code>--compat-options no-youtube-unavailable-videos</code>の有無を設定する。</p> | ||
<p>7~10行目では開始indexと再生曲数を用いて植木算をして終了曲のindexを計算している。$2が0なら$END_INDEXは未設定のため事実上は空文字列(終了曲の指定なし)となる。</p> | |||
<p>最後がメインのコマンド実行である。yt-dlpを用いてタイトルと内部URLの一覧を取得する(なお<code>--extractor-args "youtube:lang=ja"</code>は日本語タイトルを取得しようとして入れてあるが、現状では(おそらくyt-dlpがwww.のほうしか見ないため)効果なし)。フォーマットは最高音質を取得する<code>bestaudio</code>を指定する。さらに、ここまでに計算した開始・終了インデックスを<code>-I</code>オプションで渡す。出力形式としてはタイトルと内部URLが交互に書かれた複数行テキストが返ってくる。</p> | |||
7~10行目では開始indexと再生曲数を用いて植木算をして終了曲のindexを計算している。 | <p>次に、mpvにm3u形式のプレイリスト(単にurlやファイル名を列挙する書式と違って、再生時のタイトルを指定できる)として渡すため、タイトルがある行(奇数行)の先頭に#EXTINF:-1,を付加し、さらに全体の先頭行に#EXTM3Uを付ける。そして最後にmpvの--playlistに対して標準出力(ハイフンで表される)を渡すことで、めでたくタイトル付きで音声をギャップレス再生できる。動画データを渡していないので画面は真っ黒である。</p> | ||
<p>追加のmpvのオプションとしては、バッチファイルから渡されてきたものに加えて、CUIからの実行でもGUIを強制する<code>--player-operation-mode=pseudo-gui</code>とWeb上リソースのギャップレス再生に有効な<code>--prefetch-playlist=yes</code>を指定しているが、古いバージョンではさらにオプションが必要かもしれない([[MPVとギャップレス再生|MPVとギャップレス再生]] も参照)。もちろん、スクリプト内ではなくmpv.confで指定してもよい。</p> | |||
<p>なお(lib)mpvを内部で使用する<strong>mpv以外の</strong>クライアント(Linuxのcelluloidなど)の場合はハイフンを用いた標準入力からの受け取り指定ができないこともある。手元のLinuxではとりあえず一旦m3uファイルに書き込んでからそれをcelluloidに渡すように変えてある(自明なのでここでは省略)。celluloidなどを使う場合も、適宜オプションを指定すること。</p></li></ul> | |||
最後がメインのコマンド実行である。yt-dlpを用いてタイトルと内部URLの一覧を取得する(なお | |||
次に、mpvにm3u形式のプレイリスト(単にurlやファイル名を列挙する書式と違って、再生時のタイトルを指定できる)として渡すため、タイトルがある行(奇数行)の先頭に#EXTINF:-1,を付加し、さらに全体の先頭行に#EXTM3Uを付ける。そして最後にmpvの--playlistに対して標準出力(ハイフンで表される)を渡すことで、めでたくタイトル付きで音声をギャップレス再生できる。動画データを渡していないので画面は真っ黒である。 | |||
追加のmpvのオプションとしては、バッチファイルから渡されてきたものに加えて、CUIからの実行でもGUIを強制する | |||
== ショートカットキーからの起動 == | == ショートカットキーからの起動 == | ||
上記の実装では引用符の入力など多少の回りくどいキーボード操作が必要である。URLはクリップボードに入っているので、ショートカットキーから起動することももちろん可能である。ただし再生曲数を入力するためのダイアログは必要である。以下のAutoHotkeyのスクリプトの例では、Ctrl+Alt+Shift+Lを押すと入力ダイアログを表示して再生曲数を取得し、ytp.batを起動する。 | 上記の実装では引用符の入力など多少の回りくどいキーボード操作が必要である。URLはクリップボードに入っているので、ショートカットキーから起動することももちろん可能である。ただし再生曲数を入力するためのダイアログは必要である。以下のAutoHotkeyのスクリプトの例では、Ctrl+Alt+Shift+Lを押すと入力ダイアログを表示して再生曲数を取得し、ytp.batを起動する。 | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="vb.net">^!+l:: | ||
InputBox, play_numbers, Gapless Play YouTube, Enter the number of tracks to play ("" or "0" will play to the end) | InputBox, play_numbers, Gapless Play YouTube, Enter the number of tracks to play ("" or "0" will play to the end) | ||
Run ytp.bat "%clipboard%" %play_numbers%</syntaxhighlight> | Run ytp.bat "%clipboard%" %play_numbers%</syntaxhighlight> |