删除视频的某些部分并重新制作关键帧(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在某些移动设备上返回不正确的数据
是否有任何 C++ opencv 代码来计算每帧视频中关键特征点的速度? [关闭]