web-dev-qa-db-ja.com

FFmpegおよびHLSの複数のオーディオレンディション

FFmpegを使用して 複数のオーディオレンディション を含むHLSプレイリストを作成しようとしていますが、オーディオトラックとビデオトラックを同期させることができません。シナリオは次のとおりです。

  • 2つのビデオファイルがあり、それぞれに1つのオーディオトラックがあるとします。
  • FFmpegを使用して2つのビデオをパンし、1つのビデオを形成します。例:

enter image description here

  • 各ファイルの抽出されたオーディオトラック(.mp3としてトランスコードされます)

  • 代替オーディオトラックがそれぞれ左と右のオーディオであるHLSプレイリストを作成したいと思います。

enter image description here

私が抱えている問題は、オーディオをビデオと正しく同期させることができないことです。私はいくつかのffmpegコマンドを試しましたが、それぞれが異なるレベルでナイーブです。最良のシナリオは、デスクトップで同期されたストリームを取得することですが、モバイル(再生はデバイスのネイティブプレーヤーによって処理されます)では、他のビデオトラックに切り替えるとすぐに、ビデオはオーディオとの同期をすぐに失います。

ffmpeg 3.1.1を使用しています。

オーディオトラックをsegmenterマルチプレクサにマップし、ビデオをhlsにマップする、比較的単純なコマンドから始めて、私が試したコマンドの例:

ffmpeg -i dual.mp4 -i audio_left.mp3 -i audio_right.mp3 \
-threads 0 -muxdelay 0 -y \
-map 0 -pix_fmt yuv420p -vsync 1 -async 1 -vcodec libx264 -r 29.97 -g 60 -refs 3 -f hls -hls_time 10 -hls_list_size 0 video/index.m3u8 \
-map 1 -acodec aac -strict experimental -async 1 -ar 44100 -ab 96k -f segment -segment_time 10 -segment_list_size 0 -segment_list_flags -cache -segment_format aac -segment_list audio1/audio1.m3u8 audio1/audio1%d.aac \
-map 2 -acodec aac -strict experimental -async 1 -ar 44100 -ab 96k -f segment -segment_time 10 -segment_list_size 0 -segment_list_flags -cache -segment_format aac -segment_list audio2/audio2.m3u8 audio2/audio2%d.aac 

生のmpegtsコンテナを出力するなど、より複雑にするには、トラックをスライスします。

ffmpeg -i dual_short.mp4 -i audio_left_short.mp3 -i audio_right_short.mp3 \
-threads 0 -muxdelay 0 -y \
-map 0:v -map 1 -map 2 -codec copy -pix_fmt yuv420p -vsync 1 -async 1 -shortest -f mpegts pipe:1 | ffmpeg-3.1.1 -i pipe:0 \
-map 0:0 -vcodec copy -r 29.97 -g 60 -refs 3 -bsf:v h264_mp4toannexb -f hls -hls_time 10 -hls_list_size 0 video/index.m3u8 \
-map 0:1 -f ssegment -segment_time 10 -segment_list_size 0 -segment_format aac -segment_list audio1/audio1.m3u8 audio1/audio1_%d.aac \
-map 0:2 -f ssegment -segment_time 10 -segment_list_size 0 -segment_format aac -segment_list audio2/audio2.m3u8 audio2/audio2_%d.aac

私はオーディオ/ビデオの専門家ではないので、私の推論には根本的な欠陥があると確信しているので、皆さんに助けと指導を求めています。特に:

  • 私がここでやろうとしていることは実行不可能ですか?別の言い方をすれば、元のビデオと同期して記録されたN個のオーディオトラックを指定して、オーディオが常にリップシンクされたHLSプレイリストを作成することです
  • ビデオFPSとオーディオのビットレートはA/V同期の問題の原因ですか?相関関係さえありますか?
  • ビデオの品質のレベルの違い(ビットレートなど)は同期に影響しますか?
  • 選択したターゲットオーディオコンテナ(mp3とaac)は同期に影響しますか?
  • 複数の入力で単一のコマンドを使用するか、各ストリームで個別に作業する必要がありますか?

ご覧のとおり、私はかなり迷っています。私はインターネットで広範囲に検索し、WWDC 2012からのAppleの「EffectiveHLS」トークを見ましたが、効果的なMultiple AudioRenditionプレイリストを作成する方法に関する情報はインターネット上で不足しているようです。

ポインタをありがとう。

3

私は自分で解決策を見つけました。

問題は、segmentマルチプレクサがオーディオを正しくスライスできるようにするためにいくつかの参照フレームを調べる必要があるため、ストリームを個別にマッピングすることが機能しないことです。

うまくいくのは、すべてのオーディオファイルとビデオファイルを含む「beefy」.tsセグメントを作成し、それらを適切にスライスすることです。シンプルでありながら機能する例:

ffmpeg-3.1.1 -i dual_short.mp4 -i audio_left_short.mp3 -i audio_right_short.mp3 \
    -threads 0 -muxdelay 0 -y \
    -map 0:v -map 1 -map 2 -pix_fmt yuv420p -movflags +faststart -r 29.97 -g 60 -refs 1 \
    -vcodec libx264 -acodec aac -profile:v baseline -level 30 -ar 44100 -ab 64k -f mpegts out.ts

# Perform 3 passes:
# 1. Generate the video.
ffmpeg-3.1.1 -i out.ts -threads 0 -muxdelay 0 -y -map 0:v   -vcodec copy  -f hls -hls_time 10 -hls_list_size 0 video/index.m3u8
# Generate Audio 1
ffmpeg-3.1.1 -i out.ts -threads 0 -muxdelay 0 -y -map 0:a:0 -codec copy -f segment -segment_time 10 -segment_list_size 0 -segment_list audio1/audio1.m3u8 -segment_format mpegts audio1/audio1_%d.aac
# Generate Audio 1
ffmpeg-3.1.1 -i out.ts -threads 0 -muxdelay 0 -y -map 0:a:1 -codec copy -f segment -segment_time 10 -segment_list_size 0 -segment_list audio2/audio2.m3u8 -segment_format mpegts audio2/audio2_%d.aac
4