ffmpeg 하드웨어 인코딩이 소프트웨어 인코딩보다 품질이 낮은 출력을 생성하는 이유는 무엇입니까?

ffmpeg 하드웨어 인코딩이 소프트웨어 인코딩보다 품질이 낮은 출력을 생성하는 이유는 무엇입니까?

이 명령을 사용하여 비디오를 다시 인코딩했습니다.

ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -b:v 1M -maxrate 1.5M output.mp4

결과 비디오에는 다음과 같은 속성이 있습니다.

Duration: 00:01:03.92, start: 0.000000, bitrate: 1292 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 1159 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

스크린샷은 이렇습니다이것

그런 다음 하드웨어에서는 비디오를 디코딩하고 소프트웨어에서는 비디오를 인코딩하는 이 명령을 사용했습니다.

ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -vf 'deinterlace_vaapi=rate=field:auto=1,hwdownload,format=nv12' -c:v libx264 -crf 30 -r 25 output.mp4

결과적으로 부동산 비디오가 생성됩니다.

Duration: 00:01:00.89, start: 0.000000, bitrate: 932 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 798 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)

스크린샷은 다음과 같습니다이것

분명히 두 번째 비디오는 비트 전송률은 낮지만 품질은 더 높습니다. 이유를 알고 싶습니다. 또한 하드웨어 인코딩을 사용하여 두 번째 결과를 얻는 방법도 알고 싶습니다.

답변1

짧은 대답: 모든 것은 항상 타협이기 때문입니다.

더 긴 답변: ASIC 코덱은 필연적으로 소프트웨어 코덱에 비해 유연성이 떨어지고 영리성이 떨어집니다. 또한 프레임 손실보다 아티팩트가 더 선호되는 실시간 스트리밍과 같은 고속/저전력/일관적인 비트 전송률 애플리케이션을 위해 주로 설계되었습니다.

답변2

좋은 소프트웨어 인코더에 얼마나 가까워질지는 잘 모르겠지만, 하드웨어가 이를 지원한다면 hevc_vaapi를 사용해 볼 수도 있습니다. 이는 더 효율적입니다.

그러나 h264_vaapi를 사용하면 -b:v 1M다음과 같이 지정하지 않는 한 좋은 결과를 얻을 수 없으므로 사용해서는 안 됩니다.15M.

시도해 -qp 22보고 나중에 값을 조정하거나 더 나은 결과를 얻을 수도 있습니다.

-rc_mode CQP -global_quality 22(나중에 값을 조정) 대신.

-compression_level 1더 낮은 속도에서 더 나은 품질을 제공하는 것을 추가할 수도 있습니다 .

옵션은 여기에 설명되어 있습니다.https://ffmpeg.org/ffmpeg-codecs.html#VAAPI-인코더

특히 hevc_vaapi를 시도하려는 경우 도움이 될 수 있습니다. https://www.tauceti.blog/posts/linux-ffmpeg-amd-5700xt-hardware-video-encoding-hevc-h265-vaapi/

관련 정보