【发布时间】:2014-04-01 10:44:52
【问题描述】:
我正在尝试使用 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 帧 input.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 帧似乎被正确过滤,但被第一个接受的帧取代.
这不是积分问题。我使用 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”函数,行为都不会改变。为什么会这样?
【问题讨论】:
-
input.mp4 中的总帧数是多少?这可能会回答您的第一个问题。