![Problemas com codificação acelerada por hardware ffmpeg e yadif](https://rvso.com/image/1615251/Problemas%20com%20codifica%C3%A7%C3%A3o%20acelerada%20por%20hardware%20ffmpeg%20e%20yadif.png)
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=1
tudo 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_qsv
filtro 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=64
passado 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_qsv
chamado 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=4
melhora enormemente o desempenho, conforme mostrado emesta mensagem de commit.
Esseé por isso que omiti a -lookahead 1
opção (por enquanto). Se isso mudar, testarei e reportarei o mesmo.
De acordo comessecommit, o lookahead para o hevc_qsv
wrapper 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.