ffmpeg - 如何在不重新编码的情况下使用 ffmpeg 删除帧?

标签 ffmpeg

我正在用 C++ 制作一个 datamoshing 程序,我需要找到一种方法来从视频中删除一帧(特别是在序列跳转之后的 p 帧),而无需重新编码视频。我目前正在使用 h.264,但也希望能够使用 VP9 和 AV1 来执行此操作。
我有一种解决方法,但由于一个令人沮丧的原因(稍后提到),它不起作用。我可以将原始视频转换为两个中间视频 - 一个只有序列跳转前的 i 帧,另一个带有两帧后的 p 帧。然后我创建一个包含以下内容的 concat.txt 文件:

file video.mkv
file video1.mkv
并运行 ffmpeg -y -f concat -i concat.txt -c copy output.mp4 .这产生了预期的输出,虽然当然没有我想要的那么高效,因为它需要创建中间文件并从磁盘读取 .txt 文件(性能在这个项目中非常重要)。
但更糟糕的是,我无法使用 ffmpeg 生成中间视频,我不得不使用 avidemux。我在 ffmpeg -y -ss 00:00:00 -i video.mp4 -t 0.04 -codec copy video.mkv 上尝试了各种变体,但是对于长度为 1-2 帧的视频,该命令似乎确实出错了 - 虽然它适用于更长的视频,但没问题。我最好的猜测是有一些内部检查器来确保输出视频没有损坏(不幸的是,这正是我想要的!)。
也许有一种方法可以解决这个问题,或者更好的是,首先是一个更优雅的问题解决方案。
谢谢!

最佳答案

如果您知道目标帧的 PTS 或数据偏移量或数据包索引,则可以使用噪声比特流过滤器。这是与编解码器无关的。

ffmpeg -copyts -i input -c copy -enc_time_base -1 -bsf:v:0 noise=drop=eq(pos\,11291) out
这将从存储在输入文件中偏移量 11291 处的第一个视频流中删除数据包。在 http://www.ffmpeg.org/ffmpeg-bitstream-filters.html#noise 上查看其他可用变量

关于ffmpeg - 如何在不重新编码的情况下使用 ffmpeg 删除帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72483584/

相关文章:

opencv - 如何在 Windows 中使用 openCV FFMPEG 视频 I/O 而不是 DirectShow ?

ffmpeg - x265 : Will I get smaller file size with frame-threads=1?

ffmpeg - 实时缓冲区太满 (FFMPEG)

ios - FFMpeg avformat_write_header 总是返回 < 0

cookies - 如何在 ffmpeg HLS 中启用 cookie

audio - 将大量 wav 文件拆分为小部分

ffmpeg 选择最短的电影但留下全长音频

c++ - 将 FFMPEG 帧写入 png/jpeg 文件

node.js - 在同一个子进程中同时使用 stdio 和 stout

android - 在 ffmpeg 中使用 build_libstagefright 为 android 构建文件 .so