写给使用ffmeg朋友的一点经验。 之前给大家分享过一个使用ffmpeg脚本批量去重的思路,在使用过程中陆续踩了一些坑,今天来跟大家分享一个其中比较严重的问题。看这篇文章《分享一段去重处理的脚本》截取对应长度的画中画片断 shell_exec(“$ffmpeg -y -i overlay.mp4 -ss $start_m:$start_s -t $length -c copy ${file}_overlay.mp4”); 这步操作中,为了重复利用因为用来去重的视频时长很长(40分钟),所以使用了 copy 参数,这个参数的意思是只拷贝,不做编解码,所以它的速度非常快,但是在后续使用过程中发现这个参数会引发一个问题就是跳帧,导致合成后的视频会有几秒的尾部被截断。原因copy无法使用位流复制()剪切精确的帧,因为并非所有帧都经过帧内编码并且可以独立存在。 找到了问题所在,就来做对应的修改。在截取画中画视频的时候在原视频基础上多截取出20秒,在合成画中画视频的时候把overlay视频前10秒跳过,这样就可以保证合成后的视频是没有问题的。 //-10TB,overlay从第10秒开始截取,防止前几帧跳帧 shell_exec(“$ffmpeg -y \ -i $file -i ${file}_overlay.mp4 \ -filter_complex \” \ [0:v]setpts=PTS-STARTPTS[top]; \ [1:v]setpts=PTS-10/TB, \ scale=$width:$height, format=yuva420p,colorchannelmixer=aa=0.02[bottom]; \ [top][bottom]overlay=eof_action=endall\” \ -vcodec libx264 ${file}_out.mp4″); 完整代码更新在https://gist.github.com/stephenjtong/9992ee9767c625f1323efa43c8771681这段代码主要是分享一个思路,大家可以根据自己的需求来修改。比如加上片尾,加浮动水印等。还可以把作为串联ffmpeg命令的PHP改成python java等语言来实现多进程并行执行(如果你的机器性能足够强大)提高效率。 配合批量下载工具,完成机械的去重工作后再进行二次创作,事半功倍。
没有回复内容