
En Linux, estoy intentando codificar un archivo en H€VC usando aceleración de hardware. El intento exitoso es:
ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec libx265 -crf 28 '/path/file.mp4'
pero es lento como 30 fps, " ffmpeg -codecs|grep 265
" muestra: (codificadores: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv hevc_v4l2m2m hevc_vaapi)
así que probé hevc_vaapi:
ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec hevc_vaapi -crf 28 '/path/file.mp4'
pero falla:
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 muestra "
Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm
"
$vaapimuestra esto (parece que va-api está ahí, conductor de mesa)
$ ls /dev/dri/*
/dev/dri/card0 /dev/dri/renderD128
/dev/dri/por-ruta:
pci-0000:0a:00.0-tarjeta pci-0000:0a:00.0-renderizar
¿Qué opinas sobre este error o cómo procederías para descubrir qué parámetros de ffmpeg usar para HW H€VC acelerado?
Actualización: creo que "-hwaccel vaapi" puede ser un parámetro redundante
Respuesta1
Creo que requiere parámetros de codificación adecuados, como -vf 'format=nv12,hwupload'
y seguir una sola línea, puede funcionar si tienecontrolador 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"
Respuesta2
ninguna otra respuesta me ayuda, no hasta que instale intel-media-va-driver-non-free después de la instalación dehttps://wiki.debian.org/HardwareVideoAcceleration.
sudo apt install intel-media-va-driver-non-free
Debería ayudar si estás usando Intel GPU.
Y si necesita escalar el video, use '-vf scale_vaapi=640:360' para escalar el video sin una cadena como 'format=nv12,hwupload'
Respuesta3
Su primer comando muestra que usa la GPU para decodificar, pero la codificación se realiza usando la CPU (libx265). La GPU decodifica rápidamente, pero la CPU solo puede procesar el contenido decodificado después de descargarlo de la memoria de la tarjeta gráfica a la memoria de la computadora. Este proceso de descarga abarca todo el sistema. La sobrecarga es muy alta, incluso excediendo la sobrecarga de codificación y decodificación simultáneas con software puro de CPU, por lo que la velocidad es muy baja; Su segundo comando finalmente decidió usar gpu para decodificar y codificar simultáneamente la aceleración de hardware, pero no le dijo a la gpu que el contenido a codificar ha sido decodificado en la memoria de video por el hardware de la tarjeta gráfica, y usó el parámetro crf de ese hardware. La codificación no es compatible, el hardware La codificación de parámetros similar a crf es qp. PD: Los siguientes son los parámetros que uso habitualmente:
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'
Respuesta4
¿Puedo sugerirle que agregue las dos banderas siguientes:
- -hwaccel vaapi
- -hwaccel_output_format vaapi
entonces la línea de comando se ve así:
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
(en mi computadora, especificar vaapi_device no es necesario)