Почему, когда вы указываете битрейт видео с помощью ffmpeg, отображаемый битрейт результирующих файлов отличается?

Я новичок в транскодировании. Я генерировал несколько mp4 из файлов mxf. Я играл с некоторыми настройками ffmpeg и указывал различные битрейты для аудио и видео с помощью аргументов -b:vи . -b:aКогда я проверяю файл после того, как он был создан mediainfo, я замечаю, что отображаемый битрейт аудио всегда точно такой же, как указано, но битрейт видео отличается. Например, я указал, -b:v 1500kно битрейт видео для файла, созданного при опросе mediainfo, говорит 6 943 кбит/с. Мне просто было интересно, почему это? Почему битрейт аудио всегда совпадает с выбранным, а не с битрейтом видео? Полная команда:

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

Результат:

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

Спасибо

Покажите команду и полный вывод консоли.
Похоже, вы создали две учетные записи (иначе вы могли бы отредактировать вопрос, не дожидаясь одобрения). Смотрите , я случайно создал две учетные записи; как мне их объединить? .
CRF и режим битрейта являются эксклюзивными, и здесь x264 использует CRF. Отбросьте прежнее. Добавлять-bufsize 1600k -maxrate 1600k

Ответы (2)

Проблема в том, что вы используете -crfс -b:v. ffmpeg — хорошо построенная программа, поэтому она просто игнорирует -b:vи использует файлы -crf. Если вы хотите иметь определенный битрейт, удалите команду crf.

CRF - это «коэффициент постоянной скорости», что означает, что переменная качества указывается, а затем вычисляется переменная скорость передачи на основе контента. Это мой фаворит для h.264, потому что обычно получается очень хорошо.

Установка постоянного битрейта работает как положено. Сжатие будет почти таким же, как вы ввели, но от этого может пострадать качество. Я никогда не использую его для h.264. Я не могу придумать вариант использования, где бы я был.

Ответ DigiVision Media разрешил это для меня, я использовал -crf и -b:v, как только я удалил -crf, выходной битрейт был установлен в параметре b:v. (пришлось опубликовать как ответ, так как не может комментировать)

Указанный битрейт является целевым, а не гарантированным битрейтом. Невозможно точно узнать, насколько большим будет кадр, пока он не будет закодирован. Переходя к кадру, можно быть немного более или менее агрессивным в отношении того, сколько информации вы готовы потерять при кодировании, но как потеря информации приводит к уменьшению размера данных (данные — это не то же самое, что информация ( AAAAи то, и A4другое ). содержат ту же информацию (4 А), ноA4это половина данных)) не предсказуемо на 100%. Для этого кодировщики используют нечто, называемое контролем скорости. Если кадры в конечном итоге будут немного больше, чем ожидалось, он будет более агрессивно терять информацию о следующем кадре. Поскольку большинство людей указывают битрейт для конкретных случаев использования (например, потоковая передача через Интернет), многие алгоритмы управления потоком ошибаются в сторону низкого значения, поскольку слишком высокое может вызвать проблемы, такие как буферизация.