ffmpeg hevc_vaapi: 'Parsed_null_0' 필터와 'auto_scaler_0' 필터에서 지원하는 형식 간 변환이 불가능합니다.

ffmpeg hevc_vaapi: 'Parsed_null_0' 필터와 'auto_scaler_0' 필터에서 지원하는 형식 간 변환이 불가능합니다.

Linux에서 하드웨어 가속을 사용하여 파일을 H€VC로 인코딩하려고 합니다. 성공적인 시도는 다음과 같습니다:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec libx265 -crf 28 '/path/file.mp4'

하지만 30fps 정도로 느립니다. " ffmpeg -codecs|grep 265"는 다음과 같이 표시됩니다. (인코더: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv hevc_v4l2m2m hevc_vaapi )

그래서 나는 hevc_vaapi를 시도했습니다:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec hevc_vaapi -crf 28 '/path/file.mp4'

하지만 실패합니다.

Impossible to convert between the formats supported by the filter 'Parsed_null_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
[AVIOContext @ 0x55d831121340] Statistics: 0 seeks, 0 writeouts
[aac @ 0x55d831142a00] Qavg: 30414.529
[aac @ 0x55d831142a00] 2 frames left in the queue on closing
[AVIOContext @ 0x55d831109ec0] Statistics: 65536 bytes read, 0 seeks
Conversion failed!

$ ffmpeg -hwaccels는 "를 보여줍니다.

Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm

"

$바피이것을 보여줍니다 (va-api가 있는 것 같습니다, 메사 드라이버)

$ ls /dev/dri/*

/dev/dri/card0 /dev/dri/renderD128

/dev/dri/by-경로:

pci-0000:0a:00.0-카드 pci-0000:0a:00.0-렌더링

이 오류에 대해 어떻게 생각하시나요? 아니면 HW H€VC 가속에 사용할 ffmpeg 매개변수를 어떻게 찾을 수 있나요?

업데이트: "-hwaccel vaapi"가 중복 매개변수일 수 있다고 생각합니다.

답변1

-vf 'format=nv12,hwupload'나는 그것이 하나의 라이너와 같은 적절한 인코딩 매개 변수가 필요하다고 생각합니다.VAAPI 드라이버:

echo "Input file:" && read -r i && echo "Quality: 25=identic, 30=a bit worse but small file size, or other numbers:" && read -r q && ffmpeg -vaapi_device /dev/dri/renderD128 -i "$i" -vf 'format=nv12,hwupload' -c:v hevc_vaapi -f mp4 -rc_mode 1 -qp "$q" "$i.hevc.mp4"

답변2

설치 후 intel-media-va-driver-non-free를 설치할 때까지는 다른 대답이 도움이 되지 않습니다.https://wiki.debian.org/HardwareVideoAcceleration.

sudo apt install intel-media-va-driver-non-free

인텔 GPU를 사용하는 경우 도움이 될 것입니다.

그리고 비디오 크기를 조정해야 하는 경우 'format=nv12,hwupload'와 같은 문자열 없이 '-vf scale_vaapi=640:360'을 사용하여 비디오 크기를 조정하세요.

답변3

첫 번째 명령은 GPU를 사용하여 디코딩하지만 인코딩은 CPU(libx265)를 사용하여 수행됨을 보여줍니다. GPU는 빠르게 디코딩하지만 디코딩된 콘텐츠는 그래픽 카드 메모리에서 컴퓨터 메모리로 다운로드된 후에만 CPU에 의해 처리될 수 있습니다. 이 다운로드 프로세스는 시스템 전체에 적용됩니다. 오버헤드가 매우 높아 CPU 순수 소프트웨어를 사용한 동시 인코딩 및 디코딩의 오버헤드를 초과하므로 속도가 매우 낮습니다. 두 번째 명령은 마침내 GPU를 사용하여 하드웨어 가속을 동시에 디코딩하고 인코딩하기로 결정했지만 인코딩할 콘텐츠가 그래픽 카드 하드웨어에 의해 비디오 메모리로 디코딩되었다는 사실을 GPU에 알리지 않았고 하드웨어가 해당하는 crf 매개변수를 사용했습니다. 인코딩이 지원되지 않는 경우 하드웨어에서 crf와 유사한 매개변수 인코딩은 qp입니다. 추신: 다음은 제가 일반적으로 사용하는 매개변수입니다.

ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i '/path/file.mkv' -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -c:v hevc_vaapi  -qp 24  -filter:a volume=1.5 -ar 44100 -acodec aac -ab 64k -y '/path/file_n.mkv'

답변4

다음 두 가지 플래그를 추가하는 것이 좋습니다.

  • -hwaccel vaapi
  • -hwaccel_output_format vaapi

따라서 명령줄은 다음과 같습니다.

ffmpeg -v verbose -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i INPUT.VIDEO -vf 'format=nv12,hwupload' -c:v hevc_vaapi OUTPUT.mp4

(내 컴퓨터에서는 vaapi_device가 필요하지 않다고 지정합니다)

관련 정보