我正在用 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/