繁体   English   中英

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

[英]FFMpeg Convert AVI to MP4 - Audio / Video Out of Sync

我有一个应用程序,可以让用户从他们的网络摄像头录制视频。 用户录制 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

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

几件事:

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

音频同步方法。 “拉伸/挤压”音频流以匹配时间戳,该参数是每秒更改音频的最大样本数。 -async 1 是一种特殊情况,其中仅纠正音频流的开头,而没有任何后续纠正。

我有类似的音频同步问题与 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM