使用 ffmpeg 和 libx264 进行视频转换时帧速率出现问题

使用 ffmpeg 和 libx264 进行视频转换时帧速率出现问题

我在转码某些视频时遇到了问题。我运行了最简单的 ffmpeg 命令,但花费了很长时间,输出文件大约大 10 倍。如果我提供帧速率参数 -r,它运行良好(文件小,转码快)。问题是什么,我该如何解决?我不想设置固定的帧速率,因为我猜最好让它与源保持相同,不是吗?

也许问题出在别的地方,因为我在网上发现了很多没有使用 -r 选项的例子。而且,在没有 -r 选项的情况下,转码为不同的格式或使用不同的源也可以很好地工作(我尝试在 mac os 上使用 ffmpeg 0.7.13 和 1.2.1(由 mac ports 提供)以及在 debian linux 服务器上使用 0.7.15)。这些视频由我的网站的用户提供,并自动转换为适合网络。所以我需要最通用的自动转换命令。

在以下 ffmpeg 输出中你会发现这两条可疑消息:

  • 对于无法有效支持的复用器来说,帧速率太高。请考虑指定较低的帧速率、不同的复用器或 -vsync 2
  • MB 速率 (36000000) > 级别限制 (983040)

ffmpeg 命令和输出(不带 -r 选项):

    ffmpeg -i'/tmp/standort_aquarium.mp4'-vcodec libx264 输出.mp4
    ffmpeg 版本 0.7.15,版权所有 (c) 2000-2013 FFmpeg 开发人员于 2013 年 2 月 22 日 07:18:58 使用 gcc 4.4.5 配置构建:--enable-libdc1394 --prefix=/usr --extra-cflags='-Wall -g ' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-avfilter --enable-libdirac --disable-decoder=libdirac --enable-libfreetype --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --extra-libs=-lgcrypt --disable-altivec --disable-armv5te --disable-armv6 --disable-vis
      libavutil 50.43.0 / 50.43.0
      libavcodec 52.123.0 / 52.123.0
      libavformat 52.111. 0 / 52.111. 0
      libavdevice 52.5.0 / 52.5.0
      libavfilter 1.80.0 / 1.80.0
      libswscale 0.14.1 / 0.14.1
      libpostproc 51. 2. 0 / 51. 2. 0
    输入 #0,mov,mp4,m4a,3gp,3g2,mj2,来自‘/tmp/standort_aquarium.mp4’:
      元数据:
        主要品牌:mp42
        次要版本:0
        兼容品牌:mp423gp4isom
        创作时间:2013-04-19 15:04:05
      时长:00:00:18.24,开始:0.000000,比特率:2095 kb/s
        流 #0.0(und):视频:mpeg4、yuv420p、640x480 [PAR 1:1 DAR 4:3]、2001 kb/s、14.97 fps、30k tbr、30k tbn、30k tbc
        元数据:
          创作时间:2013-04-19 15:04:05
        流 #0.1(und):音频:aac,48000 Hz,单声道,s16,96 kb/s
        元数据:
          创作时间:2013-04-19 15:04:05
    文件“output.mp4”已存在。覆盖吗?[y/N] y
    [mp4 @ 0x20eed80] 对于无法有效支持它的多路复用器来说,帧速率非常高。
    请考虑指定较低的帧速率、不同的复用器或 -vsync 2
    [缓冲区@0x20f8820] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
    [libx264 @ 0x20efde0] 检测到默认设置,使用中等配置文件
    [libx264 @ 0x20efde0] 使用 SAR=1/1
    [libx264 @ 0x20efde0] MB 速率 (36000000) > 级别限制 (983040)
    [libx264 @ 0x20efde0] 使用 CPU 功能:MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x20efde0] 配置文件高,级别 5.1
    [libx264 @ 0x20efde0] 264 - 核心 118 - H.264/MPEG-4 AVC 编解码器 - Copyleft 2003-2011 - http://www.videolan.org/x264.html - 选项:cabac=1 ref=3 deblock=1:0:0 analyze=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 hybrid_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2threads=1sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    输出 #0,mp4,到‘output.mp4’:
      元数据:
        主要品牌:mp42
        次要版本:0
        兼容品牌:mp423gp4isom
        创作时间:2013-04-19 15:04:05
        编码器:Lavf52.111.0
        流 #0.0(und):视频:libx264、yuv420p、640x480 [PAR 1:1 DAR 4:3]、q=2-31、200 kb/s、30k tbn、30k tbc
        元数据:
          创作时间:2013-04-19 15:04:05
        流 #0.1(und):音频:libfaac,48000 Hz,单声道,s16,64 kb/s
        元数据:
          创作时间:2013-04-19 15:04:05
    流映射:
      流 #0.0 -> #0.0
      流 #0.1 -> #0.1
    按 [q] 停止,按 [?] 获取帮助
    帧=542630 fps=132 q=33.0 Lsize=77226kB 时间=00:00:18.08 比特率=34976.2kbits/s 重复=542358 丢弃=0
    视频:68604kB 音频:143kB 全局标头:0kB 多路复用开销 12.333275%
    帧 I:2174 平均 QP:18.72 大小: 25040
    [libx264 @ 0x20efde0] 帧 P:136846 平均 QP:25.27 大小:56
    [libx264 @ 0x20efde0] 帧 B:403610 平均 QP:32.99 大小:20
    [libx264 @ 0x20efde0] 连续 B 帧:0.8% 0.0% 0.1% 99.1%
    [libx264 @ 0x20efde0] mb I I16..4:5.5%83.3%11.1%
    [libx264 @ 0x20efde0] mb P I16..4:0.0%0.0%0.0%P16..4:0.5%0.0%0.0%0.0%0.0%跳过:99.4%
    [libx264 @ 0x20efde0] mb B I16..4:0.0%0.0%0.0%B16..8:0.0%0.0%0.0%直接:0.0%跳过:100.0%L0:21.2%L1:78.8%BI:0.0%
    [libx264 @ 0x20efde0] 8x8 变换帧内:83.1% 帧间:85.2%
    [libx264 @ 0x20efde0] 编码 y、uvDC、uvAC 帧内:91.2% 95.8% 80.7% 帧间:0.0% 0.1% 0.0%
    [libx264 @ 0x20efde0] i16 v,h,dc,p:13%40%12%35%
    [libx264 @ 0x20efde0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:19%34%15%4%4%5%6%7%8%
    [libx264 @ 0x20efde0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu:20% 38% 6% 4% 6% 6% 8% 6% 6%
    [libx264 @ 0x20efde0] i8c dc,h,v,p:39%32%19%10%
    [libx264 @ 0x20efde0] 加权 P 帧:Y:0.0% UV:0.0%
    [libx264 @ 0x20efde0] 参考 P L0: 91.5% 5.2% 2.8% 0.4% 0.0%
    [libx264 @ 0x20efde0] 参考 B L0: 55.7% 43.5% 0.8%
    [libx264 @ 0x20efde0] 参考 B L1: 97.9% 2.1%
    [libx264 @ 0x20efde0] kb/s:31071.04

带有 -r 24 选项的 ffmpeg 命令和输出:

    ffmpeg -i'/tmp/standort_aquarium.mp4'-r 30000/1001-vcodec libx264 输出.mp4
    ffmpeg 版本 0.7.15,版权所有 (c) 2000-2013 FFmpeg 开发人员
      于 2013 年 2 月 22 日 07:18:58 使用 gcc 4.4.5 构建
      配置:--enable-libdc1394 --prefix=/usr --extra-cflags='-Wall -g ' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-avfilter --enable-libdirac --disable-decoder=libdirac --enable-libfreetype --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --extra-libs=-lgcrypt --disable-altivec --disable-armv5te --disable-armv6 --disable-vis
      libavutil 50.43.0 / 50.43.0
      libavcodec 52.123.0 / 52.123.0
      libavformat 52.111. 0 / 52.111. 0
      libavdevice 52.5.0 / 52.5.0
      libavfilter 1.80.0 / 1.80.0
      libswscale 0.14.1 / 0.14.1
      libpostproc 51. 2. 0 / 51. 2. 0
    输入 #0,mov,mp4,m4a,3gp,3g2,mj2,来自‘/tmp/standort_aquarium.mp4’:
      元数据:
        主要品牌:mp42
        次要版本:0
        兼容品牌:mp423gp4isom
        创作时间:2013-04-19 15:04:05
      时长:00:00:18.24,开始:0.000000,比特率:2095 kb/s
        流 #0.0(und):视频:mpeg4、yuv420p、640x480 [PAR 1:1 DAR 4:3]、2001 kb/s、14.97 fps、30k tbr、30k tbn、30k tbc
        元数据:
          创作时间:2013-04-19 15:04:05
        流 #0.1(und):音频:aac,48000 Hz,单声道,s16,96 kb/s
        元数据:
          创作时间:2013-04-19 15:04:05
    文件“output.mp4”已存在。覆盖吗?[y/N] y
    [缓冲区@0x132e820] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
    [libx264 @ 0x1325de0] 检测到默认设置,使用中等配置文件
    [libx264 @ 0x1325de0] 使用 SAR=1/1
    [libx264 @ 0x1325de0] 使用 CPU 功能:MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x1325de0] 配置文件高,级别 3.0
    [libx264 @ 0x1325de0] 264 - 核心 118 - H.264/MPEG-4 AVC 编解码器 - Copyleft 2003-2011 - http://www.videolan.org/x264.html - 选项:cabac=1 ref=3 deblock=1:0:0 analyze=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 combined_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2threads=1sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
    输出 #0,mp4,到‘output.mp4’:
      元数据:
        主要品牌:mp42
        次要版本:0
        兼容品牌:mp423gp4isom
        创作时间:2013-04-19 15:04:05
        编码器:Lavf52.111.0
        流 #0.0(und):视频:libx264,yuv420p,640x480 [PAR 1:1 DAR 4:3],q=2-31,200 kb/s,30k tbn,29.97 tbc
        元数据:
          创作时间:2013-04-19 15:04:05
        流 #0.1(und):音频:libfaac,48000 Hz,单声道,s16,64 kb/s
        元数据:
          创作时间:2013-04-19 15:04:05
    流映射:
      流 #0.0 -> #0.0
      流 #0.1 -> #0.1
    按 [q] 停止,按 [?] 获取帮助
    帧= 542 fps= 36 q=29.0 Lsize= 2059kB 时间=00:00:18.01 比特率= 936.3kbits/s dup=270 drop=0
    视频:1904kB 音频:143kB 全局标头:0kB 多路复用开销 0.609224%
    帧 I:3 平均 QP:22.39 大小: 14773
    [libx264 @ 0x1325de0] 帧 P:514 平均 QP:23.98 大小:3675
    [libx264 @ 0x1325de0] 帧 B:25 平均 QP:27.44 大小:643
    [libx264 @ 0x1325de0] 连续 B 帧:93.7% 0.0% 1.1% 5.2%
    [libx264 @ 0x1325de0] mb I I16..4:16.4%78.3%5.3%
    [libx264 @ 0x1325de0] mb P I16..4: 1.6% 6.3% 0.3% P16..4: 30.8% 8.6% 3.1% 0.0% 0.0% 跳过:49.4%
    [libx264 @ 0x1325de0] mb B I16..4: 0.4% 0.7% 0.0% B16..8: 13.2% 1.6% 0.2% 直接: 0.3% 跳过:83.6% L0:50.0% L1:47.1% BI: 2.9%
    [libx264 @ 0x1325de0] 8x8 变换 帧内:77.1% 帧间:83.1%
    [libx264 @ 0x1325de0] 编码 y,uvDC,uvAC 帧内:62.0% 76.4% 24.4% 帧间:17.9% 26.3% 2.3%
    [libx264 @ 0x1325de0] i16 v,h,dc,p:14%60%13%13%
    [libx264 @ 0x1325de0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:15%35%33%2%3%3%3%3%3%4%
    [libx264 @ 0x1325de0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu:15%40%12%4%7%7%7%5%4%
    [libx264 @ 0x1325de0] i8c dc,h,v,p:46%34%16%4%
    [libx264 @ 0x1325de0] 加权 P 帧:Y:8.0% UV:4.5%
    [libx264 @ 0x1325de0] 参考 P L0: 65.6% 16.7% 8.8% 7.9% 0.9%
    [libx264 @ 0x1325de0] 参考 B L0: 85.9% 13.3% 0.8%
    [libx264 @ 0x1325de0] 参考 B L1: 88.7% 11.3%
    [libx264 @ 0x1325de0] kb/s:862.28

视频来源暂时位于:https://www.dropbox.com/s/4xg147z77u40g87/standort_aquarium.mp4

答案1

问题在于 ffmpeg-vsync根据输出复用器选择默认值。其 mp4 复用器默认为 vsync 1,但它选择非常高的帧速率,以便能够为每个输入帧在正确的时间放置一帧。

(输入帧时间不是恒定的。根据 ffmpeg,它的平均速度为 14.97 fps。可能是来自手机摄像头?它们的 FPS 可变。我认为它们会放慢速度以便为每一帧获取更多的光线,但也可能是其他原因。)

因此 ffmpeg 将以它选择的 30k fps 的速度复制帧,或者类似的速度。h.264 在存储重复帧方面非常高效,但这太荒谬了。

无论如何,解决方案是在 ffmpeg 命令行上使用-vsync 2。或者输出到 mkv,然后重新合并到 mp4,但这样做有效的原因是 mkv 默认为-vsync 2。其实就这么简单。您不需要将输出设置为 CFR。Youtube 可以很好地处理任意帧速率,只要它们是<= 60,大多数其他播放器也是如此。我认为手机没问题,因为它们首先制作可变 FPS 视频。您不需要使用-r something强制帧复制以达到精确的 30fps 或任何其他速度。

答案2

在 ffmpeg 版本 1.1.2 上使用以下命令,我没有发现您的视频有任何问题:

ffmpeg -i standort_aquarium.mp4 -r 30000/1001 -vcodec libx264 output.mp4

结果文件大小符合预期(大约一半大小),视频播放正确,帧速率转换似乎运行良好(所以不是一个错误)。

我发现您的输出中唯一的问题是缺少蒸汽映射(原因不明)。在您的输出中:

Stream mapping:

  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1

应该写在:

Stream mapping:
  Stream #0:0 -> #0:0 (mpeg4 -> libx264)
  Stream #0:1 -> #0:1 (aac -> libfaac)

我假设您的 ffmpeg 二进制文件/版本存在问题(此外,版本 1.2.1 从未发布过)。尝试重新下载或使用版本 1.1.2 重新编译

相关内容