ffmpeg를 사용하여 6700 XT에서 하드웨어 가속 무손실 녹음

ffmpeg를 사용하여 6700 XT에서 하드웨어 가속 무손실 녹음

ffmpeg를 사용하는 6700 XT에서 하드웨어 가속을 사용하여 화면을 무손실(또는 거의 무손실 품질)로 녹화하려고 합니다. 저는 5.14.14-051414-generic커널과 함께 Linux Mint를 실행하고 있습니다.

난 노력 했어:

ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 2560x1440 -i :0 -r 60 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 0 output.mp4

ffmpeg60fps로 녹화한다고 하는데 녹화가 고르지 못하고 약간 색상이 잘못되었습니다. 색상 문제가 색상 형식 nv12에서 발생했다고 가정하지만 rgb오류 rgb8가 발생합니다.

나는 또한 kmsgrab을 사용해 보았습니다.

ffmpeg -device /dev/dri/card0 -f kmsgrab -i - -vf 'hwmap=derive_device=vaapi,scale_vaapi=w=2560:h=1440:format=nv12' -c:v h264_vaapi -qp 0 output.mp4

하지만 오류가 발생합니다.

[kmsgrab @ 0x558f001c8d80] Using plane 65 to locate framebuffers.
[kmsgrab @ 0x558f001c8d80] Failed to get framebuffer 127: Invalid argument.
pipe:: Invalid argument

뒤의 숫자는 Failed to get framebuffer일반적 127으로 또는 에서 까지 134입니다 136.

나는 이러한 명령을 받았습니다여기.

답변1

진정한 무손실 인코딩은 소프트웨어에서만 수행할 수 있지만 비트 전송률이 높을수록 충분히 좋아 보일 수 있습니다.

또한 ffmpeg 위키에서는 VAAPI가 AMD GPU에 대해서만 부분적으로 지원된다고 말합니다.

하지만 현재 CPU의 통합 GPU를 사용하고 있어 성능 문제가 발생할 수 있다고 생각됩니다.

동일한 시스템에 사용 가능한 장치가 여러 개 있는 경우(예: Intel 통합 GPU 및 AMD 개별 그래픽 카드) 이를 동시에 사용하여 서로 다른 스트림을 디코딩할 수 있습니다.

ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -init_hw_device vaapi=amd:/dev/dri/renderD129 -hwaccel vaapi -hwaccel_device intel -i ... -hwaccel vaapi -hwaccel_device amd -i ...

사용 가능한 hw 장치가 두 개 이상 있는지 확인해 보셨나요?

노력하다ls /dev/dri/어떤 장치를 사용할 수 있는지 확인하세요.

올바른 장치를 사용했는지 여부에 관계없이-qp 0옵션은 의도한 대로 작동하지 않을 수 있으므로 주어진 명령을 정확히 사용하여 시도해 보고 더 나은 결과가 나오는지 확인하십시오.

ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 1920x1080 -i :0 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 24 output.mp4

또는

ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 1920x1080 -i :0 -vf 'format=nv12,hwupload' -c:v h264_vaapi -qp 24 output.mp4

해상도만 변경하고 다른 hw 장치를 찾았다면 이것도 변경해 볼 수 있습니다.

합리적인 비트 전송률/파일 크기로 좋은 품질을 얻을 수 있다면 관심이 있으실 것입니다. 성공했는지 알려주시기 바랍니다.

그런데 다음은 hw 가속이 아닌 무손실 인코딩을 사용하므로 이것도 시도해 볼 수 있습니다.https://trac.ffmpeg.org/wiki/Capture/Desktop#lossless-recording

인코딩 프로세스 속도를 높이려면 무손실 인코딩을 사용하고 고급 인코더 옵션을 비활성화할 수 있습니다. 예:

ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v libx264rgb -crf 0 -preset ultrafast -color_range 2 output.mkv

-crf 0은 x264에게 무손실 모드로 인코딩하도록 지시합니다. -preset ultrafast는 너무 빨리 수행하도록 권장합니다. libx264 대신 libx264rgb를 사용한다는 점에 유의하세요. 후자는 RGB에서 yuv444p로 손실이 많은 변환을 수행합니다(8비트 yuv444p는 8비트 RGB를 보존하기에 충분하지 않으며 10비트 YCbCr이 필요함). ...

인코더는 대부분의 최신 하드웨어에서 프레임 드롭 없이 녹화할 수 있을 만큼 충분히 빨라야 하며, 다른 애플리케이션을 위해 충분한 CPU 헤드룸을 남겨두어야 합니다.

녹음을 보관하거나 파일 크기가 걱정되는 경우 손실 없이 다시 인코딩하되 더 느린 사전 설정을 사용하세요. ...

답변2

TL,DR: 내 생각에는 ffmpeg 및/또는 현재 수정된 것으로 보이는 스택의 다른 부분에서 대부분 버그가 발생했다고 생각합니다.

첫 번째 명령:

ffmpeg -vaapi_device /dev/dri/renderD128 -f x11grab -video_size 2560x1440 -i :0 -r 60 -vf 'hwupload,scale_vaapi=format=nv12' -c:v h264_vaapi -qp 0 output.mp4

ffmpeg 5.1을 사용하는 Debian Bookworm(모니터에 맞게 크기만 변경함)에서 색상 문제 없이 동일한 GPU(6700 XT)에서 60fps로 작동합니다. 따라서 아마도 (당시) ffmpeg 버전이나 VA-API 드라이버 등에 버그가 있었을 것입니다.

최고 품질을 사용하지 않으며 -qp 0이 인코더에 대해 지원되는 범위를 벗어날 수 있으며 이후에 무시되며 분명히 기본값으로 돌아갑니다.

No quality level set; using default (20).

-qp 1허용되는 낮은 값은 귀하의 요구에 맞는 충분한 품질을 제공할 수 있습니다.


kmsgrab과 관련하여 이를 사용하려면 루트로 실행하거나 CAP_SYS_ADMIN 기능 세트가 필요합니다. 이것이 오류의 원인일 수 있으며 수정 사항은 ffmpeg에 기능을 설정하는 것입니다.

setcap cap_sys_admin=ep /usr/bin/ffmpeg

이는 보안에 이상적이지 않으며 ffmpeg가 업데이트되면 중단되지만 작동하고 명령줄도 잘 실행됩니다.

또한 오디오를 녹음하는 동안 kmsgrab을 사용하면 ffmpeg 5.1 이상이 될 때까지 오디오/비디오 동기화 문제가 발생했습니다.

https://trac.ffmpeg.org/ticket/8377

그것을 사용하고 싶다면 아마도 내 경험상 마지막 문제를 해결한 ffmpeg 6으로 업그레이드하고 싶을 것입니다.

답변3

이것은 어제 질문되었으며 대답은 동일합니다. HW 비디오 코덱은 양자화 요소 변경을 지원하지 않습니다. 즉, crf무손실 인코딩을 지원하지 않습니다.

에서https://trac.ffmpeg.org/wiki/Hardware/VAAPI

libx264의 매핑 옵션

현재 CRF와 유사한 모드는 지원되지 않습니다. 유일한 고정 품질 모드는 장면 콘텐츠에 적응하지 못하는 CQP(Constant Quantization 매개변수)입니다. 그러나 참조되지 않은 B 프레임에 더 적은 비트를 사용하여 압축을 향상시키기 위해 다양한 프레임 유형에 대해 다양한 품질 설정을 허용합니다. (i|b)_q(factor|offset) 옵션을 참조하세요. CQP 모드는 최대 비트 전송률 또는 버퍼 크기와 결합될 수 없습니다.

관련 정보