Problemas con la codificación acelerada por hardware ffmpeg y yadif

Problemas con la codificación acelerada por hardware ffmpeg y yadif

Tengo videos entrelazados en un contenedor mts y me gustaría convertirlos a no entrelazados en un contenedor mkv, posiblemente en HEVC.

Intenté la siguiente línea de comando:

ffmpeg -y -hwaccel qsv -c:v h264_qsv -i "2008-07-13 00.08.47.mts" -c:v hevc_qsv -global_quality 20 -look_ahead 1 -vf yadif=1 "test.mkv"

Y me sale error:

Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0: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
Conversion failed!

Cuando elimino -vf yadif=1todo funciona bien, supongo que necesito decirle a ffmpeg que necesita descargar/cargar/convertir el formato de la iGPU a la memoria para que yadif haga el trabajo y cargue nuevamente, pero no tengo idea de cómo hacerlo. .

Respuesta1

https://trac.ffmpeg.org/wiki/HWAccelIntro

https://ffmpeg.org/ffmpeg-filters.html#hwdownload-1

ffmpeg -y -hwaccel qsv -c:v h264_qsv -i "2008-07-13 00.08.47.mts" -c:v hevc_qsv -global_quality 20 -look_ahead 1 -vf hwdownload,format=nv12,yadif=1 "test.mkv"

Otras aceleraciones de HW. https://nico-lab.net/combine_hw_decoder_filter_encoder_with_ffmpeg/

Respuesta2

Puede utilizar el vpp_qsvfiltro acelerado por GPU en la cadena de transcodificación, cuyo uso se puede imprimir mediante:

ffmpeg -h filter=vpp_qsv

En su caso anterior, la solución sería:

ffmpeg -threads 4 -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw -c:v h264_qsv \
-i "2008-07-13 00.08.47.mts" \
-vf "format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4" \
-c:v hevc_qsv  -global_quality 20 "test.mkv"

Explicación:

Para la cadena de filtros de video, vea un argumento adicional extra_hw_frames=64pasado a hwupload, necesario para el tiempo de ejecución de MFX querequiere un tamaño de piscina de estructura fijapara ser preasignado. Utilice un número adecuado a sus necesidades. Generalmente, necesitará un número mayor (64, más o menos) si utiliza funciones comoanticipación (LA-ICQ).

vpp_qsvSe llama al segundo filtro de la cadena para realizar un desentrelazado avanzado mediante la opción deinterlace=2. En este flujo, la decodificación, la transcodificación y el filtrado (en este caso, el desentrelazador) se ejecutan en la GPU. La opción async_depth=4mejora enormemente el rendimiento, como se muestra eneste mensaje de confirmación.

EsteEs por eso que omití la -lookahead 1opción (por ahora). Si eso cambia, lo probaré e informaré sobre lo mismo.

De acuerdo aesteconfirmar, la anticipación para el hevc_qsvcontenedor del codificador también requiere que se active el modo de control de velocidad de bits extendida, por lo que el comando anterior con anticipación se vería así:

ffmpeg -threads 4 -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw -c:v h264_qsv \
-i "2008-07-13 00.08.47.mts" \
-vf "format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4" \
-c:v hevc_qsv  -global_quality 20 -look_ahead 1 -extbrc 1 "test.mkv"

Por favor, pruebe e informe.

Advertencia:

Tenga en cuenta que el SDK requiere al menos 2 subprocesos para evitar un punto muerto, consulteestebloque de código.

información relacionada