m3u8ストリーミング動画をダウンロードしてmp4で保存する~ffpmegで試してHLSの仕組みが少し理解できた

プログラミング PC
プログラミング

某動画サイトをたまに視聴することがありますが、掲載(配信)期限があるので期限を意識しながら視聴しないといけないのがちょっと生活スタイルに合わなくて不便だと思いました。期限切れになると次の話に飛んでしまって続き物が視聴出来なくなります。一週間って短いですよね。

こっち(自分)のタイミングで視聴したいので、できれば保存しておいて後で時間のある時に観たいのです。時間がある時は連続で観たいですし。

少しリサーチをして動画のストリーミング配信の仕組みと、その動作についてある程度は理解できました。配信サイトによっては細工をして分かりにくくしていますが、m3u8ファイルのURLを突き止めたらffmpegでダウンロードすることができるということが分かりました。

私も時々しか保存しないので、時間が経過して忘れても使えるようにサンプル的にBATにまとめました。ffmpegでHLS配信動画を保存したい人の参考になれば幸いです。

HLS(HTTP Live Streaming)の保存

ストリーミング配信の.m3u8ファイルをテキストエディタで開いて眺めてみたり、それについて検索してリサーチしてみると、ストリーミング配信の仕組みの一つとして、HLS(HTTP Live Streaming)という方式で配信されており、細切れになった短い動画のアドレス情報をm3u8という形式のファイルにリストとしてまとめている様子が見て取れます。

そのm3u8ファイルに記載されたリストの内容を解析して順番に動画をダウンロードしながらプレーヤーで再生すると1本の続いた動画として視聴できます。その仕組みであれば細切れ動画を全てダウンロードして順番通りに連結すれば一つに繋がった保存が実現されるということが想像できます。

という事は、ffmpegのインプット側にm3u8ファイルを指定してやればダウンロード(保存)出来るのでは?と思ったので調べてみたらやっぱり出来そうです。試してみるとあっさりと成功しました。その過程を記しておきます。

ネット上にはダウンロードソフト(有償)を使う情報が多い

m3u8形式でHLS配信されている動画を保存する方法をネットで検索してみると、比較的安価なアプリを購入してダウンロードする方法を紹介しているのが多いです。少なからず有償アプリを購入させたいという意図が読めます。しかし動画の保存自体がちょっとグレーな行為であることからこれらは中華製アプリであろうことが想像できます。国が違うとこういうところの常識も変わってくるので、大っぴらに販売出来る神経が驚きだなという気もします。

次に多いのはChromeブラウザに機能拡張を追加して行う方法の様です。どうやらこれらの目的は、配信サイトを解析してm3u8ファイルを見つけ出すところも自動化しようとしている様です。(実際に試してないけどそういう動きをするらしい)

私の場合はそういうアプリを購入するのではなく、フリーのffmpegを使って、ピンポイントにm3u8ファイルを指定して無用な波風を立てずに目的を達成して、視聴し終わったらしれっと削除してしまおうという考えでいます。保存しておいて後日に視聴はしたいけど著作権侵害はしたくありませんのでね。

ffmpegでm3u8情報からmp4動画への保存を試してみる

ffmpegはオープンソースで開発されているフリーウェアで、柔軟な機能と強力な性能とを有するスグレモノなプログラムです。動画の変換ができることでとても有名だし色々なアプリの映像処理エンジンに使われています。

とりあえずテスト的にやってみました。

まずffmpegを公式からダウンロードしてきます。ダウンロードしたffmpegは圧縮されているので解凍して任意のフォルダに保存します。私はこういう類のものはc:\worksフォルダに入れることにしているので、ffmpegは解凍してffmpegのバージョンも含めたフォルダ名そのまま保存しました。本体であるffmpeg.exeはbinフォルダの中にあります。

私の場合は、c:\works\ffmpeg-xxyyzz\binという感じのバージョンを含むフォルダ名のまま使用するのでPATHを通しません。PATHを通さない理由はたまにしか使わないのでその都度最新版を使うからいちいち環境変数をいじってPATHを通すのも手間です。PATHを通してなくてもPATHを意識していれば問題ないと思っています。

カレントディレクトリをbinフォルダにした状態でコマンドプロンプトを実行します。

以前のWindowsエクスプローラではSHIFTキーを押しながらフォルダ内で右クリックすればコマンドプロンプトのカレントディレクトリが自動的に指定されましたが、最近はPowerShellが出しゃばって使いにくくなりました。裏技的にエクスプローラーのアドレスバーにcmdと入力してENTERを押すと同様にカレントディレクトリでコマンドプロンプトを開くことが出来ます。

ffmpegでHLSをダウンロード保存(1)

ffmpeg.exe -i "https://xxxxx.xyz/stream/1234567xyz.m3u8" -c copy download.mp4Code language: JavaScript (javascript)

実行してみると、一瞬上手くダウンロードが始まったと思いきや、Access Denyで拒否られました。英文なので私には詳細ニュアンスまで正確には読み取れませんが、恐らくUser-Agentがチェックされて拒否られてるっぽいです。

配信サイトによってはUser-Agentチェックしてなかったりするので、これだけで動作すればラッキーです。今回の場合はもうひと手間加える必要がありそうです。

ffmpegでHLSをダウンロード保存(2)

ならば、ffmpegの-user_agentを明示的に指定することにしてみます。自分が使っているWebブラウザーのUser-Agentは下記にアクセスすると簡単に調べてくれます。

User-Agentの情報をコマンドラインに追加して再チャレンジします。

コマンドオプションでUser-Agentを指定するので非常に長ったらしくなります。メモ帳などで整形しておいてからコピペで実行すると毎回入力する手間を省けて修正したりするのに便利です。

ffmpeg.exe -user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0" -i "https://xxxxx.xyz/stream/1234567xyz.m3u8" -c copy download.mp4Code language: JavaScript (javascript)

これでAccess Denyを回避することが出来て、ffmpegが処理を続ける様になりました。細切れになった沢山のファイルを一つずつダウンロードしながら保存するのでしばらく時間がかかります。

動作的には、ffmpegが細切れになっている短い動画をつなぎ合わせて、「-c copy download.mp4」で指定した「download.mp4」を生成してくれます。ダウンロードが完了すると「download.mp4」は無事にメディアプレーヤーで再生できました。とりあえず目的のファイルを保存出来たので後日視聴して、観終わったら削除という感じにします。

Windows BATファイルに整理しておく

せっかく調べて学習した手順ですが、次回はいつ使うか分からないので、次回に備えてBATファイルにまとめて整理しておくことにします。

基本的に固定的な情報(ffmpeg.exeのPATHやUser-Agent)は変数で定義しておけば触る必要がありません。またm3u8ファイルがあるURLは目的とする動画によってその都度修正しなくてはなりませんので、変数で定義しておくと分かりやすくて編集しやすいです。

変数定義の部分は手作業でBATファイルを触る必要がありますが、別に難しいことをやってる訳ではないので整理しておくのが良さそうです。時間が経つと忘れるので自分の理解出来る範囲でBAT化しておきました。

@echo off

REM 環境設定
set ffmpeg_path=C:\Work\ffmpeg-2024-02-15-git-a2cfd6062c-full_build\bin
set user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0"

REM 動画ファイルURL等指定
set hlsUrl="https://xxxxx.xyz/stream/1234567xyz.m3u8"
set output=1234567xyz.mp4

REM カレントディレクトリの指定(保存先)
D:

REM ffmpeg実行コマンド
%ffmpeg_path%\ffmpeg.exe -user_agent %user-agent% -i %hlsUrl% -c copy %output%

参考メモ

動画配信サイトによっては、m3u8ファイルのURLを難読化している様です。今回学習するために複数のストリーミング配信サイトを訪れHLSの仕組みを調べて気付いたのですが、サイトによってはm3u8のURLがBase64でエンコードされているサイトもありました。もっとわかりにくいのはJavascriptsで生成させているサイトもありました。

Base64でエンコードされている場合はデコードしてURLを読める状態にしてやる必要がありましたが、Base64デコードはこちらのサイトでサクッとできました。

コレらの手法以外にもサイトによって色々細工をしている様ですが、基本的なHLSの仕組みは同じっぽいので、ffmpegが対応出来る形にしてやってコマンド指定すればダウンロードできちゃうみたいです。ffmpegって色々な事が出来て凄いですね。これが無料のソフトウェアだなんて信じられないです。

おそらく有料のソフトやWebブラウザーのアドインは、主要な動画配信サイトの構造を解析してm3u8ファイルを見つけ出すところまでやってくれるんだろうと思います。私の場合は一応HTML、Javascriptを多少は読めるので自動解析の仕組みまでは不要かなと思っています。

有償アプリの購入

そんな面倒くさいことは嫌だという人は、頭の良い人が解析機能まで実装してくれている有償版アプリを使うことになりそうです。選択する際の要点としては配信サイト側が仕組みを変更した時にアプリのバージョンアップで解析機能を追従してくれるかどうかです。継続的にサポートが期待できるアプリを選ぶのがポイントですね。

最後に

ダウンロードしたファイルについてですが、もちろんHLSをダウンロードして保存することは著作権的に微妙なので、自分で視聴し終わったら削除するという感じであくまでも個人的な利用に留めることにします。もうちょっと配信期間を長くしてくれたらこんな手間をかける必要は無いんですけどね。

これで何話にも分かれている動画の場合、保存しておいて時間のある時に一気に視聴することも可能になりました。個人的な好みでは一気に視聴したいタイプです。

私はffmpegでダウンロード(保存)する方法を選びましたが、ブラウザに機能拡張を入れて実現する方法もある様ですから、そちらの方が手軽だと推測します。(m3u8ファイルのURLを探し出してくれるのでお手軽)

なお、ffmpegはmp4などの動画ファイルをm3u8情報にする(HLSストリームの作成)機能もあるとわかりました。入力側にmp4ファイルを指定して、出力側に作成するm3u8ファイルを指定し、ストリーム分割のパラメータを指定する感じです。生成されたファイルを配信サーバーに配置してやればm3u8ファイルのURLを視聴者に知らせてストリーミング配信できるという仕組みです。今は使用する機会もありませんし検索で少し調べればパラメータの指定方法等は見つかるので覚書程度にしておきます。

HLSを使うと、httpによるWebサーバーから動画を配信できる手軽さは魅力ですね。

コメント

  1. ffmpegでM3U8動画をダウンロードできました!
    ありがとうございました。

Comment spam is annoying.

There has been an increase in comment spam, but we decline it. It’s pointless because we use Akismet to block spam comments. Spam comments will not be posted.

コメントスパムが増えていますがお断りします。akismetでスパムコメントを弾いているので無意味です。スパムコメントは掲載されません。

ブロックしたスパム

DMM広告

タイトルとURLをコピーしました