AVConv "select" 筛选器不会丢弃第一帧



我正在尝试使用 avconv 的"选择"过滤器对视频进行分段,以仅从输入文件中提取特定范围的帧。例如,假设我有一个名为input.mp4的60fps视频文件,有3000帧(即50秒),我运行

avconv -i input.mp4 -vf "select='lt(n,2000)'" output1.mp4
avconv -i input.mp4 -vf "select='gte(n,2000)'" output2.mp4

我期望的是 output1.mp4 具有前 2000 帧的输入.mp4(持续 ~33 秒),而 output2.mp4 具有最后 1000 帧(持续 ~17 秒)。

我通过跑步来计算帧数

avconv -i video.mp4 -vcodec copy -an -f null /dev/null 2>&1 | grep 'frame='

并检查分配给"框架"的值。

我实际得到的是,output1.mp4 有 2000 帧,持续 ~33 秒,但 output2.mp4 有 2999 帧,并且仍然持续整整 ~50 秒。当我打开output2.mp4时,我注意到视频的前2000帧实际上只是输入的第2000帧的重复,即前2000帧似乎被正确过滤,但被接受的第一帧所取代。

这不是 pts 问题。我使用 avprobe 检查数据包的数量及其相对点数:

avprobe -show_packets output2.mp4
echo $(avprobe -show_packets output2.mp4 2>/dev/null | grep PACKET | wc -l)/2 | bc

我看到实际上有 2999 个数据包。

我做错了什么?

附带问题:

  • 假设我做错了什么,为什么 output2.mp4 包含 2999 而不是完整的 3000?
  • 无论我在过滤器中使用"gte"还是"gt"功能,行为都不会改变。为什么会这样呢?

您很可能会看到这种情况,因为文件中还有其他流。我能够通过在第二个命令中删除其他流来摆脱您描述的问题:

avconv -i input.mp4 -vf "select='gte(n,2000)'" -an -sn output2.mp4

据我了解,正在发生的事情是,例如,您有一个音频流,您没有丢弃它,所以当您丢弃视频帧时,视频流只是获得了它可以拿到手的第一帧,并声称它将持续到下一帧将到达。

这样,当然,您必须编辑音频,然后将其复用回视频中。

最新更新