用于视频处理的机器学习算法通常适用于帧(图像)而不是视频。
在我的工作中,我使用 ffmpeg 将特定场景转储为一系列 .png 文件,以某种方式处理它们(去噪、去模糊、着色、注释、修复等),将结果输出到相同数量的 .png 文件中,然后用新帧更新原始视频。
这对于恒定帧速率 (CFR) 视频效果很好。我转储图像as so https://stackoverflow.com/a/40090033/1670156(例如,从 1:47 开始的 50 帧序列):
ffmpeg -i input.mp4 -vf "select='gte(t,107)*lt(selected_n,50)'" -vsync passthrough '107+%06d.png'
然后编辑图像后,我替换原始图像as so https://stackoverflow.com/a/50257384/1670156(对于 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 需要要么丢帧——因为 ML 视频处理的目的通常是为了提高输出,我想避免这种情况——要么重复帧——但我现在正在使用的升级算法使用数据的前一帧和下一帧 - 如果前一帧或下一帧是重复的,则...没有用于升级的数据。
With -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 https://video.stackexchange.com/a/13074,并且丢掉很多帧。有没有可靠的方法来替换 VFR 视频中的帧?