Problemas com taxa de quadros na conversão de vídeo usando o ffmpeg com libx264

6

Eu tenho problemas com a transcodificação de alguns vídeos. Eu corri o comando ffmpeg mais simples e demorou muito tempo eo arquivo de saída é cerca de 10 vezes maior. Se eu fornecer o parâmetro taxa de quadros -r, ele funciona bem (arquivo pequeno, transcodificação rápida). Qual é o problema e como posso resolvê-lo? Não quero definir uma taxa fixa de quadros porque acho melhor deixá-la igual à fonte, não é?

Talvez o problema seja outra coisa, porque eu encontrei muitos exemplos na web onde a opção -r não é usada. Também a transcodificação para um formato diferente ou com uma fonte diferente funciona bem sem a opção -r (tentei com o ffmpeg 0.7.13 e 1.2.1 no mac os (fornecido pelas portas mac) e 0.7.15 em um servidor linux debian). Os vídeos são fornecidos pelos usuários do meu site e convertidos automaticamente para serem adequados para a web. Então eu preciso do comando mais geral para conversão automática.

Na seguinte saída do ffmpeg, você encontrará estas duas mensagens suspeitas:

  • Taxa de quadros muito alta para um muxer que não a suporta eficientemente. Por favor, considere especificar uma taxa de quadros inferior, um muxer diferente ou -vsync 2
  • Taxa de MB (36000000) > limite de nível (983040)

O comando ffmpeg e a saída (sem a opção -r):


    ffmpeg -i '/tmp/standort_aquarium.mp4' -vcodec libx264 output.mp4
    ffmpeg version 0.7.15, Copyright (c) 2000-2013 the FFmpeg developers  built on Feb 22 2013 07:18:58 with gcc 4.4.5  configuration: --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
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/standort_aquarium.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
      Duration: 00:00:18.24, start: 0.000000, bitrate: 2095 kb/s
        Stream #0.0(und): Video: mpeg4, yuv420p, 640x480 [PAR 1:1 DAR 4:3], 2001 kb/s, 14.97 fps, 30k tbr, 30k tbn, 30k tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: aac, 48000 Hz, mono, s16, 96 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    File 'output.mp4' already exists. Overwrite ? [y/N] y
    [mp4 @ 0x20eed80] Frame rate very high for a muxer not effciciently supporting it.
    Please consider specifiying a lower framerate, a different muxer or -vsync 2
    [buffer @ 0x20f8820] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
    [libx264 @ 0x20efde0] Default settings detected, using medium profile
    [libx264 @ 0x20efde0] using SAR=1/1
    [libx264 @ 0x20efde0] MB rate (36000000) > level limit (983040)
    [libx264 @ 0x20efde0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x20efde0] profile High, level 5.1
    [libx264 @ 0x20efde0] 264 - core 118 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_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
    Output #0, mp4, to 'output.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
        encoder         : Lavf52.111.0
        Stream #0.0(und): Video: libx264, yuv420p, 640x480 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 30k tbn, 30k tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: libfaac, 48000 Hz, mono, s16, 64 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    Stream mapping:
      Stream #0.0 -> #0.0
      Stream #0.1 -> #0.1
    Press [q] to stop, [?] for help
    frame=542630 fps=132 q=33.0 Lsize=   77226kB time=00:00:18.08 bitrate=34976.2kbits/s dup=542358 drop=0
    video:68604kB audio:143kB global headers:0kB muxing overhead 12.333275%
    frame I:2174  Avg QP:18.72  size: 25040
    [libx264 @ 0x20efde0] frame P:136846 Avg QP:25.27  size:    56
    [libx264 @ 0x20efde0] frame B:403610 Avg QP:32.99  size:    20
    [libx264 @ 0x20efde0] consecutive B-frames:  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%    skip:99.4%
    [libx264 @ 0x20efde0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%  L0:21.2% L1:78.8% BI: 0.0%
    [libx264 @ 0x20efde0] 8x8 transform intra:83.1% inter:85.2%
    [libx264 @ 0x20efde0] coded y,uvDC,uvAC intra: 91.2% 95.8% 80.7% inter: 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] Weighted P-Frames: Y:0.0% UV:0.0%
    [libx264 @ 0x20efde0] ref P L0: 91.5%  5.2%  2.8%  0.4%  0.0%
    [libx264 @ 0x20efde0] ref B L0: 55.7% 43.5%  0.8%
    [libx264 @ 0x20efde0] ref B L1: 97.9%  2.1%
    [libx264 @ 0x20efde0] kb/s:31071.04

O comando ffmpeg e a saída com a opção -r 24:


    ffmpeg -i '/tmp/standort_aquarium.mp4' -r 30000/1001 -vcodec libx264 output.mp4
    ffmpeg version 0.7.15, Copyright (c) 2000-2013 the FFmpeg developers
      built on Feb 22 2013 07:18:58 with gcc 4.4.5
      configuration: --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
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/standort_aquarium.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
      Duration: 00:00:18.24, start: 0.000000, bitrate: 2095 kb/s
        Stream #0.0(und): Video: mpeg4, yuv420p, 640x480 [PAR 1:1 DAR 4:3], 2001 kb/s, 14.97 fps, 30k tbr, 30k tbn, 30k tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: aac, 48000 Hz, mono, s16, 96 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    File 'output.mp4' already exists. Overwrite ? [y/N] y
    [buffer @ 0x132e820] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
    [libx264 @ 0x1325de0] Default settings detected, using medium profile
    [libx264 @ 0x1325de0] using SAR=1/1
    [libx264 @ 0x1325de0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
    [libx264 @ 0x1325de0] profile High, level 3.0
    [libx264 @ 0x1325de0] 264 - core 118 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_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
    Output #0, mp4, to 'output.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp423gp4isom
        creation_time   : 2013-04-19 15:04:05
        encoder         : Lavf52.111.0
        Stream #0.0(und): Video: libx264, yuv420p, 640x480 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 30k tbn, 29.97 tbc
        Metadata:
          creation_time   : 2013-04-19 15:04:05
        Stream #0.1(und): Audio: libfaac, 48000 Hz, mono, s16, 64 kb/s
        Metadata:
          creation_time   : 2013-04-19 15:04:05
    Stream mapping:
      Stream #0.0 -> #0.0
      Stream #0.1 -> #0.1
    Press [q] to stop, [?] for help
    frame=  542 fps= 36 q=29.0 Lsize=    2059kB time=00:00:18.01 bitrate= 936.3kbits/s dup=270 drop=0
    video:1904kB audio:143kB global headers:0kB muxing overhead 0.609224%
    frame I:3     Avg QP:22.39  size: 14773
    [libx264 @ 0x1325de0] frame P:514   Avg QP:23.98  size:  3675
    [libx264 @ 0x1325de0] frame B:25    Avg QP:27.44  size:   643
    [libx264 @ 0x1325de0] consecutive B-frames: 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%    skip:49.4%
    [libx264 @ 0x1325de0] mb B  I16..4:  0.4%  0.7%  0.0%  B16..8: 13.2%  1.6%  0.2%  direct: 0.3%  skip:83.6%  L0:50.0% L1:47.1% BI: 2.9%
    [libx264 @ 0x1325de0] 8x8 transform intra:77.1% inter:83.1%
    [libx264 @ 0x1325de0] coded y,uvDC,uvAC intra: 62.0% 76.4% 24.4% inter: 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%  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] Weighted P-Frames: Y:8.0% UV:4.5%
    [libx264 @ 0x1325de0] ref P L0: 65.6% 16.7%  8.8%  7.9%  0.9%
    [libx264 @ 0x1325de0] ref B L0: 85.9% 13.3%  0.8%
    [libx264 @ 0x1325de0] ref B L1: 88.7% 11.3%
    [libx264 @ 0x1325de0] kb/s:862.28

A fonte de vídeo está temporariamente disponível em: link

    
por LarS 29.05.2013 / 18:09

2 respostas

4

O problema é que o ffmpeg escolhe o padrão para -vsync com base no muxer de saída. Seu muxer mp4 é padronizado para vsync 1, mas ele escolhe uma taxa de quadros muito alta para que possa colocar um quadro no momento exato para cada quadro de entrada.

(O tempo do quadro de entrada não é constante. Ele mede 14,97 fps, de acordo com o ffmpeg. Provavelmente de uma câmera de telefone? Eles fazem FPS variáveis. Acho que eles diminuem a velocidade para obter mais luz para cada quadro, mas pode outro motivo.)

Então o ffmpeg irá duplicar quadros até os 30k fps escolhidos, ou algo assim. O h.264 é bastante eficiente em armazenar quadros duplicados, mas isso é ridículo.

De qualquer forma, a solução é usar -vsync 2 na sua linha de comando do ffmpeg. Ou a saída para mkv e, em seguida, o remux para o mp4, mas a razão que funciona é que o mkv é padronizado para -vsync 2 . É tão simples assim. Você não precisa fazer sua saída CFR. O Youtube lida com taxas de frames arbitrárias, desde que elas sejam <= 60 , e a maioria dos outros players também. Eu suponho que os telefones estão bem, desde que eles fazem vídeos FPS variáveis em primeiro lugar. Você não precisa usar -r something para forçar a duplicação de quadros para atingir exatamente 30 fps ou qualquer coisa.

    
por 01.03.2015 / 04:03
0

Não consegui ver nenhum problema com o seu vídeo, usando o seguinte comando na versão 1.1.2 do ffmpeg:

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

O tamanho do arquivo resultante é o esperado (cerca da metade do tamanho), o vídeo estava sendo reproduzido corretamente e a conversão de taxa de quadros parece estar funcionando bem (por isso, não é um bug).

O único problema que vejo com sua saída é que o mapeamento de vapor está faltando (por motivo desconhecido). Na sua saída:

Stream mapping:

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

Onde deveria estar escrito:

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

Eu suponho que você tenha um problema com seu binário / versão do ffmpeg (também, a versão 1.2.1 nunca foi liberada). Tente baixar novamente ou recompile com a versão 1.1.2

    
por 07.06.2013 / 07:36

Tags