M3U8からMP4への変換イメージ

なぜM3U8は「ファイルとして保存」ではなく「変換」が必要なのか?

M3U8ストリームを再生しているとき、ブラウザの裏側では実際には次々と .ts データパッケージを継続的にリクエストし、それらを即座にデコードして再生しています。これらのセグメントは:

  • フォーマットは MPEG-2 Transport Stream(.ts) です
  • サイズは通常、2秒〜10秒の動画です
  • 主要なメディアプレーヤーで直接再生することはできません(フォーマットが広くサポートされていません)

どのデバイスでも再生できる動画を取得するには、以下の手順が必要です:

  1. すべての .ts セグメントをダウンロードする
  2. それらを順番に結合する
  3. .mp4 コンテナとして再パッケージ化する(オプション:エンコーディングフォーマットを変換するための再エンコード)

M3U8の2層構造

ダウンロードを開始する前に、M3U8が2つの層で構成されている可能性があることを理解する必要があります:

マスタープレイリスト (Master Playlist)

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=854x480
480p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=700000,RESOLUTION=640x360
360p/index.m3u8

このファイル自体には動画セグメントは含まれておらず、異なる画質のメディアプレイリストへのパスがリストされているだけです。

メディアプレイリスト (Media Playlist)

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-VERSION:3
#EXTINF:6.006,
segment-001.ts
#EXTINF:6.006,
segment-002.ts
...
#EXT-X-ENDLIST

これこそが、実際の .ts セグメントのパスを含むリストです。

変換方法の詳細

方法その1:FFmpeg -c copy(直接再パッケージ化、最速)

ffmpeg -i "https://stream.example.com/720p/index.m3u8" \
       -c copy \
       -movflags +faststart \
       output.mp4

解説: - -c copy:再エンコードせず、TSのH.264 + AACデータを直接MP4コンテナに再パッケージ化します。 - -movflags +faststart:moov atomをファイルの先頭に移動し、MP4がダウンロードしながらの再生(ストリーミング)をサポートするようにします。 - 非常に高速で、CPUの消費もほぼなく、出力サイズは元のデータとほぼ同じです。

方法その2:FFmpeg で再エンコード(サイズを縮小)

ffmpeg -i "https://stream.example.com/720p/index.m3u8" \
       -c:v libx264 -crf 23 -preset medium \
       -c:a aac -b:a 128k \
       output.mp4

解説: - 元の高ビットレートの動画をさらに圧縮したい場合に適しています。 - CRF値が低いほど品質が高く、ファイルサイズは大きくなります(推奨は18〜28)。 - -c copy に比べて大幅に遅く、CPUによる再エンコード処理が必要です。

方法その3:ブラウザベースの FFmpeg.wasm(インストール不要)

当サイトの HLS 調査ツール は、ブラウザ内で FFmpeg.wasm を実行して結合を完了させます。これは、ブラウザ内で以下のコマンドを実行しているのと同じです:

ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4

適用シナリオ: ソフトウェアをインストールせず、一時的に公開リンクをいくつか結合したい場合。

変換ツールの比較

ツール インストール 速度 CORS 制限 対象ユーザー
FFmpeg 必要 ★★★★★ 回避可能 開発者・エンジニア
VLC 必要 ★★★ 回避可能 一般ユーザー
ツール(当サイト) 不要 ★★★ 制限あり 素早いテスト
変換サイト 不要 ★★ サポート多 非技術者

よくある質問

変換した動画から音が出ない?

これは通常、オーディオトラックが AC-3 (Dolby) 形式であり、一部のMP4プレーヤーでサポートされていないためです。解決策:

ffmpeg -i input.m3u8 -c:v copy -c:a aac output.mp4

音声を強制的にAACにトランスコードすることで解決できます。

動画の音と映像がズレる(音ズレ)?

音ズレが発生する場合は、通常TSセグメントのPTS/DTSタイムスタンプにジャンプがあることが原因です。-async 1 を追加するか、-fflags +genpts を使用してタイムスタンプを再生成します:

ffmpeg -fflags +genpts -i input.m3u8 -c copy output.mp4

M3U8が暗号化されている場合はどうすればいいですか?

M3U8内に #EXT-X-KEY:METHOD=AES-128,URI=... がある場合、セグメントが暗号化されていることを意味します。FFmpegはAES-128を自動的に処理できますが、DRM(WidevineやFairPlayなど)はハードウェアレベルの保護であり、現在処理できる公開ツールは存在しません。

暗号化の詳細は こちら👉 M3U8暗号化とDRMの完全解析

関連リソース

今すぐM3U8リンクをテストしますか?

🚀 M3U8 オンラインプレーヤーを試す