Problemas com codificação acelerada por hardware ffmpeg e yadif

Problemas com codificação acelerada por hardware ffmpeg e yadif

Eu tenho vídeos entrelaçados no contêiner mts e gostaria de convertê-los para não entrelaçados no contêiner mkv, possivelmente em HEVC.

Tentei seguir a linha 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"

E recebo um erro:

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!

Quando eu removo -vf yadif=1tudo funciona bem, presumo que preciso dizer ao ffmpeg que ele precisa baixar/carregar/converter o formato do iGPU de volta para a memória para que o yadif faça o trabalho e carregue novamente, mas não tenho ideia de como fazer isso .

Responder1

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"

Outras acelerações de HW. https://nico-lab.net/combine_hw_decoder_filter_encoder_with_ffmpeg/

Responder2

Você pode usar o vpp_qsvfiltro acelerado por GPU na cadeia de transcodificação, cujo uso pode ser impresso via:

ffmpeg -h filter=vpp_qsv

No seu caso acima, a solução seria:

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"

Explicação:

Para a cadeia de filtros de vídeo, veja um argumento extra extra_hw_frames=64passado para hwupload, necessário para o tempo de execução do MFX querequer um tamanho fixo de pool de quadrosa ser pré-alocado. Use um número adequado às suas necessidades. Geralmente, você precisará de um número maior (64 ou próximo) se estiver usando recursos comoantecipação (LA-ICQ).

O segundo filtro da cadeia é vpp_qsvchamado para realizar desentrelaçamento avançado por meio da opção deinterlace=2. Neste fluxo, a decodificação, transcodificação e filtragem (neste caso, o desentrelaçamento) são executadas na GPU. A opção async_depth=4melhora enormemente o desempenho, conforme mostrado emesta mensagem de commit.

Esseé por isso que omiti a -lookahead 1opção (por enquanto). Se isso mudar, testarei e reportarei o mesmo.

De acordo comessecommit, o lookahead para o hevc_qsvwrapper do codificador também requer que o modo de controle de taxa de bits estendido seja ativado, então o comando anterior com lookahead ficaria assim:

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, teste e relate.

Aviso:

Observe que o SDK requer pelo menos 2 threads para evitar deadlock, consulteessebloco de código.

informação relacionada