总结
H.264视频似乎具有非常高的帧速率,需要将比例因子应用于我尝试提取的视频持续时间(低900倍)。
正文
我正在尝试从MP4格式(使用Handbrake创建)的电影中提取剪辑。在尝试了Mencoder和VLC之后,我决定试一试FFmpeg,因为它在复制编解码器时最麻烦。也就是说,与Mencoder和VLC相比,生成的文件仍可以在QuickTime中播放(我知道Perian等,我只是想学习所有工作原理)。
无论如何,我的命令如下:
ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
在复制过程中,出现以下内容:
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size= 8144kB time=101.60 bitrate= 656.7kbits/s
…
我得到了电影的其余部分,而不是5:59的时长剪辑。因此,为了测试这一点,我使用运行了ffmpeg命令-t 00:00:01
。我得到的正是15:00分钟的剪辑。因此,我进行了一些黑盒工程设计,并决定将-t
1秒钟解释为900 s,然后计算要输入的值来扩展我的选项。对于我想要的359 s剪辑,我计算了0.399 s,因此我的ffmpeg命令变为:
ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \
-acodec copy -vcodec copy clip.mp4
这行得通,但我不知道为什么将持续时间按900缩放。进一步调查,每个ffmpeg运行都有以下行:
Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
45000/25 =1800。必须是某个地方的关系。不知何故,过高的帧速率会导致时序问题。帧率怎么这么高?最好的部分是,生成的clip.mp4具有完全相同的功能(由于复制了视频编解码器),因此从中获取更多片段需要对-t
duration选项进行相同的缩放。因此,我已将其提供给愿意查看此功能的任何人。
附录
我系统上的ffmpeg序言(使用MacPorts ffmpeg端口构建):
FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
libavutil 49.15. 0 / 49.15. 0
libavcodec 52.20. 0 / 52.20. 0
libavformat 52.31. 0 / 52.31. 0
libavdevice 52. 1. 0 / 52. 1. 0
libavfilter 1. 4. 0 / 1. 4. 0
libswscale 1. 7. 1 / 1. 7. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Jan 4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)
编辑
不确定是否是bug,但至少在该视频(MacPorts的0.6.1版)中,它似乎在我当前的ffmpeg版本中已得到修复。