FFmpegを使用して 複数のオーディオレンディション を含むHLSプレイリストを作成しようとしていますが、オーディオトラックとビデオトラックを同期させることができません。シナリオは次のとおりです。
各ファイルの抽出されたオーディオトラック(.mp3としてトランスコードされます)
代替オーディオトラックがそれぞれ左と右のオーディオであるHLSプレイリストを作成したいと思います。
私が抱えている問題は、オーディオをビデオと正しく同期させることができないことです。私はいくつかの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
私はオーディオ/ビデオの専門家ではないので、私の推論には根本的な欠陥があると確信しているので、皆さんに助けと指導を求めています。特に:
ご覧のとおり、私はかなり迷っています。私はインターネットで広範囲に検索し、WWDC 2012からのAppleの「EffectiveHLS」トークを見ましたが、効果的なMultiple AudioRenditionプレイリストを作成する方法に関する情報はインターネット上で不足しているようです。
ポインタをありがとう。
私は自分で解決策を見つけました。
問題は、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