
ライブ MPEG-TS ストリームに接続し、それを ffmpeg に送り、MPEG-DASH に変換するプログラムがあります。
入力 TS には 3 つのオーディオ PID があります。(正確なオーディオ PID はプログラム ID とストリーム ソースによって異なるため、コマンド ラインにハードコードすることはできません)。例:
0x67 Spanish Dubbed Audio "spa/Main Audio"
0x68 Original Audio "qaa/Main Audio"
0x69 Descriptive Audio for visually impaired
Web ブラウザで を使用するプレーヤーdash.js
には、選択するオーディオ トラックを選択するメニューがあります。
ただし、MPEG-TS ストリームへの接続がいつ行われるかに応じて、ffmpeg はオーディオを異なる、一見ランダムな順序で列挙します。オーディオ トラックは、出力で「入力ストリーム」インデックスの昇順に割り当てられるようです。例:
Output Stream mapping:
Stream #0:18 (mpeg2video) -> scale (graph 0)
scale (graph 0) -> Stream #0:0 (libx264)
Stream #0:9 -> #0:1 (mp2 (native) -> aac (native))
Stream #0:13 -> #0:2 (mp2 (native) -> aac (native))
Stream #0:17 -> #0:3 (mp2 (native) -> aac (native))
入力をスキャンした後に割り当てられ、spa/spa/qaaが割り当てられます。
Stream #0:9[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:13[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
Stream #0:17[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
さらに数回実行すると、入力検出は常に異なります。
Stream #0:8[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
Stream #0:15[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:17[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:10[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:17[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:22[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
ffmpeg
入力から出力への一貫したマッピングを作成するにはどうすればよいでしょうか? 理想的には、増分 PID 番号を使用します。
編集I
私の質問にはあまり関係ないと思いますが、興味のある人のために、ここにコマンド ラインを示します... ffmpeg
パイプから読み取ります。パイプは、フィードを受信する私のプログラムによって書き込まれます。
ffmpeg -re -f mpegts -i pipe:10 -ignore_unknown \
-map 0:p:510 -map -0:s -map -0:d \
-filter_complex [p:510:v]scale=640:-1 -r 25 -force_key_frames expr:gte(t,n_forced*1) \
-c:v libx264 -b:v 1M -x264-params scenecut=0 -threads 2 \
-c:a aac -b:a 64k -ac 2 \
-f dash -dash_segment_type mp4 -movflags +delay_moov \
-seg_duration 2.000000 -frag_type duration -frag_duration 0.200000 \
-index_correction 1 -target_latency 5 -window_size 10 -extra_window_size 5 \
-remove_at_exit 1 -streaming 1 -ldash 1 -use_template 1 -use_timeline 0 \
-write_prft 1 -avioflags direct -fflags +nobuffer+flush_packets \
-format_options movflags=+cmaf -utc_timing_url \
/web/be/time.php /var/ott/session_9733/master.mpd'
答え1
MPEG-TS はトランスポート ストリーム、つまりフロー ストリームであるため、ストリームの順序はデマルチプレクサが PES パケットに遭遇する順序によって設定されます。これは変更できません。
できることは、現在のポジティブマップ-map 0:p:510
を-map 0:p:510:v -map 0:p:510:a:m:language:qaa -map 0:p:510:a:m:language:spa
使用できる MPTS フィードがないため、現時点では構文を検証できません。
答え2
Gyanの回答によると、ffmpeg
ストリームは見える範囲で列挙されます。したがって、MPTS(マルチプログラムトランスポートストリーム)では、ストリームを簡単に選択する方法はありません。そしてストリームの特定の順序を強制する(PID番号に基づく)
したがって、プログラムは最初に TS を個別にスキャンして、ビデオとオーディオの PID のリストを作成する必要があります。次に、それらの PID をループで使用してコマンドffmpeg
ラインを構築します。
構築されたコマンド ラインは次のとおりです。
ffmpeg -re -loglevel verbose \
-f mpegts -i inputFile.ts -ignore_unknown \
-map 0:v:i:101 \
-map 0:a:i:103 -metadata:s:a:0 title='Main' \
-map 0:a:i:104 -metadata:s:a:1 title='Main' \
-map 0:a:i:105 -metadata:s:a:2 title='Visual impaired commentary' \
-map -0:s -map -0:d \
-filter_complex [p:510:v]scale=640:-1 \
-r 25 -force_key_frames expr:gte\(t,n_forced*1\) \
-c:v libx264 -b:v 1M -x264-params scenecut=0 \
-threads 2 -c:a aac -b:a 64k -ac 2 \
-f dash -dash_segment_type mp4 -movflags +delay_moov -seg_duration 2.000000 \
-frag_type duration -frag_duration 0.200000 -index_correction 1 \
-target_latency 5 -window_size 10 -extra_window_size 5 -remove_at_exit 1 \
-streaming 1 -ldash 1 -use_template 1 -use_timeline 0 -write_prft 1 \
-avioflags direct -fflags +nobuffer+flush_packets -format_options movflags=+cmaf \
-utc_timing_url /time.php \
/tmp/master.mpd