FFmpeg提取剪辑-流帧速率与容器帧速率不同(x264,AAC)


8

总结
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分钟的剪辑。因此,我进行了一些黑盒工程设计,并决定将-t1秒钟解释为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具有完全相同的功能(由于复制了视频编解码器),因此从中获取更多片段需要对-tduration选项进行相同的缩放。因此,我已将其提供给愿意查看此功能的任何人。

附录
我系统上的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版本中已得到修复。


重新编码不是解决方案,对五分钟的内容进行一个小时的解码是不合理的,并且可能无法解决潜在的问题。伟大的初步研究顺便说一句。假设ffmpeg检测到的fps是问题的根源,您可能是正确的。听起来ffmpeg的更高版本解决了您的问题,但我会发表评论。我本来建议将-c复制到其他容器格式。这可能会产生多种影响,但这将是一个很好的下一步尝试。
dstob 2014年

Answers:


1

对于ffmpeg,选项的位置很重要。对于您的示例,它正在尝试将-ss和-t应用于输入。像这样使用它会将选项应用于输出:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

对于当前的ffmpeg,正确的语法为:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4

1

我遇到了同样的问题,解决方案如下:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

exec('ffmpeg -y -i /testmedia/'.$info['filename']。'-vf fps = fps = 1 /'.$ fracduration。'-f image2 /testmedia/images/output%03d.jpg 2 >&1',$ ffmpegout); // print_r($ ffmpegout);

无论视频长度如何,这都会为我提供10张图像

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.