ffmpeg 하드웨어 가속 인코딩 및 yadif 관련 문제

ffmpeg 하드웨어 가속 인코딩 및 yadif 관련 문제

mts 컨테이너에 인터레이스된 비디오가 있고 이를 mkv 컨테이너(아마도 HEVC)에서 비인터레이스로 변환하고 싶습니다.

다음 명령줄을 시도했습니다.

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"

그리고 오류가 발생합니다.

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!

모든 것을 제거하면 -vf yadif=1제대로 작동하고 yadif가 작업을 수행하고 다시 업로드하려면 iGPU에서 메모리로 형식을 다시 다운로드/업로드/변환해야 한다고 ffmpeg에 알려야 한다고 가정하지만 어떻게 해야 할지 모르겠습니다. .

답변1

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"

기타 HW 가속. https://nico-lab.net/combine_hw_decoder_filter_encoder_with_ffmpeg/

답변2

vpp_qsv트랜스코딩 체인에서 GPU 가속 필터를 사용할 수 있으며 , 그 사용법은 다음을 통해 인쇄할 수 있습니다.

ffmpeg -h filter=vpp_qsv

위의 경우 해결책은 다음과 같습니다.

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"

설명:

비디오 필터 체인의 경우 MFX 런타임에 필요한 에 extra_hw_frames=64전달된 추가 인수를 참조하세요.hwupload고정된 프레임 풀 크기가 필요합니다.사전 할당됩니다. 귀하의 요구 사항에 적합한 번호를 사용하십시오. 일반적으로 다음과 같은 기능을 사용하는 경우 더 큰 숫자(64 정도)가 필요합니다.미리보기(LA-ICQ).

체인의 두 번째 필터는 vpp_qsv옵션을 통해 고급 디인터레이싱을 수행하기 위해 호출됩니다 deinterlace=2. 이 흐름에서는 디코딩, 트랜스코딩 및 필터링(이 경우 디인터레이서)이 모두 GPU에서 실행됩니다. 이 옵션은 async_depth=4다음과 같이 성능을 대폭 향상시킵니다.이 커밋 메시지.

이것이것이 내가 -lookahead 1(지금은) 옵션을 생략한 이유입니다. 변경 사항이 있으면 테스트하고 다시 보고하겠습니다.

에 따르면이것인코더 래퍼 에 대한 커밋, 미리 보기에는 hevc_qsv확장된 비트 전송률 제어 모드도 켜야 하므로 미리 보기가 포함된 이전 명령은 다음과 같습니다.

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"

친절하게 테스트하고 다시보고하십시오.

경고:

교착 상태를 방지하려면 SDK에 최소 2개의 스레드가 필요합니다.이것코드 블록.

관련 정보