하드웨어 가속을 사용하여 6700 XT에서 ffmpeg를 사용하여 화면을 무손실(또는 거의 무손실 품질)로 녹화하려고 합니다. 저는 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
ffmpeg
60fps로 녹화한다고 하는데 녹화가 고르지 않고 색상도 약간 다릅니다. 색상 문제가 색상 형식 nv12에서 발생한다고 가정하지만 rgb
OR 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...
사용 가능한 하드웨어 장치가 여러 개 있는지 확인하셨나요?
노력하다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
해상도만 변경하세요. 다른 하드웨어 장치를 찾으면 변경해 볼 수도 있습니다.
합리적인 비트 전송률/파일 크기로 좋은 품질을 얻을 수 있다면 관심이 있을 것입니다. 성공하면 알려 주시기 바랍니다.
그런데 다음은 하드웨어 가속이 아닌 무손실 인코딩을 사용하므로 시도해 볼 수도 있습니다.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를 업데이트할 때 중단될 수 있지만 작동하고 명령줄도 잘 작동합니다.
또한 ffmpeg 5.1 이전 버전에서는 kmsgrab과 동시에 오디오를 녹음하면 오디오/비디오 동기화 문제가 발생할 수 있습니다.
https://trac.ffmpeg.org/ticket/8377
그것을 사용하려면 ffmpeg 6으로 업그레이드해야 할 수도 있습니다. 제 경험상 마지막 문제는 해결되었습니다.
답변3
어제 누군가가 이 질문을 했는데 대답은 여전히 같습니다. 하드웨어 비디오 코덱은 양자화 요소 변경, 즉 crf
그 이상을 지원하지 않으므로 무손실 인코딩을 지원하지 않습니다.
~에서https://trac.ffmpeg.org/wiki/Hardware/VAAPI
libx264에 대한 매핑 옵션
CRF와 유사한 모드는 현재 지원되지 않습니다. 유일한 일정한 품질 모드는 장면 콘텐츠에 적응할 수 없는 CQP(Constant Quantization Parameter)입니다. 그러나 다양한 프레임 유형에 대해 다양한 품질 설정을 허용하여 참조되지 않은 B 프레임에 더 적은 비트를 사용하여 압축을 향상시킵니다. (i|b)_q(factor|offset) 옵션을 참조하세요. CQP 모드는 최대 비트 전송률 또는 버퍼 크기와 함께 사용할 수 없습니다.