如何在不重写整个视频文件的情况下仅替换流中的一个数据框架?(ffmpeg)



我创建了两个流:用于输入视频文件和输出。但是,即使我只想更改一个(第一个(视频框架,我也必须在循环中使用av_read_framewrite_frame,以将它们从一个文件放置到另一个文件。

我如何仅更改一个帧,然后以某种方式将其他帧冲洗到无循环av_read_framewrite_frame

的情况下将其他帧冲洗到输出

您所问的是一个合乎逻辑的问题,如果您将视频中的帧视为一种链接列表或数组 - 您只想在没有数组或列表中替换一个元素,而无需替换一个元素我认为必须改变其他一切?

问题是视频流通常不像此那样简单。

例如,编码通常使用以前甚至跟随框架作为当前帧的参考。例如,每个第10帧都可以完全编码,并且两者之间的框架简单地编码为这些参考帧。

另外,视频容器,例如MP4通常使用偏移指向其中的各种元素。因此,如果您在内部潜水并通过将特定框架替换为另一个框架的大小,那么偏移将不再正确。

如果您要在一个大型视频文件中为一个帧进行此操作,并且您大致知道框架在哪里,那么您可能会发现将视频文件分为漫长的部分,然后在您想要的位之前将更改,一个简短的部分,包含您要更改的框架,然后进行漫长的部分。您可以将更改仅在简短的部分应用,然后在末尾加入视频。

如果您这样做,则必须使用适当的实用程序来拆分和连接视频,其原因与上述相同 - 即确保拆分视频具有正确的标题信息,偏移等。

ffmpeg支持这些类型的函数 - 例如,您可以在此处查看串联文档:

  • https://trac.ffmpeg.org/wiki/concatenate

最新更新