视频处理中的机器学习算法通常是在帧(图像)上工作,而不是在整个视频上。
在我的工作中,我使用ffmpeg将特定场景转换为一系列.png文件,对其进行某些处理(去噪、去模糊、上色、注释、修复等),将结果输出到相同数量的.png文件中,然后使用新帧更新原始视频。
这种方法适用于恒定帧速率(CFR)的视频。我将图片转换成这样(例如,在1:47开始的50帧序列):
ffmpeg -i input.mp4 -vf "select='gte(t,107)*lt(selected_n,50)'" -vsync passthrough '107+%06d.png'
在编辑完图像后,我用替换原始文件的方式进行操作(适用于12.5fps CFR视频):
ffmpeg -i input.mp4 -itsoffset 107 -framerate 25/2 -i '107+%06d.png' -filter_complex "[0]overlay=eof_action=pass" -vsync passthrough -c:a copy output.mp4
然而,我处理的许多视频都是可变帧率(VFR),这产生了一些挑战。
一个简单的解决方案是将VFR视频转换为CFR,无论如何ffmpeg都想这样做,但我想知道是否有可能避免这种情况。原因是CFR要么丢帧,由于机器学习视频处理的目的通常是改善输出,所以我想避免这种情况,要么重复帧 - 但是我正在使用的一个上采样算法使用前一个和下一个帧的数据 - 如果前一个或下一个帧是重复的,则没有数据进行上采样。
通过使用-vsync passthrough
,我希望可以简单地删除-framerate
选项,并保留原始帧,但是结果命令如下:
ffmpeg -i input.mp4 -itsoffset 107 -i '107+%06d.png' -filter_complex "[0]overlay=eof_action=pass" -vsync passthrough -c:a copy output.mp4
使用ffmpeg的默认帧率为25fps,且会丢失很多帧。有没有可靠的方法来替换VFR视频中的帧?