![Problemas con la codificación acelerada por hardware ffmpeg y yadif](https://rvso.com/image/1615251/Problemas%20con%20la%20codificaci%C3%B3n%20acelerada%20por%20hardware%20ffmpeg%20y%20yadif.png)
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=1
todo 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_qsv
filtro 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=64
pasado 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_qsv
Se 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=4
mejora enormemente el rendimiento, como se muestra eneste mensaje de confirmación.
EsteEs por eso que omití la -lookahead 1
opción (por ahora). Si eso cambia, lo probaré e informaré sobre lo mismo.
De acuerdo aesteconfirmar, la anticipación para el hevc_qsv
contenedor 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.