Linux
shell
RaspberryPi
YouTube
yt-dlp
0
どのような問題がありますか?

投稿日

更新日

コマンドラインから YouTube の音楽を連続再生したい

序文 「そんなコマンドで大丈夫か?」

ぐぐるとよく出てくるのが以下のコマンド例。

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-dlpwget を使用するなら以下。

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側の仕事なので引数で与えている。意味は以下参照。

mplayer(1) - Linux man page

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).
2: Use several samples to smooth the variations via the standard weighted mean over past samples.


Sets the target amplitude as a fraction of the maximum for the sample type (default: 0.25).

イマイチ 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 でも同様)

【youtube-dl】cookieを使ってログインする

また、ブラウザが動く環境ならそっちからクッキー情報を引っ張ってくることもできるらしい。(未検証)
公式参照。

--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が削除、音楽業界団体からの要請に基づき

これもまたこの手のツールの宿命というか便利過ぎるが故か。
とにかく多機能で驚かされるし、それに比例して公式の説明文章も膨大。正直読む気にならない、ピンポイントで音楽再生の方法だけ知りたいという方に本投稿が一助になれば幸い。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
god19
勘弁してください。上司から言われたんです。

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
データに関する記事を書こう!
~
0
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー