繁体   English   中英

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

[英]How can I replace only one data frame from stream without rewriting whole video file ? (FFmpeg)

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

如何仅更改一帧,然后以其他方式将其他帧刷新到输出,而无需循环av_read_framewrite_frame

如果您将视频中的帧视为一种链接的列表或数组,那么您提出的问题似乎是一个逻辑问题-我想您只是想替换阵列或列表中的一个元素而不必更改其他所有内容,我想呢?

问题在于视频流通常不像这样简单地安排。

例如,编码经常使用先前和甚至随后的帧作为当前帧的参考。 例如,每第10帧可能被完全编码,而其间的帧则被简单地编码为这些参考帧的增量。

同样,视频容器(例如mp4)经常使用偏移量来指向其中的各个元素。 因此,如果您潜入内部并通过用另一框架替换特定框架来更改其大小,则偏移将不再正确。

如果您对大型视频文件中的单个帧执行此操作,并且大致了解了帧的位置,那么您可能会发现,将视频文件分割成一个长段,然后再更改您想要的位,这样会更有效。包含要更改的框架的短部分,然后是长部分。 您可以仅在短部分中应用更改,然后在末尾连接视频。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM