web-dev-qa-db-ja.com

ffmpegダッシュマクサーを使用してマルチビットレートダッシュコンテンツを作成する方法

ffmpegdocumentation は、ダッシュマルチプレクサを使用して、次のような1つのコマンドだけでダッシュセグメントとマニフェストファイルを作成できることを示しています。

ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264
-b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline
-profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0
-b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1
-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a"
-f dash /path/to/out.mpd

HDビデオファイルがいくつかあり、DASHを通じてこのビデオをさまざまなビットレートで利用できるようにして、クライアントが現在のネットワーク状態に基づいて代替から自動的に選択できるようにします。上記のように、これらすべてを単一のffmpegコマンドで実行できますか?

私はffmpeg + mp4boxを使用した解決策があることを知っていますが、ffmpegのみで実行できるかどうか興味があります。

7
andrii

OK、これが私の問題を解決した方法です。次のコマンドは、疑似ライブダッシュコンテンツの実装に役立ちます(これは、既存のビデオファイルをライブビデオのようにストリーミングしたい場合です)が、オンデマンドビデオにも同じアプローチを使用できます。まず、入力ビデオファイル(sample.divx)を、ダッシュストリーミングビデオファイル(sample_dash.mp4)用に適切に準備された別のファイルに変換します。

ffmpeg -y -i sample.divx ^
  -c:v libx264 -x264opts "keyint=24:min-keyint=24:no-scenecut" -r 24 ^
  -c:a aac -b:a 128k ^
  -bf 1 -b_strategy 0 -sc_threshold 0 -pix_fmt yuv420p ^
  -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 ^
  -b:v:0 250k  -filter:v:0 "scale=-2:240" -profile:v:0 baseline ^
  -b:v:1 750k  -filter:v:1 "scale=-2:480" -profile:v:1 main ^
  -b:v:2 1500k -filter:v:2 "scale=-2:720" -profile:v:2 high ^
  sample_dash.mp4

Sample_dash.mp4は、ダッシュ形式に適した形式(H264/ACC)でエンコードされており、品質が異なる(ベースライン、メイン、高)複数のビデオストリームが含まれているため、十分に準備されていると言っています。 ffmpegダッシュマクサーは、これらの3つのビデオストリームを関連する代替ビデオ品質のデッシュセグメントファイルに変換します。方法は次のとおりです。

ffmpeg -y -re -i sample_dash.mp4 ^
  -map 0 ^
  -use_timeline 1 -use_template 1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" ^
  -f dash sample.mpd

-reフラグは、入力ビデオをリアルタイムで処理するようにffmpegに指示します。これは、疑似ライブストリーミングに役立ちます。

6
andrii

この answer および documentation の助けを借りて、単一のコマンドでこれを行う方法を次に示します。

ffmpeg -i $inputFile \
  -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0  \
  -b:v:0 350k  -c:v:0 libx264 -filter:v:0 "scale=320:-1"  \
  -b:v:1 1000k -c:v:1 libx264 -filter:v:1 "scale=640:-1"  \
  -b:v:2 3000k -c:v:2 libx264 -filter:v:2 "scale=1280:-1" \
  -b:v:3 245k  -c:v:3 libvpx-vp9 -filter:v:3 "scale=320:-1"  \
  -b:v:4 700k  -c:v:4 libvpx-vp9 -filter:v:4 "scale=640:-1"  \
  -b:v:5 2100k -c:v:5 libvpx-vp9 -filter:v:5 "scale=1280:-1"  \
  -use_timeline 1 -use_template 1 -window_size 6 -adaptation_sets "id=0,streams=v  id=1,streams=a" \
  -hls_playlist true -f dash output/output.mpd
3
Saurabh