題 FFmpeg和HLS多個音頻再現


我正在嘗試使用FFmpeg來生成包含的HLS播放列表 多個音頻再現,但我不能讓音頻和視頻軌道同步。這是場景:

  • 假設我有2個視頻文件,每個文件有1個音軌
  • 我使用FFmpeg將2個視頻平移到一起形成一個視頻,例如:

enter image description here

  • 每個文件的提取音軌(轉碼為.mp3)

  • 我想製作一個HLS播放列表,其中有備用音軌 分別是左右音頻:

enter image description here

我遇到的問題是我無法正確地與視頻進行音頻同步。我嘗試了幾個ffmpeg命令,每個命令都處於不同的水平,最好的情況是我在桌面上獲得了同步流,但是在移動設備上(設備的本機播放器處理播放),一旦切換到另一個視頻軌道,視頻就會很快失去與音頻的同步。

我正在使用ffmpeg 3.1.1

我試過的一個示例命令,從一個相對簡單的命令開始,我將音軌映射到 segmenter muxer,和視頻到 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 vs aac)會影響同步嗎?
  • 我應該使用帶有多個輸入的單個命令,還是分別處理每個流?

你可以看到我很丟失。我在互聯網上進行了廣泛的搜索,觀看了來自WWDC 2012的Apple的“Effective HLS”演講,但有關的信息 如何製作有效的多音頻再現播放列表似乎是 在互聯網上稀缺。

謝謝你的任何指示。


3
2017-07-11 11:45


起源




答案:


我自己找到了解決方案。

問題是, segment muxer需要查看一些參考幀才能正確切片音頻,因此單獨映射流將不起作用。

什麼工作是產生一個“強壯”的.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
2017-07-27 14:42