(FFmpeg) VP9 Кодирование Vaapi в контейнер .mp4 или .webm из данного официального примера ffmpeg

Выполняя пробную ошибку, я вижу практический максимум в течение года 9999. На сегодняшний день с двумя созданными таким образом ключами:

keytool -genkey -v -keystore year-9998.keystore -alias myalias -keyalg RSA -keysize 2048 -validity 2914760 keytool -genkey -v -keystore year-10002.keystore -alias myalias -keyalg RSA -keysize 2048 -validity 2916223

Хотя оба ключа, похоже, успешно создаются, проверяя эти клавиши с помощью команд:

keytool -list -v -keystore year-9998.keystore - работает нормально, давая «Действителен с: Вт 29 августа 11:12:45 CDT 2017 до: чт 01 января 10 : 12: 45 CST 9998 "

keytool -list -v -keystore year-10002.keystore - Сбой с" ошибкой keytool: java.security.cert.CertificateParsingException: java.io.IOException: Parse Обобщенное время, недопустимый формат "

Итак, я думаю, что практический максимальный срок действия истекает до 10000 года.

1
задан User800222 8 March 2019 в 00:57
поделиться

1 ответ

Вам нужно будет использовать FFmpeg напрямую, где вы можете дополнительно добавить vp9_superframe и vp9_raw_reorder фильтры потока битов в той же командной строке, если вы включите B -кадры в кодировщике vp9_vaapi.

Пример:

ffmpeg -vaapi_device /dev/dri/renderD128 -re -i http://server:port -vf 'format=nv12,hwupload' -c:v vp9_vaapi -global_quality 50 -bf 1 -bsf:v vp9_raw_reorder,vp9_superframe -f segment -segment_time 5 -segment_format_options movflags=+faststart output%03d.mp4

При необходимости настройте входные и выходные пути / URL-адреса.

Что делает эта команда:

Она создаст 5-секундные длинные сегменты mp4 через мультиплексор . Посмотрите, как используется movflags=+faststart, и как он был передан в качестве опции формата в базовый мультиплексор mp4 с помощью флага -segment_format_options выше.

Длина сегмента может быть не ровно 5 секунд, так как каждый сегмент начинается (обрезается) (с) ключевого кадра.

Однако я бы не рекомендовал включать B-кадры в этом кодере, так как эти фильтры битового потока имеют другие нежелательные эффекты, такие как слоняясь с помощью регулятора скорости и , вызывающих ошибки, подобные этой один [1 123]. Это нежелательно в производственной среде. Вот почему в приведенных ниже сценариях эта опция не включена, и вместо этого мы определяем режим управления установленной скоростью непосредственно в параметрах кодера.

Если вам нужно воспользоваться преимуществами кодирования 1: N с помощью VAAPI, используйте следующие фрагменты:

  1. Если вам нужно выполнить деинтерлейсинг, вызовите фильтр deinterlace_vaapi:
    ffmpeg -re -threads 4 -loglevel debug -filter_complex_threads 4 \
    -init_hw_device vaapi=va:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_device va -filter_hw_device va -hwaccel_output_format vaapi \
    -i 'http://server:port' \
    -filter_complex "[0:v]format=nv12|vaapi,hwupload,deinterlace_vaapi,split=3[n0][n1][n2]; \
    [n0]format=nv12|vaapi,hwupload,scale_vaapi=1152:648[v0]; \
    [n1]format=nv12|vaapi,hwupload,scale_vaapi=848:480[v1];
    [n2]format=nv12|vaapi,hwupload,scale_vaapi=640:360[v2]" \
    -b:v:0 2250k -maxrate:v:0 2250k -bufsize:v:0 360k -c:v:0 vp9_vaapi -g:v:0 50 -r:v:0 25 -rc_mode:v:0 2 \
    -b:v:1 1750k -maxrate:v:1 1750k -bufsize:v:1 280k -c:v:1 vp9_vaapi -g:v:1 50 -r:v:1 25 -rc_mode:v:1 2 \
    -b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 160k -c:v:2 vp9_vaapi -g:v:2 50 -r:v:2 25 -rc_mode:v:2 2 \
    -c:a aac -b:a 128k -ar 48000 -ac 2 \
    -flags -global_header -f tee -use_fifo 1 \
    -map "[v0]" -map "[v1]" -map "[v2]" -map 0:a \
    "[select=\'v:0,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path0/output%03d.mp4| \
     [select=\'v:1,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path1/output%03d.mp4| \
     [select=\'v:2,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path2/output%03d.mp4"
  1. Без деинтерлейсинга:
    ffmpeg -re -threads 4 -loglevel debug -filter_complex_threads 4 \
    -init_hw_device vaapi=va:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_device va -filter_hw_device va -hwaccel_output_format vaapi \
    -i 'http://server:port' \
    -filter_complex "[0:v]split=3[n0][n1][n2]; \
    [n0]format=nv12|vaapi,hwupload,scale_vaapi=1152:648[v0]; \
    [n1]format=nv12|vaapi,hwupload,scale_vaapi=848:480[v1];
    [n2]format=nv12|vaapi,hwupload,scale_vaapi=640:360[v2]" \
    -b:v:0 2250k -maxrate:v:0 2250k -bufsize:v:0 360k -c:v:0 vp9_vaapi -g:v:0 50 -r:v:0 25 -rc_mode:v:0 2  \
    -b:v:1 1750k -maxrate:v:1 1750k -bufsize:v:1 280k -c:v:1 vp9_vaapi -g:v:1 50 -r:v:1 25 -rc_mode:v:1 2  \
    -b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 160k -c:v:2 vp9_vaapi -g:v:2 50 -r:v:2 25 -rc_mode:v:2 2  \
    -c:a aac -b:a 128k -ar 48000 -ac 2 \
    -flags -global_header -f tee -use_fifo 1 \
    -map "[v0]" -map "[v1]" -map "[v2]" -map 0:a \
    "[select=\'v:0,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path0/output%03d.mp4| \
     [select=\'v:1,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path1/output%03d.mp4| \
     [select=\'v:2,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path2/output%03d.mp4"

Примечание: Если вы используете путь QuickSync, обратите внимание, что MFE (режим многокадрового кодирования) будет быть включенным по умолчанию, если библиотека Media SDK в вашей системе поддерживает его.

Формулы, использованные для получения приведенного выше фрагмента:

Оптимальный размер буфера: v = 4 (b: v / fps)

Заданная частота кадров (согласно рисунку по OP): 25

Установите размер GOP как: 2 * кадр / с (интервал GOP установлен на 2 секунды).

Мы ограничиваем количество потоков для видеокодера (ов) через -threads:v, чтобы предотвратить переполнение VBV.

Используемая лестница разрешения: 640p, 480p и 360p в 16: 9, см. эту ссылку. Отрегулируйте это при необходимости.

Замените указанные выше переменные ($output_path{0-2}, ввод и т. Д.) По мере необходимости.

Проверить и доложить.

Текущие наблюдения:

В моей системе я могу кодировать до 5 потоков в режиме реального времени с VP9, ​​используя рекомендованные Apple разрешения и битрейт для кодирования HEVC для HLS в качестве ориентира. См. Рисунок ниже о загрузке системы и т. Д.

system load and stats with 5 simultaneous VAAPI encodes in progress

Детали платформы:

I Я нахожусь в системе Coffee-lake, используя драйвер i965 для этого рабочего процесса:

libva info: VA-API version 1.5.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'i965'
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_5
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.5 (libva 2.4.0.pre1)
vainfo: Driver version: Intel i965 driver for Intel(R) Coffee Lake - 2.4.0.pre1 (2.3.0-11-g881e67a)
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSlice
      VAProfileVP9Profile2            : VAEntrypointVLD

Моя информация о сборке ffmpeg:

ffmpeg -buildconf
ffmpeg version N-93308-g1144d5c96d Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-27ubuntu1~18.04)
  configuration: --pkg-config-flags=--static --prefix=/home/brainiarc7/bin --bindir=/home/brainiarc7/bin --extra-cflags=-I/home/brainiarc7/bin/include --extra-ldflags=-L/home/brainiarc7/bin/lib --enable-cuda-nvcc --enable-cuvid --enable-libnpp --extra-cflags=-I/usr/local/cuda/include/ --extra-ldflags=-L/usr/local/cuda/lib64/ --enable-nvenc --extra-cflags=-I/opt/intel/mediasdk/include --extra-ldflags=-L/opt/intel/mediasdk/lib --extra-ldflags=-L/opt/intel/mediasdk/plugins --enable-libmfx --enable-libass --enable-vaapi --disable-debug --enable-libvorbis --enable-libvpx --enable-libdrm --enable-opencl --enable-gpl --cpu=native --enable-opengl --enable-libfdk-aac --enable-libx265 --enable-openssl --extra-libs='-lpthread -lm' --enable-nonfree
  libavutil      56. 26.100 / 56. 26.100
  libavcodec     58. 47.103 / 58. 47.103
  libavformat    58. 26.101 / 58. 26.101
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 48.100 /  7. 48.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100

  configuration:
    --pkg-config-flags=--static
    --prefix=/home/brainiarc7/bin
    --bindir=/home/brainiarc7/bin
    --extra-cflags=-I/home/brainiarc7/bin/include
    --extra-ldflags=-L/home/brainiarc7/bin/lib
    --enable-cuda-nvcc
    --enable-cuvid
    --enable-libnpp
    --extra-cflags=-I/usr/local/cuda/include/
    --extra-ldflags=-L/usr/local/cuda/lib64/
    --enable-nvenc
    --extra-cflags=-I/opt/intel/mediasdk/include
    --extra-ldflags=-L/opt/intel/mediasdk/lib
    --extra-ldflags=-L/opt/intel/mediasdk/plugins
    --enable-libmfx
    --enable-libass
    --enable-vaapi
    --disable-debug
    --enable-libvorbis
    --enable-libvpx
    --enable-libdrm
    --enable-opencl
    --enable-gpl
    --cpu=native
    --enable-opengl
    --enable-libfdk-aac
    --enable-libx265
    --enable-openssl
    --extra-libs='-lpthread -lm'
    --enable-nonfree

И вывод из inxi:

inxi -F
System:    Host: cavaliere Kernel: 5.0.0 x86_64 bits: 64 Desktop: Gnome 3.28.3 Distro: Ubuntu 18.04.2 LTS
Machine:   Device: laptop System: ASUSTeK product: Zephyrus M GM501GS v: 1.0 serial: N/A
           Mobo: ASUSTeK model: GM501GS v: 1.0 serial: N/A
           UEFI: American Megatrends v: GM501GS.308 date: 10/01/2018
Battery    BAT0: charge: 49.3 Wh 100.0% condition: 49.3/55.0 Wh (90%)
CPU:       6 core Intel Core i7-8750H (-MT-MCP-) cache: 9216 KB
           clock speeds: max: 4100 MHz 1: 2594 MHz 2: 3197 MHz 3: 3633 MHz 4: 3514 MHz 5: 3582 MHz 6: 3338 MHz
           7: 3655 MHz 8: 3684 MHz 9: 1793 MHz 10: 3651 MHz 11: 3710 MHz 12: 3662 MHz
Graphics:  Card-1: Intel Device 3e9b
           Card-2: NVIDIA GP104M [GeForce GTX 1070 Mobile]
           Display Server: x11 (X.Org 1.19.6 ) drivers: modesetting,nvidia (unloaded: fbdev,vesa,nouveau)
           Resolution: 1920x1080@144.03hz
           OpenGL: renderer: GeForce GTX 1070/PCIe/SSE2 version: 4.6.0 NVIDIA 418.43
Audio:     Card-1 Intel Cannon Lake PCH cAVS driver: snd_hda_intel Sound: ALSA v: k5.0.0
           Card-2 NVIDIA GP104 High Definition Audio Controller driver: snd_hda_intel
           Card-3 Kingston driver: USB Audio
Network:   Card: Intel Wireless-AC 9560 [Jefferson Peak] driver: iwlwifi
           IF: wlo1 state: up mac: (redacted)
Drives:    HDD Total Size: 3050.6GB (94.5% used)
           ID-1: /dev/nvme0n1 model: Samsung_SSD_960_EVO_1TB size: 1000.2GB
           ID-2: /dev/sda model: Crucial_CT2050MX size: 2050.4GB
Partition: ID-1: / size: 246G used: 217G (94%) fs: ext4 dev: /dev/nvme0n1p5
           ID-2: swap-1 size: 8.59GB used: 0.00GB (0%) fs: swap dev: /dev/nvme0n1p6
RAID:      No RAID devices: /proc/mdstat, md_mod kernel module present
Sensors:   System Temperatures: cpu: 64.0C mobo: N/A gpu: 61C
           Fan Speeds (in rpm): cpu: N/A
Info:      Processes: 412 Uptime: 3:32 Memory: 4411.3/32015.5MB Client: Shell (bash) inxi: 2.3.56 

Почему этот последний бит включен:

Я использую последнее ядро ​​Linux на сегодняшний день, версия 5.0. То же самое относится и к стеку графических драйверов в Ubuntu 18.04LTS. FFmpeg был построен, как показано здесь , здесь , поскольку в этом ноутбуке оба графических процессора NVIDIA + Intel включены через Optimus. Таким образом, я могу подключаться к часам VAAPI, QuickSync и NVENC по мере необходимости. Ваш пробег может отличаться , даже если наше оборудование идентично.

Ссылки:

  1. См. Параметры кодера, включая поддерживаемые методы управления скоростью:
ffmpeg -h encoder=vp9_vaapi
  1. См. Фильтр deinterlace_vaapi варианты использования:
ffmpeg -h filter=deinterlace_vaapi

Например, если вы хотите получить вывод с частотой поля, а не с частотой кадров от деинтерлейсера, вы можете вместо этого передать ему опцию rate=field:

-vf=vaapi_deinterlace=rate=field

Эта функция, например, связана с кодировщиками, которые поддерживают MBAFF . Другие, такие как основанные на NVENC в FFmpeg, , не реализовали это (на момент написания статьи).

Советы по продвижению вперед с помощью FFmpeg:

По возможности, делайте выводы из встроенных документов, как в примерах, показанных выше. Они могут выявить потенциальные подводные камни, которых вы можете избежать, понимая, как работает цепочка фильтров и инициализация кодировщика, неподдерживаемые функции и т. Д., А также влияние на производительность.

Например, вы увидите, что в приведенных выше фрагментах мы вызываем деинтерлейсер только один раз, а затем разделяем его 'выход с помощью фильтра split на отдельные скейлеры. Это сделано для снижения накладных расходов, если бы мы вызывали деинтерлейсер более одного раза, и это было бы расточительно.

0
ответ дан 林正浩 8 March 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: