ffmpeg hevc_vaapi: Невозможно преобразовать между форматами, поддерживаемыми фильтром «Parsed_null_0» и фильтром «auto_scaler_0»

ffmpeg hevc_vaapi: Невозможно преобразовать между форматами, поддерживаемыми фильтром «Parsed_null_0» и фильтром «auto_scaler_0»

на Linux я пытаюсь закодировать файл в H€VC с использованием аппаратного ускорения. Успешная попытка:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec libx265 -crf 28 '/path/file.mp4'

но он медленный, около 30 кадров в секунду, " ffmpeg -codecs|grep 265" показывает: (кодировщики: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv hevc_v4l2m2m hevc_vaapi )

поэтому я попробовал hevc_vaapi:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec hevc_vaapi -crf 28 '/path/file.mp4'

но это не удается:

Impossible to convert between the formats supported by the filter 'Parsed_null_0' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
[AVIOContext @ 0x55d831121340] Statistics: 0 seeks, 0 writeouts
[aac @ 0x55d831142a00] Qavg: 30414.529
[aac @ 0x55d831142a00] 2 frames left in the queue on closing
[AVIOContext @ 0x55d831109ec0] Statistics: 65536 bytes read, 0 seeks
Conversion failed!

$ ffmpeg -hwaccels показывает "

Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm

"

$ ваапипоказывает это (кажется, va-api есть, драйвер mesa)

$ ls /dev/dri/*

/dev/dri/card0 /dev/dri/renderD128

/dev/dri/by-path:

pci-0000:0a:00.0-карта pci-0000:0a:00.0-рендер

Что вы думаете об этой ошибке или как бы вы попытались выяснить, какие параметры ffmpeg использовать для аппаратного ускорения H€VC?

Обновление: я думаю, что «-hwaccel vaapi» может быть избыточным параметром

решение1

Я думаю, что это требует правильных параметров кодирования, таких как -vf 'format=nv12,hwupload'и следующая однострочная конструкция может сработать, если у вас естьДрайвер VAAPI:

echo "Input file:" && read -r i && echo "Quality: 25=identic, 30=a bit worse but small file size, or other numbers:" && read -r q && ffmpeg -vaapi_device /dev/dri/renderD128 -i "$i" -vf 'format=nv12,hwupload' -c:v hevc_vaapi -f mp4 -rc_mode 1 -qp "$q" "$i.hevc.mp4"

решение2

Ни один из других ответов мне не помог, пока я не установлю intel-media-va-driver-non-free после установкиhttps://wiki.debian.org/HardwareVideoAcceleration.

sudo apt install intel-media-va-driver-non-free

Это должно помочь, если вы используете графический процессор Intel.

А если вам нужно масштабировать видео, используйте '-vf scale_vaapi=640:360' для масштабирования видео без строки, например 'format=nv12,hwupload'

решение3

Ваша первая команда показывает, что вы используете GPU для декодирования, но кодирование выполняется с использованием CPU (libx265). GPU декодирует быстро, но декодированный контент может быть обработан CPU только после того, как он будет загружен из памяти видеокарты в память компьютера. Этот процесс загрузки является общесистемным. Накладные расходы очень высоки, даже превышая накладные расходы одновременного кодирования и декодирования с помощью программного обеспечения cpu pure, поэтому скорость очень низкая; Ваша вторая команда наконец решила использовать GPU для одновременного декодирования и кодирования аппаратного ускорения, но вы не сообщили GPU, что кодируемый контент был декодирован в видеопамять аппаратным обеспечением видеокарты, и вы использовали параметр crf, который аппаратное кодирование не поддерживает, аппаратный параметр кодирования, аналогичный crf, — qp. PS: Ниже приведены параметры, которые я обычно использую:

ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i '/path/file.mkv' -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -c:v hevc_vaapi  -qp 24  -filter:a volume=1.5 -ar 44100 -acodec aac -ab 64k -y '/path/file_n.mkv'

решение4

Могу ли я предложить вам добавить два следующих флага:

  • -хваксель ваапи
  • -hwaccel_output_format vaapi

поэтому командная строка выглядит так:

ffmpeg -v verbose -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i INPUT.VIDEO -vf 'format=nv12,hwupload' -c:v hevc_vaapi OUTPUT.mp4

(на моем компьютере указывать vaapi_device не обязательно)

Связанный контент