序文 「そんなコマンドで大丈夫か?」
ぐぐるとよく出てくるのが以下のコマンド例。
youtube-dl 'YouTube動画URL' -o - | mplayer - -novideo
ハイフンは標準入出力。-o
は出力ファイルを指定するスイッチだが、ハイフンを与えているので、出力先は標準出力となる。
それをパイプで繋げ、mplayer -
で標準出力を受け取って再生。-novideo
スイッチにより、サウンドのみとなる。
youtube-dl
は本来(?)YouTube動画 DL ツールだが、こうしたコマンドの組み合わせで実質ストリーミング再生として動作する。実に単純明快でスマートなコマンド。美しい。「丈夫だ、問題ない」
ところが実際に試してみると、動画によっては途切れ途切れの再生となってしまう。また、1時間以上あるような長めの動画ではエラーが発生する(YMMV)。
どうすればスムーズに再生できるか 公式 と睨めっこしながら試行錯誤することとなった。
その後、youtube-dl
の後継、上位互換の yt-dlp を試したところ、曲の途切れも殆ど無く、長めの動画でも再生でき感心。また、youtube-dl
ではプレイリストの連続再生が上限 100 に制限されていたが、yt-dlp
では撤廃されている。
色々と進化、改良されている模様。何だよ最初からこっちを使えば良かったのか、って話だけど。折角色々と調べたのでおススメのスイッチ指定を情報展開する。「神は言っている、このコマンドで完結する運命ではないと・・・」
環境は Pi OS Lite
だが、Linux 汎用と思われ(多分)。
インストール
まずは yt-dlp
。wget
を使用するなら以下。
sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
実行例(クリックで開閉)
$ sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
--2022-01-04 22:15:41-- https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp
github.com (github.com) をDNSに問いあわせています... 13.114.40.48
github.com (github.com)|13.114.40.48|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://github.com/yt-dlp/yt-dlp/releases/download/2021.12.27/yt-dlp [続く]
--2022-01-04 22:15:42-- https://github.com/yt-dlp/yt-dlp/releases/download/2021.12.27/yt-dlp
github.com:443 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://objects.githubusercontent.com/github-production-release-asset-2e65be/307260205/02e2617b-0775-4d02-a98e-a53a59289390?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220104%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220104T131542Z&X-Amz-Expires=300&X-Amz-Signature=82550cf395be61afc738144439441a5dfd07bf13817196b429c548bd46646224&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=307260205&response-content-disposition=attachment%3B%20filename%3Dyt-dlp&response-content-type=application%2Foctet-stream [続く]
--2022-01-04 22:15:42-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/307260205/02e2617b-0775-4d02-a98e-a53a59289390?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220104%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220104T131542Z&X-Amz-Expires=300&X-Amz-Signature=82550cf395be61afc738144439441a5dfd07bf13817196b429c548bd46646224&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=307260205&response-content-disposition=attachment%3B%20filename%3Dyt-dlp&response-content-type=application%2Foctet-stream
objects.githubusercontent.com (objects.githubusercontent.com) をDNSに問いあわせています... 185.199.109.133, 185.199.110.133, 185.199.111.133, ...
objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2295858 (2.2M) [application/octet-stream]
`/usr/local/bin/yt-dlp' に保存中
/usr/local/bin/yt-dlp 100%[=====================================================================>] 2.19M 2.00MB/s 時間 1.1s
2022-01-04 22:15:44 (2.00 MB/s) - `/usr/local/bin/yt-dlp' へ保存完了 [2295858/2295858]
$ sudo chmod a+rx /usr/local/bin/yt-dlp
その他 python
な人には PIP
等々、色々と用意されているので、詳細は 公式 の INSTALLATION
項参照。
mplayer
は標準パッケージで用意されているので以下。
sudo apt update -y && sudo apt full-upgrade -y
sudo apt install mplayer -y
実行例 「一番いいスイッチを頼む」
御託はいいからってことで結論としては以下。youtube-dl
でもこのスイッチ指定なら途切れない。
yt-dlp 'YouTube動画URL' --no-continue --no-progress -f 140 -o - | mplayer -af volnorm -
YouTube動画URL
はプレイリストも指定可。というか今回の目的としてはそれが前提。各スイッチの意味は以下。
-
--no-continue
Ctrl + c
等で強制終了した後、再度実行すると再生に失敗する場合がある。これは内部的にレジューム機能が働いて、それがうまく動作しないから。今回のケース(ストリーム再生)では不要なので止める。(というか無理) -
--no-progress
要らないっしょ。更に表示量を減らしたい場合は--quiet
も追加で。あまり変わらないが。 -
-f 140
ポイントがこれ。そもそもオーディオだけ必要なのに動画を DL するのは無駄。オーディオだけ DL する。これにより、mplayer
側のスイッチ-novideo
が不要になる。
尚、-f
スイッチのパラメタ140
の意味は以下参照。(ID
列)
フォーマット確認例(クリックで開閉)
$ yt-dlp -F https://www.youtube.com/watch?v=cjC5BzKlk-A
ID EXT RESOLUTION FPS | FILESIZE TBR PROTO | VCODEC VBR ACODEC ABR ASR MORE INFO
--------------------------------------------------------------------------------------------------------------
sb2 mhtml 48x27 | mhtml | images storyboard
sb1 mhtml 80x45 | mhtml | images storyboard
sb0 mhtml 160x90 | mhtml | images storyboard
139 m4a | 1.91MiB 47k https | audio only mp4a.40.5 47k 22050Hz low, m4a_dash
249 webm | 2.12MiB 52k https | audio only opus 52k 48000Hz low, webm_dash
250 webm | 2.79MiB 69k https | audio only opus 69k 48000Hz low, webm_dash
140 m4a | 5.09MiB 127k https | audio only mp4a.40.2 127k 44100Hz medium, m4a_dash
251 webm | 5.49MiB 137k https | audio only opus 137k 48000Hz medium, webm_dash
17 3gp 176x144 12 | 3.30MiB 82k https | mp4v.20.3 82k mp4a.40.2 0k 22050Hz 144p
160 mp4 256x144 30 | 3.25MiB 81k https | avc1.4d400c 81k video only 144p, mp4_dash
278 webm 256x144 30 | 3.79MiB 94k https | vp9 94k video only 144p, webm_dash
133 mp4 426x240 30 | 6.58MiB 164k https | avc1.4d4015 164k video only 240p, mp4_dash
242 webm 426x240 30 | 7.56MiB 188k https | vp9 188k video only 240p, webm_dash
134 mp4 640x360 30 | 16.01MiB 399k https | avc1.4d401e 399k video only 360p, mp4_dash
18 mp4 640x360 30 | 24.55MiB 612k https | avc1.42001E 612k mp4a.40.2 0k 44100Hz 360p
243 webm 640x360 30 | 13.90MiB 346k https | vp9 346k video only 360p, webm_dash
135 mp4 854x480 30 | 30.11MiB 751k https | avc1.4d401f 751k video only 480p, mp4_dash
244 webm 854x480 30 | 24.79MiB 618k https | vp9 618k video only 480p, webm_dash
136 mp4 1280x720 30 | 57.11MiB 1425k https | avc1.4d401f 1425k video only 720p, mp4_dash
22 mp4 1280x720 30 | ~63.67MiB 1552k https | avc1.64001F 1552k mp4a.40.2 0k 44100Hz 720p
247 webm 1280x720 30 | 50.90MiB 1270k https | vp9 1270k video only 720p, webm_dash
一つの動画コンテンツには複数のフォーマットが用意されていて、-F
スイッチで確認することができる。
VCODEC
列が audio only
の物がオーディオのみの物(そのまんま)。
因みに opus
形式(ACODEC
列)は mplayer
が対応していないので注意。
それと、yt-dlp
には、最善の音質フォーマットの物を自動で選択する -f bestaudio
や -f ba
スイッチが用意されているが、今回のケースではうまく機能しなかった。
また、オーディオを抽出する -x
や --extract-audio
スイッチが用意されているが、これは一旦動画ファイルを DL し、そこからオーディオを抽出するので逆に無駄。というか、今回のような使い方では上手く動かない。
-af volnorm
YouTube動画を連続再生していると困るのが音量がバラバラであること。ということで音量のノーマライズ。これは mplayer
側の仕事なので引数で与えている。意味は以下参照。
volnorm[=method:target]
Maximizes the volume without distorting the sound.
Sets the used method.1: Use a single sample to smooth the variations via the standard weighted mean over past samples (default).
Sets the target amplitude as a fraction of the maximum for the sample type (default: 0.25).
2: Use several samples to smooth the variations via the standard weighted mean over past samples.
イマイチ method
パラメータ 1
2
の違いが聞き分けられないが(耳が悪い?)ポイントは target
パラメータ。
デフォルトでは音が大きすぎて割れたりする場合、-af volnorm=1:0.01
のようにデフォルト値(0.25)より小さい値を指定し調整すること。
- その他使えそうなスイッチ
スイッチ | 意味 |
---|---|
--playlist-reverse | プレイリスト逆順再生 |
--playlist-random | プレイリストランダム再生 |
--playlist-start NUMBER | プレイリストの開始曲指定 |
--playlist-end NUMBER | プレイリストの終了曲指定 |
尚、youtube-dl
を使用する場合は以下のスイッチも指定した方が良い。
--ignore-errors
連続再生していてもエラーが発生すると終了してしまう。ツールの性質上、ネットワークエラー等の発生は珍しいことではないし致命的でもない。
「こまけぇこたぁいいんだよ」の精神で、エラーが発生しても無視して連続再生して欲しい場合は指定すること。(リトライもしてくれるみたいだし)
yt-dlp
ではこれがデフォルトになっているので指定する必要なし。逆にエラー発生時に中断して欲しい場合は --no-abort-on-error
を指定すること。
--no-cache-dir
youtube-dl
で以下のエラーが発生する場合がある。
ERROR: unable to download video data: HTTP Error 403: Forbidden
A: 287.7 (04:47.6) of 168.0 (02:47.9) 7.1%
Invalid return value 0 for stream protocol
Invalid return value 0 for stream protocol
A: 287.8 (04:47.7) of 168.0 (02:47.9) 7.1%
Exiting... (End of file)
ぐーぐる先生によればこれはキャッシュ破損が原因らしく、以下コマンドでキャッシュを初期化すると直る。
youtube-dl --rm-cache-dir
しかし毎度これでは面倒で、--no-cache-dir
スイッチ指定によりこの問題は発生しなくなる。
yt-dlp
では改良されているのかこのエラーは発生しない模様(AFAIK)。
Tips
- 最新化方法
これは YouTube に関連したツール、アドインの宿命だが、YouTube側の仕様が変更になると、ツールが動かなくなったりすることがある。
その場合は以下コマンドを実行する等し最新化すること。
yt-dlp -U
それでも動かない場合? 公式に報告を上げるか、自力で原因を調べてソースを直すしか。その為のオープンソースなんだし。
- URL 指定方法
公式の使用法の説明で
yt-dlp [OPTIONS] [--] URL [URL...]
とあるが、URL
はシングルクォーテーションかダブルクォーテーションで囲むこと。
そうしないと実行に失敗するばかりか、色々とおかしな動きになる。今回のような使用方法の場合に限った話かもしれないが。(おかしな動きに関しては説明が面倒なので詳細は略、興味がある方は試して欲しいが苦情は受け付けない)
- 設定ファイル
スイッチを色々と追加していくとコマンドの見通しが悪くなってしまう。スイッチは設定ファイルに格納すればすっきりする。設定ファイルは yt-dlp
が配置されているパスに yt-dlp.conf
で作成する。
$ cat /usr/local/bin/yt-dlp.conf
--no-continue
--quiet
--no-progress
--playlist-random
-f 140
-o -
上記のような設定ファイルを用意すれば実行コマンドは以下で済む。
yt-dlp 'YouTube動画URL' | mplayer -af volnorm -
逆に設定ファイルを無視したい場合は --ignore-config
スイッチを指定する。
yt-dlp --ignore-config 'YouTube動画URL' -o - | mplayer - -novideo
- YouTubeログインアカウントが必要な場合
自前で非公開のプレイリストを YouTube 上に作成しそれを利用する場合、-u <ユーザー名> -p <パスワード>
を引数で与える。
しかし機能しないケースがあり、その場合は以下参照。(yt-dlp
でも同様)
また、ブラウザが動く環境ならそっちからクッキー情報を引っ張ってくることもできるらしい。(未検証)
公式参照。
--cookies-from-browser BROWSER[+KEYRING][:PROFILE]
The name of the browser and (optionally)
the name/path of the profile to load
cookies from, separated by a ":". Currently
supported browsers are: brave, chrome,
chromium, edge, firefox, opera, safari,
vivaldi. By default, the most recently
accessed profile is used. The keyring used
for decrypting Chromium cookies on Linux
can be (optionally) specified after the
browser name separated by a "+". Currently
supported keyrings are: basictext,
gnomekeyring, kwallet
尚、youtube-dl
にはこのスイッチは無いので注意。(yt-dlp
の拡張機能)
というか通常コマンドライン環境にブラウザは入っていないと思うが。GUI 環境上のコマンドライン環境かな、使えるとしたら。
それとクッキーファイルを設定ファイルで指定する場合は、フルパス指定にしないと認識されないようなので注意。
$ cat /usr/local/bin/yt-dlp.conf
--cookies /usr/local/bin/youtube.com_cookies.txt
- テキストファイルの再生リスト
ローカルに一行一URL の再生リスト(テキストファイル)を用意し、-a
や --batch-file
スイッチで指定すれば連続再生できる。公式参照。
-a, --batch-file FILE File containing URLs to download ("-" for
stdin), one URL per line. Lines starting
with "#", ";" or "]" are considered as
comments and ignored
アカウントがなく YouTube上にプレイリストが作成できない場合に重宝するかな。
- ID指定再生
YouTube上の再生リストには、ユーザー作成の物や、運営により自動生成されたもの(ミックスリスト)がある。
YouTube(ユーチューブ)のミックスリストを分かりやすく解説
前者のプレイリストの ID のプレフィックスは PL
、後者は RD
。(他にもあるようだが)
少なくとも、プレフィックスが RD
の物は対応していないが、それ以外の物ならこの ID 指定だけで再生できる。(URL指定ではなく)
実行例は以下。
yt-dlp PLvlum7YWrP-WtAH0PS6_WfoWs0XALtNJ_ -f 140 -o - | mplayer -
とういか動画単体再生の場合でも ID 指定でいけるんだけど。
yt-dlp cjC5BzKlk-A -f 140 -o - | mplayer -
URL指定は冗長なので ID指定で済めばそれに越したことはないかな。
課題
本来、mplayer
は再生中にキーボード入力で操作できる。しかし、今回のような使用方法の場合、それが利かない。
例えば、ps aux | grep mplayer | grep -v grep
でプロセスID を調べ、echo "p" > /proc/<プロセスID>/fd/0
と無理矢理送り込んでも上手くいかない。
原理的に無理っぽい。
連続再生の垂れ流しを想定しているが、一時停止もできたら便利なんだけど。必要に応じて音量を下げるかミュートにするしかないかな。終了は Ctrl + c
で。
最後に
相変わらず騒々しい状況。
YouTube動画をダウンロードする「youtube-dl」のホスティング企業が世界3大レコード会社に訴えられる
YouTube動画ダウンローダーのリポジトリをGitHubが削除、音楽業界団体からの要請に基づき
これもまたこの手のツールの宿命というか便利過ぎるが故か。
とにかく多機能で驚かされるし、それに比例して公式の説明文章も膨大。正直読む気にならない、ピンポイントで音楽再生の方法だけ知りたいという方に本投稿が一助になれば幸い。