如何使用 FFMPEG 连接多个 MP4 视频而不出现音频同步问题?

问题描述 投票:0回答:2

我一直在尝试使用此处记录的 FFMPEG concat 协议来连接多个 MP4 剪辑(h264、aac)。剪辑连接成功,但日志中存在多个错误,包括:

  • 输出流中非单调的DTS
  • 过去的持续时间太大

此外,随着添加更多剪辑,音频和视频似乎略有不同步 - 尽管在某些播放器(Quicktime 和 Chrome HTML5)上更明显。

这是我正在使用的代码,任何提示将不胜感激!

将每个视频转换为临时文件

ffmpeg -y -i <input file> -vcodec libx264 -acodec aac -f mpegts -bsf:v h264_mp4toannexb -mpegts_copyts 1 <temp file>

连接临时文件

ffmpeg -i concat <input1|input2 ...> -map 0 -vcodec copy -aprofile aac_low -acodec aac -strict experimental -cutoff 15000 -vbsf aac_adtstoasc -b:a 32k <output file>

audio video ffmpeg
2个回答
0
投票

由于您要对音频和视频进行编码,因此只需使用 concat demuxer:

创建一个包含要加入的文件列表的文本文件

file 'input1'
file 'input2'
file 'input3'
...

然后运行

ffmpeg -f concat -i textfile -map 0 \
-vcodec libx264 \
-aprofile aac_low -acodec aac -strict experimental -cutoff 15000 -b:a 32k <output file>

0
投票

-尝试

-filter_complex
重置 pts 并避免创建 mpeg 文件,根据我的经验,这会破坏任何同步。

示例:

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]trim=start=770:end=1843.6,scale=768x432,setsar=1/1,setdar=16/9,setpts=PTS-STARTPTS[v0];[0:a]atrim=start=770:end=1843.6,asetpts=PTS-STARTPTS[a0];[1:v]trim=start=58:end=1795.5,scale=768x432,setsar=1/1,setdar=16/9,setpts=PTS-STARTPTS[v1];[1:a]atrim=start=58:end=1795.5,asetpts=PTS-STARTPTS[a1];[v0][a0][v1][a1]concat=n=2:v=1:a=1[outv][outa]" -map [outv] -map [outa] -map_chapters -1 -map_metadata -1 -c:v libx265 -c:a libmp3lame -q:a 8 -ar 44100 -r 24 11.mp4

其中

start
end
(以秒为单位)对应于文件编码的开始和结束时间(而不是持续时间)

如果您有很多文件,请阅读我的答案

© www.soinside.com 2019 - 2024. All rights reserved.