FFMpeg将AVI转换为MP4 - 音频/视频不同步

时间:2011-03-06 19:16:50

标签: video encoding audio ffmpeg mencoder

我有一个应用程序,允许用户从他们的网络摄像头录制视频。用户记录3个剪辑,然后将其合并为一个视频进行播放。

转换为MP4后,第三个剪辑上的音频和视频有时会出现问题。

以下是该过程的工作原理 -

使用Mencoder结合AVI视频文件并插入过渡视频,以组合avi文件。

mencoder.exe -oac copy -ovc copy -idx -o test.avi c:\temp\*.avi 

我收到此错误:

Muxer frame buffer cannot allocate memory!

1 duplicate frame(s)! 
1 duplicate frame(s)! 
1 duplicate frame(s)!
1 duplicate frame(s)! 
1 duplicate frame(s)! 
1 duplicate frame(s)!

然而,视频被合并到avi,这个AVI播放时没有任何音频同步问题。

使用mencoder重新编码

mencoder.exe -idx TEST.AVI 

此时视频仍然可以播放为AVI。

使用ffmpeg批处理文件将AVI转换为MP4:

set FFMPEG_DATADIR=c:\Presets
ffmpeg.exe -i "test.avi" -s 640x480 -y -strict experimental -acodec aac \
   -ab 128k -ac 2 -ar 48000 -vcodec libx264 -vpre medium -vpre ipod640 -r 24 \
   -g 48 -b 520000 -threads 64 "out.mp4"

这一切都必须使用Windows中的命令行工具以编程方式(没有视频编辑GUI软件)完成。

以下是avi和mp4文件示例。音频/视频同步发生在1:03标记附近。 AVI没有失去同步,而mp4则不同步。

http://trtemp.s3.amazonaws.com/new.avi

http://trtemp.s3.amazonaws.com/new.mp4

有没有人有任何建议来解决这个问题?

2 个答案:

答案 0 :(得分:3)

有几件事:

  • 我发现源复合音频同步并不完美。看到原来的三个源片段会很有趣。一般规则是始终以最高质量的来源开始。
  • 我们可以假设源三个片段也有48kHz 16位立体声音频吗?如果有转换,那么这可能是一个问题。
  • FFmpeg的内部aac编解码器是实验性的,这就是你必须进行-strict experimental切换的原因。由于您遇到音频同步问题,因此这是一个明显的候选问题区域。如果可用,请考虑使用libfaac。 (您可能必须构建自己的FFmpeg编译。)
  • 无论您拥有多少核心,使用-threads 64都不会让它变得更快。遵循普遍接受的#cores * 3/2惯例。因此,如果您有4个核心,则桅杆为4 * 3 / 2 = 6。我自己使用-threads进行的实验表明,每个线程超过4-6的回报率会逐渐下降,而在12-16个线程中,这些线程会将其归零( no 无论如何有益)。充其量,64个线程不会产生任何影响。在最坏的情况下,它会更慢或降低结果的质量。
  • 试用-copyts选项。 “将时间戳从输入复制到输出。”
  • 试用-async开关。
  

音频同步方法。   “拉伸/挤压”音频流   匹配时间戳,参数   是每秒的最大样本数   哪个音频被改变了。 -async 1   是一个特殊情况,只有开始   音频流的纠正   没有任何纠正。

答案 1 :(得分:0)

我在使用 avi 或 dv 时遇到了类似的音频同步问题 --> 在 linux 下使用 mencoder 的 mp4。 简单的解决方案是先提取音频,然后将 avi 转换为 mp4,最后一步将两个轨道混合在一起。可以像这样使用 shellscript avi2mp4.sh 来完成:

#!/bin/bash
# convert avi files to mp4 with correct sync of video and audio.
# usage: avi2mp4 <sourcefile> <targetfile>
audiopart=$2.audiotmp.mp3
videopart=$2.videotmp.mp4
mencoder -of rawaudio -oac lavc -lavcopts acodec=mp2:abitrate=128 -ovc copy -o $audiopart $1 
mencoder  -oac mp3lame -ovc x264 -vf yadif=0:harddup -o $videopart  $1 
mencoder -oac copy -ovc copy -audiofile $audiofile -o $2 $videopart
rm $audiopart
rm $videopart