¿Por qué cuando especifica una tasa de bits de video con ffmpeg, la tasa de bits de los archivos resultantes que se muestran es diferente?

Soy bastante nuevo en la transcodificación. He estado generando algunos mp4 a partir de archivos mxf. He estado jugando con algunas configuraciones en ffmpeg y he estado especificando varias tasas de bits para audio y video con los argumentos -b:vy . -b:aCuando reviso el archivo después de haberlo creado mediainfo, noto que la tasa de bits de audio que se muestra siempre es exactamente la misma que la especificada, pero la tasa de bits de video es diferente. Por ejemplo, especifiqué -b:v 1500kpero la tasa de bits de video para el archivo creado cuando se interrogó con mediainfodice 6 943 kb/s. Me preguntaba por qué es esto. ¿Por qué la tasa de bits de audio siempre es la misma que la seleccionada y no la del video? El comando completo es:

 ffmpeg -i mediafile.mxf -vcodec libx264 -crf 23 -b:v 1500k mediafile.mp4

La salida es:

ffmpeg version 2.6.8 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfaac --enable-nonfree --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Guessed Channel Layout for  Input Stream #0.1 : mono
Guessed Channel Layout for  Input Stream #0.2 : mono
Guessed Channel Layout for  Input Stream #0.3 : mono
Guessed Channel Layout for  Input Stream #0.4 : mono
Input #0, mxf, from 'mediafile.mxf':
  Metadata:
    uid             : adab4424-2f25-4dc7-92ff-29bd000b0000
    generation_uid  : adab4424-2f25-4dc7-92ff-29bd000b0001
    company_name    : FFmbc
    product_name    : OP1a Muxer
    product_version : 53.6.0
    product_uid     : adab4424-2f25-4dc7-92ff-29bd000b0002
    modification_date: 2016-04-08 15:58:38
    material_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD200
    timecode        : 00:00:00:00
  Duration: 00:02:42.56, start: 0.000000, bitrate: 118682 kb/s
    Stream #0:0: Video: dvvideo, yuv422p, 1440x1080 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
    Stream #0:1: Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
    Stream #0:2: Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
    Stream #0:3: Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
    Stream #0:4: Audio: pcm_s16le, 48000 Hz, 1 channels, s16, 768 kb/s
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
File 'mediafile.mp4' already exists. Overwrite ? [y/N] y
No pixel format specified, yuv422p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0xe3b9a0] using SAR=4/3
[libx264 @ 0xe3b9a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0xe3b9a0] profile High 4:2:2, level 4.0, 4:2:2 8-bit
[libx264 @ 0xe3b9a0] 264 - core 142 r2495 6a301b6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - 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=18 lookahead_threads=3 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 'mediafile.mp4':
  Metadata:
    uid             : adab4424-2f25-4dc7-92ff-29bd000b0000
    generation_uid  : adab4424-2f25-4dc7-92ff-29bd000b0001
    company_name    : FFmbc
    product_name    : OP1a Muxer
    product_version : 53.6.0
    product_uid     : adab4424-2f25-4dc7-92ff-29bd000b0002
    modification_date: 2016-04-08 15:58:38
    material_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD200
    timecode        : 00:00:00:00
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 1440x1080 [SAR 4:3 DAR 16:9], q=-1--1, 1500 kb/s, 25 fps, 12800 tbn, 25 tbc
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
      encoder         : Lavc56.26.100 libx264
    Stream #0:1: Audio: aac (libfaac) ([64][0][0][0] / 0x0040), 48000 Hz, mono, s16, 128 kb/s
    Metadata:
      file_package_umid: 0x060A2B340101010501010D0013D24E0A529471342FD24E0A00529471342FD201
      encoder         : Lavc56.26.100 libfaac
Stream mapping:
  Stream #0:0 -> #0:0 (dvvideo (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (pcm_s16le (native) -> aac (libfaac))
Press [q] to stop, [?] for help
frame= 4064 fps= 22 q=-1.0 Lsize=  139476kB time=00:02:42.56 bitrate=7028.7kbits/s    
video:137744kB audio:1640kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.065406%
[libx264 @ 0xe3b9a0] frame I:72    Avg QP:21.59  size: 65595
[libx264 @ 0xe3b9a0] frame P:3978  Avg QP:24.85  size: 34252
[libx264 @ 0xe3b9a0] frame B:14    Avg QP:23.42  size:  5032
[libx264 @ 0xe3b9a0] consecutive B-frames: 99.3%  0.7%  0.0%  0.0%
[libx264 @ 0xe3b9a0] mb I  I16..4: 12.6% 85.9%  1.5%
[libx264 @ 0xe3b9a0] mb P  I16..4:  2.4% 25.6%  0.5%  P16..4: 44.5%  9.3%  5.3%  0.0%  0.0%    skip:12.5%
[libx264 @ 0xe3b9a0] mb B  I16..4:  0.2%  0.9%  0.0%  B16..8: 27.5%  0.5%  0.1%  direct: 1.0%  skip:69.9%  L0:41.2% L1:57.3% BI: 1.5%
[libx264 @ 0xe3b9a0] 8x8 transform intra:89.8% inter:88.5%
[libx264 @ 0xe3b9a0] coded y,uvDC,uvAC intra: 76.2% 60.7% 7.8% inter: 38.4% 53.3% 0.1%
[libx264 @ 0xe3b9a0] i16 v,h,dc,p:  5% 72%  3% 19%
[libx264 @ 0xe3b9a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 21% 35%  4%  4%  5%  4%  4%  5%
[libx264 @ 0xe3b9a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 13% 57% 13%  3%  3%  3%  3%  2%  3%
[libx264 @ 0xe3b9a0] i8c dc,h,v,p: 55% 20% 21%  4%
[libx264 @ 0xe3b9a0] Weighted P-Frames: Y:3.7% UV:2.4%
[libx264 @ 0xe3b9a0] ref P L0: 43.9% 13.1% 26.1% 16.5%  0.4%
[libx264 @ 0xe3b9a0] ref B L0: 68.4% 31.6%
[libx264 @ 0xe3b9a0] kb/s:6941.41

Gracias

Muestra el comando y la salida completa de la consola.
Parece que creó dos cuentas (de lo contrario, podría haber editado la pregunta sin necesidad de esperar la aprobación). Mira , accidentalmente creé dos cuentas; como los fusiono .
CRF y el modo de tasa de bits son exclusivos, y x264 usa CRF aquí. Suelta lo anterior. Agregar-bufsize 1600k -maxrate 1600k

Respuestas (2)

El problema es que lo estás usando -crfcon -b:v. ffmpeg es un programa bien construido, por lo que solo ignora -b:vy usa -crf. Si desea tener una tasa de bits específica, elimine el comando crf.

CRF es "factor de tasa constante", lo que significa que se especifica una variable de calidad y luego se calcula una tasa de bits variable en función del contenido. Es mi favorito para h.264 porque suele salir muy bien.

Establecer una tasa de bits constante funciona como se esperaba. La compresión será casi exactamente lo que ingresó, pero la calidad puede verse afectada. Nunca lo uso para h.264. No puedo pensar en un caso de uso en el que lo haría.

La respuesta de DigiVision Media me lo resolvió, estaba usando -crf y -b:v tan pronto como eliminé -crf, la tasa de bits de salida estaba establecida en el parámetro b:v. (tuve que publicar como respuesta ya que no puedo comentar)

La tasa de bits que especifique es una tasa de bits objetivo, no una tasa de bits garantizada. No hay forma de saber exactamente qué tan grande será un cuadro hasta después de su codificación. Al entrar en un marco, es posible ser un poco más o un poco menos agresivo sobre la cantidad de información que está dispuesto a perder durante la codificación, pero cómo la pérdida de información conduce a la reducción del tamaño de los datos (los datos no son lo mismo que la información ( AAAAy A4ambos contienen la misma información (4 A's), peroA4es la mitad de los datos)) no es 100% predecible. Los codificadores usan algo llamado control de velocidad para lograr esto. Si los marcos terminan siendo un poco más grandes de lo esperado, perderá información de manera más agresiva en el siguiente marco. Dado que la mayoría de las personas especifican la tasa de bits para casos de uso específicos (transmisión a través de Internet, por ejemplo), muchos algoritmos de control de transmisión se equivocan en el lado de demasiado bajo, ya que demasiado alto podría causar problemas como el almacenamiento en búfer.