Как использовать графический процессор для ускорения обработки фильтра ffmpeg? - PullRequest
2 голосов
/ 15 апреля 2019

Согласно веб-сайту разработчика NVIDIA, вы можете использовать графический процессор для ускорения рендеринга фильтра ffmpeg.

Создание высокопроизводительной сквозной аппаратно-ускоренной обработки видео, 1: Nконвейер кодирования и транскодирования 1: N с использованием встроенных> фильтров в FFmpeg

Возможность добавления собственных настраиваемых высокопроизводительных фильтров CUDA с использованием реализации общего контекста CUDA в FFmpeg

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

Например:

ffmpeg -loop 1 -i dog.jpg -filter_complex "scale=iw*4:-1,zoompan=z='zoom+0.002':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=720x960" -pix_fmt yuv420p -vcodec libx264 -preset ultrafast -y -r:v 25 -t 5 -crf 28 dog.mp4

Ответы [ 3 ]

5 голосов
/ 18 апреля 2019

Когда дело доходит до аппаратного ускорения в FFmpeg, вы можете ожидать следующие реализации по типу:

1. Кодеры с аппаратным ускорением: В случае NVIDIA NVENC поддерживается и реализуется через оболочки h264_nvenc и hevc_nvenc. См. этот ответ о том, как их настроить, и любые ограничения, с которыми вы можете столкнуться в зависимости от того, какое оборудование вы используете.

2. Фильтры с аппаратным ускорением: Фильтры, выполняющие такие функции, как масштабирование и постобработка (деинтерлейсинг и т. Д.), Доступны в FFmpeg, а некоторые реализации с аппаратным ускорением. Для NVIDIA следующие фильтры могут использовать аппаратное ускорение:

(а). scale_cuda : Это масштабный фильтр, аналогичный универсальному масштабному фильтру, реализованному в CUDA. Его зависимость - проект ffnvcodec , заголовки которого также необходимы для включения кодировщиков на основе NVENC. Когда присутствуют заголовки ffnvcodec, соответствующие фильтры, зависящие от него (scale_cuda и yadif_cuda), будут автоматически включены. В производстве может быть целесообразно отказаться от этого фильтра в пользу scale_npp, поскольку он имеет очень ограниченный набор опций.

(б). scale_npp : это масштабирующий фильтр, реализованный в примитивах производительности NVIDIA . Его основная зависимость - CUDA SDK , и она должна быть явно включена путем передачи флагов --enable-libnpp, --enable-cuda-nvcc и --enable-nonfree в ./configure во время компиляции при сборке FFmpeg из исходного кода. Используйте этот фильтр вместо scale_cuda везде, где это возможно.

* 1 034 * (с). yadif_cuda : Это деинтерлейсер, реализованный в CUDA. Его зависимость, как указано выше, представляет собой пакет заголовков ffnvcodec. * * Одна тысяча тридцать восемь (д). Все фильтры на основе OpenCL: Все графические процессоры с поддержкой NVENC, поддерживаемые как основным драйвером NVIDIA, так и CUDA SDK, поддерживают OpenCL. Я начал этот раздел с этого пояснения, потому что есть новости, что NVIDIA будет отказываться от мобильных графических процессоров Kepler в их основном драйвере , переводя их в статус поддержки Legacy. По этой причине, если вы находитесь на такой платформе, примите это во внимание.

Чтобы включить эти фильтры, передайте --enable-opencl сценарию ./configure FFmpeg во время сборки. Обратите внимание, что для этого требуется, чтобы заголовки OpenCL присутствовали в вашей системе, и ваш менеджер пакетов мог бы их безопасно удовлетворить в любом дистрибутиве Linux. В других операционных системах ваш пробег может отличаться.

Чтобы увидеть все фильтры на основе OpenCL, выполните:

ffmpeg -h filters | grep opencl

Несколько примечательных примеров: unsharp_opencl, avgblur_opencl и т. Д. См. этот раздел вики для получения дополнительных опций.

Примечание, касающееся производительности с фильтрами OpenCL: Пожалуйста, примите во внимание любые накладные расходы, которые механизмы, представленные цепочками фильтров, такие как hwupload и hwdownload, могут внести в ваш конвейер, так как загрузка текстур в и из системной памяти и рассматриваемого ускорителя будет влиять на производительность, и поэтому будет выполнять операции преобразования формата (через фильтр format), где это необходимо / необходимо. В этом случае может быть полезно воспользоваться фильтром hwmap и получать контексты, где это применимо. Например, VAAPI имеет механизм, который позволяет извлекать устройства OpenCL и выполнять обратное сопоставление через hwmap, если присутствует cl_intel_va_api_media_sharing расширение OpenCL . Обычно это обеспечивается Beignet ICD и отсутствует в других, например, в более новом Neo OpenCL драйвере .

3. Аппаратно-ускоренные декодеры (и связанные с ними оболочки): В зависимости от вашего источника входного сигнала и возможностей вашего графического процессора NVIDIA, в зависимости от поколения, вы также можете использовать аппаратное ускорение на основе CUVID или NVDEC. Эти методы отличаются тем, как они обрабатывают текстуры в полете на ускорителе, и разумно оценивать другие факторы, такие как использование VRAM, когда они используются.Как правило, при желании вы можете использовать hwaccels на основе CUVID для таких операций, как деинтерлейсинг. Смотрите их использование через:

ffmpeg -h decoder=h264_cuvid
ffmpeg -h decoder=hevc_cuvid
ffmpeg -h decoder=mpeg2_cuvid

Однако следует помнить, что обработка кодированного контента MBAFF с помощью этих декодеров, где требуется двойное деинтерлейсинг, не рекомендуется, поскольку NVIDIA еще не реализовала поддержку MBAFF в серверной части. Взгляните на эту тему , чтобы узнать больше о том же.

В заключение: Целесообразно оценить, где и когда аппаратная ускоренная разгрузка (фильтрация, кодирование и декодирование) предлагает преимущество или приемлемый компромисс (по качеству, поддержке функций и надежности) в вашем трубопровод до развертывания в производство. Это независимый от производителя подход при принятии решения о том, что и когда разгружать части вашего конвейера, и то же самое относится к решениям NVIDIA.

Для получения дополнительной информации см. Запись аппаратного ускорения в вики FFmpeg .

Образцы, демонстрирующие использование аппаратно-ускоренной фильтрации, кодирования и декодирования на основе приведенных выше примечаний:

1. Продемонстрировать использование кодировки 1: N с NVENC:

Сделано следующее предположение: на испытательном стенде присутствует только один графический процессор с поддержкой NVENC, простой GTX 1070. По этой причине я ограничен двумя одновременными сеансами NVENC, что учитывается в приведенных ниже фрагментах кода. , Имейте в виду, что в случаях, когда необходимо использовать несколько графических процессоров с поддержкой NVENC, потребуется соответствующим образом изменить командную строку (и).

Мои файлы примеров находятся в ~/Desktop/src

Я буду работать с файлом примера, как показано ниже:

ffprobe -i deint-testfile.mkv -show_format -hide_banner -show_streams

Input #0, matroska,webm, from 'deint-testfile.mkv':
  Metadata:
    encoder         : libebml v1.3.3 + libmatroska v1.4.4
    creation_time   : 2016-03-02T23:20:05.000000Z
  Duration: 00:04:56.97, start: 0.066000, bitrate: 31036 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 59.94 fps, 59.94 tbr, 1k tbn, 59.94 tbc (default)
    Metadata:
      BPS             : 29131349
      BPS-eng         : 29131349
      DURATION        : 00:04:56.896000000
      DURATION-eng    : 00:04:56.896000000
      NUMBER_OF_FRAMES: 17598
      NUMBER_OF_FRAMES-eng: 17598
      NUMBER_OF_BYTES : 1081122637
      NUMBER_OF_BYTES-eng: 1081122637
      _STATISTICS_WRITING_APP: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_APP-eng: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_DATE_UTC: 2016-03-02 23:20:05
      _STATISTICS_WRITING_DATE_UTC-eng: 2016-03-02 23:20:05
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
    Stream #0:1: Audio: dts (DTS-HD MA), 48000 Hz, stereo, s32p (24 bit) (default)
    Metadata:
      BPS             : 1907258
      BPS-eng         : 1907258
      DURATION        : 00:04:56.896000000
      DURATION-eng    : 00:04:56.896000000
      NUMBER_OF_FRAMES: 27834
      NUMBER_OF_FRAMES-eng: 27834
      NUMBER_OF_BYTES : 70782196
      NUMBER_OF_BYTES-eng: 70782196
      _STATISTICS_WRITING_APP: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_APP-eng: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_DATE_UTC: 2016-03-02 23:20:05
      _STATISTICS_WRITING_DATE_UTC-eng: 2016-03-02 23:20:05
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_time_base=317/38002
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=1920
height=1080
coded_width=1920
coded_height=1088
has_b_frames=1
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=41
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=tt
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=19001/317
avg_frame_rate=19001/317
time_base=1/1000
start_pts=66
start_time=0.066000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:BPS=29131349
TAG:BPS-eng=29131349
TAG:DURATION=00:04:56.896000000
TAG:DURATION-eng=00:04:56.896000000
TAG:NUMBER_OF_FRAMES=17598
TAG:NUMBER_OF_FRAMES-eng=17598
TAG:NUMBER_OF_BYTES=1081122637
TAG:NUMBER_OF_BYTES-eng=1081122637
TAG:_STATISTICS_WRITING_APP=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_APP-eng=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_DATE_UTC=2016-03-02 23:20:05
TAG:_STATISTICS_WRITING_DATE_UTC-eng=2016-03-02 23:20:05
TAG:_STATISTICS_TAGS=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
TAG:_STATISTICS_TAGS-eng=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[/STREAM]
[STREAM]
index=1
codec_name=dts
codec_long_name=DCA (DTS Coherent Acoustics)
profile=DTS-HD MA
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=s32p
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/1000
start_pts=76
start_time=0.076000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=24
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:BPS=1907258
TAG:BPS-eng=1907258
TAG:DURATION=00:04:56.896000000
TAG:DURATION-eng=00:04:56.896000000
TAG:NUMBER_OF_FRAMES=27834
TAG:NUMBER_OF_FRAMES-eng=27834
TAG:NUMBER_OF_BYTES=70782196
TAG:NUMBER_OF_BYTES-eng=70782196
TAG:_STATISTICS_WRITING_APP=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_APP-eng=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_DATE_UTC=2016-03-02 23:20:05
TAG:_STATISTICS_WRITING_DATE_UTC-eng=2016-03-02 23:20:05
TAG:_STATISTICS_TAGS=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
TAG:_STATISTICS_TAGS-eng=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[/STREAM]
[FORMAT]
filename=deint-testfile.mkv
nb_streams=2
nb_programs=0
format_name=matroska,webm
format_long_name=Matroska / WebM
start_time=0.066000
duration=296.972000
size=1152134036
bit_rate=31036839
probe_score=100
TAG:encoder=libebml v1.3.3 + libmatroska v1.4.4
TAG:creation_time=2016-03-02T23:20:05.000000Z
[/FORMAT]

С этой информацией мы можем сказать, что входной файл деинтерлейсирован, закодирован со скоростью 59,94 FPS. В приведенных ниже примерах я нацеливаюсь на ту же частоту кадров, используя закрытую GOP, предполагая фиксированное расстояние до ключевого кадра, равное 2 секундам (устанавливается -g 120, где -r=60).

Я могу запустить этот пример кодера, как показано, демонстрируя два варианта использования:

  1. Используйте декодер на основе cuvid (h264_cuvid) в качестве деинтерлейсера (обратите внимание, что формат ввода H.264 / AVC, и поэтому мы используем правильный декодер):

   ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -surfaces 8 -deint 2 -drop_second_field 1 \
   -threads:v 2 -threads:a 4 -filter_complex_threads 4 -filter_threads 4 \
   -i 'deint-testfile.mkv' -filter_complex \
  "[0:v:0]split=2[a][b]; \
   [a]scale_npp=w=1280:h=720:interp_algo=lanczos,hwdownload,format=nv12[c]; \
   [b]scale_npp=w=640:h=360:interp_algo=lanczos,hwdownload,format=nv12[d]" \
   -bsf:a aac_adtstoasc -af "aresample=async=1:min_hard_comp=0.100000:first_pts=0" -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 \
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 400k -c:v:0 h264_nvenc -pix_fmt nv12 -qp:v:0 19  \
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.1 -r:v:0 59.94 -g:v:0 120 -bf:v:0 3 -strict_gop:v:0 1 \
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 280k -c:v:1 h264_nvenc -pix_fmt nv12 -qp:v:1 19  \
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.1 -r:v:1 59.94 -g:v:1 120 -bf:v:1 3 -strict_gop:v:1 1 \
  -flags +global_header+low_delay -fflags +genpts \
  -map "[c]" -map "[d]" -map a:0 \
  -f tee  \
  "[select=\'v:0,a\':f=flv]"/home/brainiarc7/Desktop/src/cheeks0.flv"| \
   [select=\'v:1,a\':f=flv]"/home/brainiarc7/Desktop/src/cheeks1.flv""

2. Используйте hvaccel nvdec в паре с деинтерлейсером yadif_cuda:


   ffmpeg -y -hwaccel nvdec \
   -threads:v 2 -threads:a 4 -filter_complex_threads 4 -filter_threads 4 \
   -i 'deint-testfile.mkv' -filter_complex \
  "[0:v:0]hwupload_cuda,yadif_cuda=0:-1:1,split=2[a][b]; \
   [a]scale_npp=w=1280:h=720:interp_algo=lanczos,hwdownload,format=nv12[c]; \
   [b]scale_npp=w=640:h=360:interp_algo=lanczos,hwdownload,format=nv12[d]" \
   -bsf:a aac_adtstoasc -af "aresample=async=1:min_hard_comp=0.100000:first_pts=0" -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 \
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 400k -c:v:0 h264_nvenc -pix_fmt nv12 -qp:v:0 19  \
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.1 -r:v:0 59.94 -g:v:0 120 -bf:v:0 3 -strict_gop:v:0 1 \
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 280k -c:v:1 h264_nvenc -pix_fmt nv12 -qp:v:1 19  \
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.1 -r:v:1 59.94 -g:v:1 120 -bf:v:1 3 -strict_gop:v:1 1 \
  -flags +global_header+low_delay -fflags +genpts \
  -map "[c]" -map "[d]" -map a:0 \
  -f tee  \
  "[select=\'v:0,a\':f=flv]"/home/brainiarc7/Desktop/src/cheeks0.flv"| \
   [select=\'v:1,a\':f=flv]"/home/brainiarc7/Desktop/src/cheeks1.flv""

Обратите внимание, что мы используем дополнительный фильтр перед деинтерлейсером yadif_cuda, hwupload_cuda. Когда мы вызываем фильтр hwupload_cuda, он автоматически создает тип устройства cuda, преобразует все текстуры в полете в формат cuda и загружает их в общий аппаратный контекст CUDA, из которого может работать последний фильтр yadif_cuda.

Параметры, указанные для фильтра yadif_cuda: (А). Установите режим деинтерлейсинга как отправка одного кадра для каждого кадра. (Б). Установите предполагаемый паритет типа изображения как автоматический. (С). Чтобы деинтерлейсировать только кадры, помеченные как деинтерлейсированные.

Вы можете подтвердить это, запустив:

ffmpeg -h filter=yadif_cuda

Вы также можете попробовать двойное деинтерлейсинг (при котором деинтерлейсер отправляет один кадр на поле вместо одного кадра на кадр), применяя параметры деинтерлейсера ниже (см. Параметры фильтра, переданные в yadif_cuda=1:-1:1):


   ffmpeg -y -hwaccel nvdec \
   -threads:v 2 -threads:a 4 -filter_complex_threads 4 -filter_threads 4 \
   -i 'deint-testfile.mkv' -filter_complex \
  "[0:v:0]hwupload_cuda,yadif_cuda=1:-1:1,split=2[a][b]; \
   [a]scale_npp=w=1280:h=720:interp_algo=lanczos,hwdownload,format=nv12[c]; \
   [b]scale_npp=w=640:h=360:interp_algo=lanczos,hwdownload,format=nv12[d]" \
   -bsf:a aac_adtstoasc -af "aresample=async=1:min_hard_comp=0.100000:first_pts=0" -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 \
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 400k -c:v:0 h264_nvenc -pix_fmt nv12 -qp:v:0 19  \
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.1 -r:v:0 59.94 -g:v:0 120 -bf:v:0 3 -strict_gop:v:0 1 \
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 280k -c:v:1 h264_nvenc -pix_fmt nv12 -qp:v:1 19  \
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.1 -r:v:1 59.94 -g:v:1 120 -bf:v:1 3 -strict_gop:v:1 1 \
  -flags +global_header+low_delay -fflags +genpts \
  -map "[c]" -map "[d]" -map a:0 \
  -f tee  \
  "[select=\'v:0,a\':f=flv]"/home/brainiarc7/Desktop/src/cheeks0.flv"| \
   [select=\'v:1,a\':f=flv]"/home/brainiarc7/Desktop/src/cheeks1.flv""

Однако будьте осторожны с этой опцией, поскольку она может давать сбой при определенных частотах кадров. В моем тестировании использование чересстрочного контента NTSC со скоростью 29,970 кадров в секунду привело к ошибке при попытке двойного деинтерлейсинга. Ваш пробег может отличаться.

3. Демонстрация использования фильтра OpenCL с графическим процессором NVIDIA:

В этом случае мы будем использовать фильтр tonemap_opencl со следующими параметрами использования:

ffmpeg -h filter=tonemap_opencl
Filter tonemap_opencl
  perform HDR to SDR conversion with tonemapping
    Inputs:
       #0: default (video)
    Outputs:
       #0: default (video)
tonemap_opencl AVOptions:
  tonemap           <int>        ..FV..... tonemap algorithm selection (from 0 to 6) (default none)
     none                         ..FV.....
     linear                       ..FV.....
     gamma                        ..FV.....
     clip                         ..FV.....
     reinhard                     ..FV.....
     hable                        ..FV.....
     mobius                       ..FV.....
  transfer          <int>        ..FV..... set transfer characteristic (from -1 to INT_MAX) (default bt709)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  t                 <int>        ..FV..... set transfer characteristic (from -1 to INT_MAX) (default bt709)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  matrix            <int>        ..FV..... set colorspace matrix (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  m                 <int>        ..FV..... set colorspace matrix (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  primaries         <int>        ..FV..... set color primaries (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  p                 <int>        ..FV..... set color primaries (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  range             <int>        ..FV..... set color range (from -1 to INT_MAX) (default -1)
     tv                           ..FV.....
     pc                           ..FV.....
     limited                      ..FV.....
     full                         ..FV.....
  r                 <int>        ..FV..... set color range (from -1 to INT_MAX) (default -1)
     tv                           ..FV.....
     pc                           ..FV.....
     limited                      ..FV.....
     full                         ..FV.....
  format            <pix_fmt>    ..FV..... output pixel format (default none)
  peak              <double>     ..FV..... signal peak override (from 0 to DBL_MAX) (default 0)
  param             <double>     ..FV..... tonemap parameter (from DBL_MIN to DBL_MAX) (default nan)
  desat             <double>     ..FV..... desaturation parameter (from 0 to DBL_MAX) (default 0.5)
  threshold         <double>     ..FV..... scene detection threshold (from 0 to DBL_MAX) (default 0.2)

Используемый файл примера имеет встроенные метаданные HDR, и с помощью кодеров NVENC будет кодироваться на пару выходов с применением тонального отображения. Используемый файл примера взят из этого URL.

Из ffprobe:

ffprobe -i lgnyhdrdemo.ts -show_streams -hide_banner -show_format
[mpegts @ 0x55f34f8bbf80] start time for stream 1 is not set in estimate_timings_from_pts
[mpegts @ 0x55f34f8bbf80] Could not find codec parameters for stream 1 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels): unspecified sample format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mpegts, from 'lgnyhdrdemo.ts':
  Duration: 00:01:12.24, start: 0.999989, bitrate: 52032 kb/s
  Program 1 
    Stream #0:0[0x101]: Video: hevc (Main 10) ([36][0][0][0] / 0x0024), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x102](und): Audio: aac ([15][0][0][0] / 0x000F), 0 channels
[STREAM]
index=0
codec_name=hevc
codec_long_name=H.265 / HEVC (High Efficiency Video Coding)
profile=Main 10
codec_type=video
codec_time_base=1/25
codec_tag_string=[36][0][0][0]
codec_tag=0x0024
width=3840
height=2160
coded_width=3840
coded_height=2160
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p10le
level=150
color_range=tv
color_space=bt2020nc
color_transfer=smpte2084
color_primaries=bt2020
chroma_location=unspecified
field_order=unknown
timecode=N/A
refs=1
id=0x101
r_frame_rate=25/1
avg_frame_rate=25/1
time_base=1/90000
start_pts=89999
start_time=0.999989
duration_ts=6501600
duration=72.240000
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=unknown
codec_type=audio
codec_time_base=1/0
codec_tag_string=[15][0][0][0]
codec_tag=0x000f
sample_fmt=unknown
sample_rate=0
channels=0
channel_layout=unknown
bits_per_sample=0
id=0x102
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/90000
start_pts=89999
start_time=0.999989
duration_ts=6501600
duration=72.240000
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=und
[/STREAM]
[FORMAT]
filename=lgnyhdrdemo.ts
nb_streams=2
nb_programs=1
format_name=mpegts
format_long_name=MPEG-TS (MPEG-2 Transport Stream)
start_time=0.999989
duration=72.240000
size=469857120
bit_rate=52032903
probe_score=50
[/FORMAT]

Теперь давайте применим фильтр tonemap_opencl к предыдущей команде, переключимся на новый входной файл и синхронизируем команду:


   time ffmpeg -y -hwaccel nvdec -init_hw_device opencl=ocl -filter_hw_device ocl \
   -threads:v 2 -threads:a 4 -filter_complex_threads 4 -filter_threads 4 \
   -i 'lgnyhdrdemo.ts' -filter_complex \
  "[0:v:0]hwupload,tonemap_opencl=t=bt2020:tonemap=hable:desat=0:format=nv12,split=2[a][b]; \
   [a]hwdownload,format=nv12,hwupload_cuda,scale_npp=w=1280:h=720:interp_algo=lanczos,hwdownload,format=nv12[c]; \
   [b]hwdownload,format=nv12,hwupload_cuda,scale_npp=w=640:h=360:interp_algo=lanczos,hwdownload,format=nv12[d]" \
   -bsf:a aac_adtstoasc -af "aresample=async=1:min_hard_comp=0.100000:first_pts=0" -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 \
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 480k -c:v:0 h264_nvenc -pix_fmt nv12 -qp:v:0 19  \
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.1 -r:v:0 25 -g:v:0 50 -bf:v:0 3 -strict_gop:v:0 1 \
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 672k -c:v:1 h264_nvenc -pix_fmt nv12 -qp:v:1 19  \
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.1 -r:v:1 25 -g:v:1 50 -bf:v:1 3 -strict_gop:v:1 1 \
  -flags +global_header+low_delay -fflags +genpts \
  -map "[c]" -map "[d]" -map a:0 \
  -f tee  \
  "[select=\'v:0,a\':f=flv]"/home/brainiarc7/Desktop/src/tonemapped0.flv"| \
   [select=\'v:1,a\':f=flv]"/home/brainiarc7/Desktop/src/tonemapped1.flv""

Согласно FFmpeg, это заняло:

frame= 1806 fps= 37 q=2.0 Lq=2.0 size=N/A time=00:01:12.20 bitrate=N/A speed=1.49x      
video:84533kB audio:1068kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[aac @ 0x562e85cc9b00] Qavg: 4252.148

real    0m48.894s
user    0m45.710s
sys 0m17.049s

Подробнее о тональном отображении см. эта отличная запись.

0 голосов
/ 16 апреля 2019

Возможное решение. Не проверено, поэтому дайте мне знать о любых ошибках ...

ffmpeg -loglevel debug -hwaccel NVENC -loop 1 -i dog.jpg -filter_complex "scale=iw*4:-1,zoompan=z='zoom+0.002':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=720x960" -pix_fmt yuv420p -vcodec h264_nvenc -preset ultrafast -y -r:v 25 -t 5 -crf 28 dog.mp4

Где ты ...

  • Инициализация кодировки NVIDIA с помощью -hwaccel NVENC.

  • Установить кодек как -vcodec h264_nvenc.

0 голосов
/ 16 апреля 2019

Вам нужно будет скомпилировать свою собственную сборку ffmpeg с использованием их расширений - см. Инструкции https://developer.nvidia.com/ffmpeg, поскольку стандартный двоичный файл не включает эти возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...