如何使用ffmpeg剪切精确的帧?


22

我正在尝试使用ffmpeg在准确的时间剪切视频文件。ffmpeg帮助显示了-timecode_frame_start选项来指定起始帧,但是我无法使此命令正常工作。生成的视频始终从原始视频的开头开始。这是我正在运行的命令的示例:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

我将timecode_frame_start选项移到了其他选项之前和之后,结果没有变化。我需要指定其他选项吗?我尝试了各种文件格式,例如mkv,avi,mp4,但似乎与编解码器无关。这是我尝试过的一个文件:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

我想念什么吗?


似乎在邮件列表上得到了回答(注意,使用-vcodec复制,您不能“真正”获得特定于帧的剪切,因为它只能在i帧上重新同步
rogerdpack

@ user39364我在邮件列表中询问,结果发现此选项不能满足OP的要求。我也学到了新的东西:)
slhck

只是想注意一下,我找到了一种使用剪切精确帧的方法melt,请参见从命令行准确剪切视频文件-超级用户
sdaau

Answers:


46

我刚刚了解到timecode_frame_start不能这样工作。从特定帧开始的唯一方法是将许多帧转换为ss.ms语法或hh:mm:ss.ms。因此,如果您的视频速度为25 fps,并且您想以133帧开始,则需要

133/25 = 5.32

所以跑

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

请注意,-c:v copy无法使用位流复制()剪切精确的帧,因为并非所有帧都经过帧内编码并且可以独立存在。

-ss 始终会精确到帧。

如果要编码特定数量的帧,请使用-frames:v,例如:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

您还可以选择使用视频过滤器,但是音频支持可能并不准确。显然,在框架上搜索仍然不是功能。您可以按照以下FFmpeg-users邮件列表线程的操作来获取更多信息:

您可以使用它-vf select来进行准确的帧选择(例如 -vf 'select=gte(n\,100)'跳过前100帧)


3
对于丢帧(例如29.97fps)超过10分钟的视频;您将如何准确计算特定帧的时间?
GFoley83

select=gte(n\,100)方法有效,但寻求却会削弱性能。如果您一次只编码30帧进行测试,那么我开始播放的视频越远,由于寻求,ffmpeg花费的时间就越长。
亚当·格兰特

6

选项

-vf select =“在(n \,start_frame_num \,end_frame_num之间),setpts = PTS-STARTPTS”
例如,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

将视频从第200帧剪切到第300帧,序列计数从0开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.