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

Posted

技术标签:

【中文标题】删除视频的某些部分并重新制作关键帧(c++ + libav)【英文标题】:Drop some parts of video and re-make key frames (c++ + libav) 【发布时间】:2021-09-16 19:47:00 【问题描述】:

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

本节视频帧显示为乱码,

视频剪辑速度在我的代码中非常重要,因此我无法解码/重新编码所有视频帧。

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

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

【问题讨论】:

您是不是要使用c++ 而不是c? 目前我正在使用c,但语言并不重要。任何语言的每一个解决方案都更受欢迎。 您使用什么(容器)格式和编解码器?你可以选择吗?如果可以,那么仅使用帧内和/或调整 GOP 长度可能会有所帮助。 AVPacket.flags & AV_PKT_FLAG_KEY 告诉你一个数据包包含一个关键帧,但我怀疑它会这么简单。还要注意 forward 引用(B 帧)。考虑封闭的共和党。 【参考方案1】:
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?

你不能。那样不行。

【讨论】:

还有其他解决方案吗?所以让我问清楚;如何快速剪切视频的某些部分?最快的方法是什么?解码/重新编码太慢【参考方案2】:

开始考虑时间,而不是帧

例如,您可以在 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 复制 但它永远不会很快!

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

【讨论】:

感谢您的回答;但是有些点,我必须使用帧号,而且我在我的代码中使用它,ffmpeg 命令帮不了我;我正在寻找libav解决方案,最后一点是ffmpeg在这种情况下不能将视频文件拆分为多个片段,我想给它一些部分(开始端)并在其中拆分。

以上是关于删除视频的某些部分并重新制作关键帧(c++ + libav)的主要内容,如果未能解决你的问题,请参考以下文章

Canvas getImageData在某些移动设备上返回不正确的数据

Blender 编辑骨骼动画,重复动作,并导出动画为视频

什么是关键帧动画

是否有任何 C++ opencv 代码来计算每帧视频中关键特征点的速度? [关闭]

Java实现视频网站的视频上传视频转码视频关键帧抽图, 及视频播放功能(转)

Java实现视频网站的视频上传视频转码视频关键帧抽图, 及视频播放功能