我有一个应用程序,允许用户从他们的网络摄像头录制视频。用户记录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
有没有人有任何建议来解决这个问题?
答案 0 :(得分:3)
有几件事:
-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