删除视频的某些部分并重新制作关键帧(c++ + libav)

时间:2021-07-06 07:17:10

标签: c ffmpeg libav libavcodec libavformat

我正在尝试使用 libav 在我的应用程序中删除视频的某些部分,例如在长度为 00:08:00 的视频中,我尝试删除帧 100-250 和 400-500(例如) . 我写了这段代码,复制 AVPacket 并丢弃一些数据包,但是有一个问题!在我们的视频中,每个关键帧后跟 29 个非关键帧。因此,当我的代码丢弃第 100-250 帧时,第 100 帧可能是非关键帧,在这种情况下,将要加入的部分(在此示例中,第 250 帧到第 400 帧)第 400 帧位于不属于的关键帧。

本节视频帧显示乱码,

视频切割速度在我的代码中非常重要,所以我无法解码/重新编码所有视频帧。

问题是,如何解码每个部分的编码开始(从开始帧到第一个关键帧)并在不解码的情况下复制另一帧?

或者,是否有其他FAST解决方案用于拆分/合并(删除视频的某些部分)?

2 个答案:

答案 0 :(得分:0)

The question is that, How can I decode encode begin of each parts (from  begin frame to first key frame) and make another frames copy without decode?

你不能。那样不行。

答案 1 :(得分:0)

开始考虑时间,而不是帧

例如,您可以在 base_video.mp4 的部分中快速获取新视频,

ffmpeg -ss 00:00:00.000 -i base_video.mp4 -t 8.000 -c copy -strict -2 new_video_8seconds_fromstart.mp4
<块引用>

-ss 00:00:00.000 是开始新视频的时间

-t 是以秒和毫秒为单位的持续时间,例如,对于 8 秒的持续时间,您必须使用 8.000

-an 如果您不想要音频

-strict -2 如果要复制一些文件编解码器,如 DTS

但是如果你想重新编码删除 -c copy 但它永远不会很快!

ffmpeg -ss 00:00:00.000 -i base_video.mp4 -t 8.000 new_video_8seconds_fromstart.mp4