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の消費もほぼなく、出力サイズは元のデータとほぼ同じです。

いつ使うべきか? 画質やファイルサイズを変更する必要がなく、単にTSをMP4に変換して保存したいとき。

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

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

解説: - 元の高ビットレートの動画をさらに圧縮したい場合に適しています。 - -c copy に比べて大幅に遅く、CPUによる再エンコード処理が必要です。

CRF 画質設定ガイド

CRF(Constant Rate Factor)は画質とファイルサイズのバランスを決定する最も重要なパラメーターです:

CRF 値 画質 ファイルサイズ 用途
18 ほぼ無劣化 大きい アーカイブ・保存用
20 非常に高画質 やや大きい 高品質保存
23 高画質(デフォルト) 標準 一般的なバランス
26 中画質 やや小さい モバイル向け
28 低画質 小さい 容量重視

ヒント: CRF を 1 下げるとファイルサイズは約 10〜15% 増加します。視覚的な差が分かるのは CRF 3〜4 の差からです。

プリセット速度の比較

-preset は圧縮効率とエンコード速度のトレードオフを制御します:

プリセット エンコード速度 圧縮効率 推奨シーン
ultrafast 最速 低い テスト・プレビュー用
fast 速い やや低い 日常的な変換
medium 標準 標準 一般推奨
slow 遅い 高い 最終出力用
veryslow 非常に遅い 最高 アーカイブ用(時間に余裕がある場合)

方法その3:GPU アクセラレーション(NVIDIA NVENC)

NVIDIA GPU を搭載しているPCであれば、NVENC ハードウェアエンコーダーを使って変換速度を大幅に向上させることができます:

# NVIDIA GPU で H.264 エンコード(CPU の 3〜5 倍速)
ffmpeg -i "https://stream.example.com/720p/index.m3u8" \
       -c:v h264_nvenc -preset p4 -cq 23 \
       -c:a aac -b:a 128k \
       -movflags +faststart \
       output.mp4
# NVIDIA GPU で H.265/HEVC エンコード(ファイルサイズ 30〜40% 削減)
ffmpeg -i "https://stream.example.com/720p/index.m3u8" \
       -c:v hevc_nvenc -preset p4 -cq 25 \
       -c:a aac -b:a 128k \
       -movflags +faststart \
       output.mp4
GPU エンコーダー 対応 GPU FFmpeg パラメーター
NVIDIA NVENC GeForce GTX 1050 以降 -c:v h264_nvenc
Intel Quick Sync Intel 第6世代 以降 -c:v h264_qsv
AMD AMF Radeon RX 400 以降 -c:v h264_amf

注意: GPU エンコードは速度重視であり、同じビットレートではCPU (libx264) の方が画質がわずかに優れます。ただし実用上の差はほとんど感じられません。

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

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

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

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

H.264 と H.265 (HEVC) の違い

変換時にコーデックを選択する場面がありますので、違いを理解しておきましょう:

比較項目 H.264 (AVC) H.265 (HEVC)
ファイルサイズ 基準 30〜40% 小さい
画質(同ビットレート) 良い より良い
エンコード速度 速い 遅い(約2〜3倍)
デバイス互換性 ほぼ全デバイス対応 2018年以降のデバイスが中心
推奨用途 互換性重視・配布用 保存用・容量節約

結論: 最大の互換性を求めるなら H.264、容量を節約したいなら H.265 を選択してください。

バッチ変換(複数ファイルの一括処理)

複数の M3U8 ストリームを一括で変換したい場合、シェルスクリプトを使って自動化できます:

#!/bin/bash
# urls.txt に M3U8 URL を1行ずつ記載
counter=1
while IFS= read -r url; do
    echo "ダウンロード中: $url"
    ffmpeg -i "$url" -c copy -movflags +faststart "output_${counter}.mp4"
    counter=$((counter + 1))
done < urls.txt
echo "全ての変換が完了しました"

変換ツールの比較

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

よくある質問と解決策

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

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

# 音声を AAC に変換(最も安定)
ffmpeg -i input.m3u8 -c:v copy -c:a aac -b:a 128k output.mp4

音声が完全に存在しない場合は、ffprobe でストリーム情報を確認してください:

ffprobe -i input.m3u8 -show_streams 2>&1 | grep codec_type

詳しくは 👉 M3U8変換後の無音問題を完全修復

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

音ズレが発生する場合は、通常TSセグメントのPTS/DTSタイムスタンプにジャンプがあることが原因です。以下の方法で修復できます:

# タイムスタンプを再生成して修復
ffmpeg -fflags +genpts -i input.m3u8 -c copy output.mp4

それでも解決しない場合は、音声のみ再エンコードしてみてください:

ffmpeg -fflags +genpts -i input.m3u8 \
       -c:v copy -c:a aac -b:a 128k \
       -async 1 output.mp4

変換が途中で止まる・フリーズする?

  • ネットワークの問題: -reconnect 1 -reconnect_streamed 1 を追加する
  • メモリ不足(ブラウザツール): 動画を短いセクションに分けてダウンロードする
  • 暗号化ストリーム: #EXT-X-KEY があるか確認し、FFmpeg に適切なヘッダーを渡す

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

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

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

MP4 ではなく MKV で出力したい場合は?

MKV (Matroska) コンテナは MP4 より多くのコーデックと字幕フォーマットに対応しています。出力ファイル名の拡張子を変えるだけです:

ffmpeg -i input.m3u8 -c copy output.mkv

関連リソース

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

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