Как использовать графический процессор для ускорения обработки фильтра ffmpeg?
Согласно веб-сайту разработчика 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 ответа
Что касается аппаратного ускорения в 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
где это возможно.
(С). yadif_cuda: это деинтерлейсер, реализованный в CUDA. Его зависимость, как указано выше, представляет собой пакет заголовков ffnvcodec.
(Г). Все фильтры на основе OpenCL. Все графические процессоры с поддержкой NVENC, поддерживаемые как основным драйвером NVIDIA, так и CUDA SDK, поддерживают OpenCL. Я начал этот раздел с этого пояснения, потому что есть новости, что NVIDIA будет отказываться от мобильных графических процессоров Kepler в своих основных драйверах, переводя их в статус поддержки Legacy. По этой причине, если вы находитесь на такой платформе, примите это во внимание.
Чтобы включить эти фильтры, передайте --enable-opencl
к FFmpeg's ./configure
скрипт во время сборки. Обратите внимание, что для этого требуется, чтобы заголовки 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 присутствует. Обычно это обеспечивается ICD Beignet и отсутствует в других, таких как более новый драйвер 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
).
Я могу запустить этот пример кодера, как показано, демонстрируя два варианта использования:
- Используйте декодер на основе 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
Для получения дополнительной информации о тональном отображении см. Эту превосходную статью.
Возможное решение. Не проверено, поэтому дайте мне знать о любых ошибках...
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
,
Вам нужно будет скомпилировать свою собственную сборку ffmpeg с использованием их расширений - см. Инструкции на https://developer.nvidia.com/ffmpeg поскольку стандартный двоичный файл не включает эти возможности.