MP4Box は使わずに ffmpeg だけで MPEG-DASH の MPDファイルを作る方法。また ffmpeg 3.4 からは libxml2 を有効にすることで MPDファイルを読み込むことも出来る。

関連記事
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

公式のガイドライン : Guidelines | DASH Industry Forum

基本コマンド

すべてのセグメントを MPD に記載してコピーする
ffmpeg -i input -c copy -window_size 0 output.mpd
1つの映像に1つ目はオリジナルをコピーし、2つめはアスペクト比固定で横解像度は2で割れて、縦解像度360pにリサイズして2つのストリームでリアルタイム -re で出力する。-map を2度使うことで2出力にしている
ffmpeg -re -i input -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -c:v:0 copy -c:a:0 copy -filter:v:1 "scale=-2:360" -profile:v:1 main -b:v:1 600k -c:v:1 libx264 -b:a:1 128k -c:a:1 aac -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" output.mpd

公式ドキュメント:FFmpeg Formats Documentation : dash(Muxers)

オプション

ffmpeg -h muxer=dash

  • adaptation_sets[string]
    セグメント毎にどのデータを納めるか。streams に 0 から始まる整数を入れるとチャンネルマップに記載されたデータが納まる。v なら映像のすべて、a なら音声のすべてが納まる。映像と音声は別id で納める
    例:id=0,streams=0,1,2 id=1,streams=3,4
    例:id=0,streams=v id=1,streams=a
  • window_size[int]
    マニフェストに記載されるセグメント数。0 はすべて
    範囲:0 から INT_MAX まで
    既定値:0
  • extra_window_size[int]
    マニフェストに記載されなかったセグメントをどれだけ削除せずに残すか
    範囲:0 から INT_MAX まで
    既定値:5
  • min_seg_duration[int]
    セグメントの最小時間(マイクロ秒)
    範囲:0 から INT_MAX まで。5000000 で5秒
    既定値:5e+006(5000000)
  • remove_at_exit[boolean]
    エンコードが終わったらすべてのセグメントを削除する
    既定値:0
  • use_template[boolean]
    Enable (1) or disable (0) use of SegmentTemplate instead of SegmentList.
    既定値:1
  • use_timeline[boolean]
    Enable (1) or disable (0) use of SegmentTimeline in SegmentTemplate.
    既定値:1
  • single_file[boolean]
    セグメントではなく1つのファイルで出力する
    既定値:0
  • single_file_name[string]
    DASH-templated name to be used for baseURL. Implies storing all segments in one file, accessed using byte ranges
  • init_seg_name[string]
    イニシャルファイルのファイル名の指定
    既定値:init-stream$RepresentationID$.m4s
    ファイル名は init-stream0.m4s のようになる
  • media_seg_name[string]
    セグメントファイルのファイル名の指定
    既定値:chunk-stream$RepresentationID$-$Number%05d$.m4s
    ファイル名は chunk-stream0-00001.m4s のようになる
  • method[string]
    ISO 規格の UTC タイムスタンプを UTCTiming schemeIdUri に記入する。無記入だと指定されない
  • method[string]
    指定した HTTP メソッドでセグメントを作る。これを使うには HTTP サーバがそのメソッドに対応していなければならない。PUT, POST が使える
    既定値:PUT
  • http_user_agent[string]
    HTTP ヘッダの User-Agent フィールドを優先させる
    既定値:なし
  • http_persistent[boolean]
    HTTP 接続を継続する
    既定値:0
  • hls_playlist[boolean]
    .mpd ファイル作成と同時に VERSION:7 の HLS用のマスターマニフェスト(master.m3u8)、各ストリームのマニフェスト(media_%d.m3u8)を同時に出力する
    既定値:0
  • streaming[boolean]
    ライブ配信モードの指定。指定すると各フレームが moof(Movie Fragment) になる
    既定値:0
  • timeout[duration]
    I/O ソケット処理のタイムアウトの指定
    既定値:-0.000001
  • index_correction[boolean]
    セグメントインデックスが正しいかどうかを調べる
    既定値:0

再生確認

Dash-Industry-Forum/dash.js を使うことで手軽に再生確認が出来る。

<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
    <title>MPEG DASH TEST</title>
    <style>
    video {
       width: 640px;
       height: 360px;
    }
</style>
  </head>
  <body>
    <div>
      <video data-dashjs-player autoplay src="output.mpd" controls></video>
    </div>
  </body>
</html>

Adaptive Bitrate Streaming

VP9 の Adaptive Bitrate(ABR) Streaming のコマンド例。複数の解像度とビットレートにエンコードする。
ffmpeg -i input -c:v libvpx-vp9 -vf scale=-2:90:force_original_aspect_ratio=decrease -b:v 250k -keyint_min 150 -g 150 -threads 1 -an -f webm -dash 1 video_90p_250k.webm
ffmpeg -i input -c:v libvpx-vp9 -vf scale=-2:180:force_original_aspect_ratio=decrease -b:v 500k -keyint_min 150 -g 150 -threads 1 -an -f webm -dash 1 video_180p_500k.webm
ffmpeg -i input -c:v libvpx-vp9 -vf scale=-2:360:force_original_aspect_ratio=decrease -b:v 750k -keyint_min 150 -g 150 -threads 2 -an -f webm -dash 1 video_360p_750k.webm
ffmpeg -i input -c:v libvpx-vp9 -vf scale=-2:360:force_original_aspect_ratio=decrease -b:v 1000k -keyint_min 150 -g 150 -threads 2 -an -f webm -dash 1 video_360p_1000k.webm
ffmpeg -i input -c:v libvpx-vp9 -vf scale=-2:720:force_original_aspect_ratio=decrease -b:v 1500k -keyint_min 150 -g 150 -threads 3 -an -f webm -dash 1 video_720p_1500k.webm

音声が1つの場合は一度だけエンコードする。
ffmpeg -i input -c:a libopus -b:a 128k -vn -f webm -dash 1 audio_128k.webm
エンコードされたファイルをまとめて MPD ファイルを作る。
ffmpeg -f webm_dash_manifest -i video_90p_250k.webm -f webm_dash_manifest -i video_180p_500k.webm -f webm_dash_manifest -i video_360p_750k.webm -f webm_dash_manifest -i video_360p_1000k.webm -f webm_dash_manifest -i video_720p_1500k.webm -f webm_dash_manifest -i audio_128k.webm -c copy -map 0 -map 1 -map 2 -map 3 -map 4 -map 5 -f webm_dash_manifest -adaptation_sets "id=0,streams=0,1,2,3,4 id=1,streams=5" manifest.mpd

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)