我正在尝试使用FFmpeg拆分不同的剪辑,将它们连接起来,然后重新编码连接的流。这是我想与2个输入片段一起使用的命令行(实际上,我想使用2个以上的片段,但是2个足以说明此问题)例如:
./ffmpeg -y -noautorotate -ss 4.9 -i in0.ts -noautorotate -i in1.ts \
-threads 0 -map_chapters -1 -write_tmcd 0 \
-metadata location= -max_muxing_queue_size 2000 -f mp4 \
-movflags faststart -filter_complex "[0:v:0]yadif=deint=interlaced,scale=1280:720:flags=bicubic,setdar=1.7777778[v0];[1:v:0]yadif=deint=interlaced,scale=1280:720:flags=bicubic,setdar=1.7777778[v1];[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[cat_v][cat_a]"
-map "[cat_a]" -acodec aac -ac 2 -ar 44100 -b:a 160k -async 1
-sn -map "[cat_v]" -vcodec libx264 -profile:v baseline -level 4 -b:v \
5400k -preset medium -x264opts ref=3:keyint=90 \
-r 30000/1001 -vsync 1 -metadata:s:v rotate= -pix_fmt yuv420p outputfile01.mp4
但是FFmpeg挂起并停留在第0帧。in0.ts
的最后一个关键帧为4s。如果将-ss 4.9
<= 4.0的-ss X
更改为X
,则没有问题。
我的FFmpeg版本是3.3。我知道此问题在FFmpeg 4.0.x及更高版本或FFmpeg 3.2.x中不存在,但在3.3.x和3.4.x中存在。有人可以帮助我确切地了解在3.3.x和3.4.x中引入了哪些错误来解决此问题吗?
答案 0 :(得分:0)
-ss
之前的 -i
依赖使用解复用器进行搜索。对于具有帧间编码视频流的文件,搜索目标将是关键帧。 MPEG-TS多路分配器中的回调查找功能返回指定点之后的第一个关键帧。
顺便说一句,我可以使用最新版本重现效果。为什么说在4.0或3.2中不会发生这种情况?
要获得预期的结果,可以使用修剪滤镜,
./ffmpeg -y -noautorotate -i in0.ts -noautorotate -i in1.ts -filter_complex "[0:v:0]yadif=deint=interlaced,trim=4.9,setpts=PTS-STARTPTS,scale=1280:720:flags=bicubic,setdar=1.7777778[v0];[1:v:0]yadif=deint=interlaced,scale=1280:720:flags=bicubic,setdar=1.7777778[v1];[0:a:0]atrim=4.9,asetpts=PTS-STARTPTS[a0];[v0][a0][v1][1:a:0]concat=n=2:v=1:a=1[cat_v][cat_a]" -sn -map "[cat_a]" -async 1 -ac 2 -ar 44100 -c:a aac -b:a 160k -map "[cat_v]" -r 30000/1001 -vsync 1 -pix_fmt yuv420p -c:v libx264 -threads 0 -profile:v baseline -level:v 4 -b:v 5400k -preset medium -x264opts ref=3:keyint=90 -map_chapters -1 -metadata location= -metadata:s:v rotate= -max_muxing_queue_size 2000 -f mp4 -write_tmcd 0 -movflags faststart outputfile01.mp4