1

我有一个应用程序可以让用户从他们的网络摄像头录制视频。用户录制 3 个剪辑,然后将它们组合成一个视频进行播放。

我在转换为 MP4 后有时会遇到第三个剪辑上的音频和视频不同步的问题。

这是该过程现在的工作方式-

合并 AVI 视频文件并在中间插入过渡视频,使用 Mencoder 合并 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

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

4

2 回答 2

3

有几件事:

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

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

于 2011-03-07T10:47:11.010 回答
0

我在 avi 或 dv 上遇到了类似的音频同步问题——> mp4 在 linux 下使用 mencoder。简单的解决方案是先提取音频,然后将 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

于 2021-02-02T20:29:41.303 回答