avconv“select”过滤器不会丢弃第一帧

时间:2014-04-01 10:44:52

标签: video avconv avprobe

我尝试使用av​​conv"选择"来分割视频。过滤器仅从输入文件中提取特定范围的帧。举个例子,假设我有一个名为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具有input.mp4的前2000帧(并且持续~33秒),而output2.mp4具有最后1000帧(并且持续~17秒)。

我通过运行来计算帧数

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

并检查分配给' frame'。

的值

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

这不是一个问题。我使用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"过滤器中的功能。为什么会这样?

1 个答案:

答案 0 :(得分:1)

由于文件中还有其他流,您很可能会看到这一点。通过删除第二个命令中的其他流,我能够摆脱你所描述的问题:

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

据我所知,正在发生的事情是你有一个音频流,你没有放弃,所以当你放弃了视频帧时,视频流只是得到了它可以得到的第一帧,并声称它将持续到下一帧将到达。

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