YT-dlpでダウンロードした動画がiOSで再生できない!その解決法(FFMPEG不使用)

(2025.1.15 内容を修正しました。)

とある休日、PythonでYT-dlpで動画をダウンロードするコードを書いた。その時のフォーマットがこちら

bestvideo[ext=mp4]+bestaudio[ext=m4a]

そしてダウンロードした動画をiPhoneで再生してみると...

「MPEG4 動画」と表示されて再生できないではないか。私もしばらくこの沼に入りかけてしまったので、対処法を紹介する。

解決方法

そもそもiOSが対応している動画/音声のコーデックは限られている。例えば最新規格であるH.265(HEVC)やVP.9、AV1などには対応していない。しかしYT-DLPはこれらの新しい規格のコーデックを優先してダウンロードするため、これではiOSで見られなくなってしまう。

(ちなみにav01 > vp9.2 > vp9 > h265 > h264 > vp8 > h263 > theora > other > unknownらしい、このサイトより

修正後のフォーマットがこれ

bv[vcodec!~='^(vp0?9|av0?1|h265)']+bestaudio

なにやら^とか~みたいな記号があるけど何これ?と思った方は鋭い。
まずYTDLPのフォーマットは~=で正規表現を使うことができる。動画サイトによっては動画コーデックに表記ゆれがあり、「vp09」のサイトもあれば「vp9」のサイトもある。?はその手前の文字があるかないかわからないときに使う正規表現で、0がある場合とない場合に対応する。また、^(文字列)は文字列から始まるものすべてに該当する。こうすることで「vp9.aaa...」のようなコーデックに対応する。そして、!~=とすることでそれらを含まないフォーマットを正規表現を使って選択できる。詳しい話はこのサイトを参照。

これでやっと観れる...と誰もが思っていた(フラグ)

まさかの音声が再生されない....ああ、そうか音声のこともすっかり忘れていた。iOSが対応しているm4aを優先してダウンロードすればいい。

最終的なフォーマットはこちら:

bv[vcodec!~='^(vp0?9|av0?1)']+ba[ext='m4a']

FFMPEGで動画を再エンコードするという手もあるが、あまりにも非効率で時間がかかってしまう。この記事が誰かの役に立てることを願っている。

役立つ資料

YT-dlpのフォーマットの書き方
https://scrapbox.io/Mijinko/yt-dlp_--format

コメントを残す