Как аппаратно декодировать видео h265, более низкое разрешение и частоту кадров и передать как необработанное видео в формате yuv420
Следующая команда ffmpeg аппаратно декодирует видеопоток rtsp h265 с помощью qsv, снижает разрешение с 4k до 1080p, частоту кадров с 20 до 5 и пытается сохранить видео как rawvideo с помощью pix_fmt yuv420p.
ffmpeg -hide_banner -loglevel warning -hwaccel qsv -c:v hevc_qsv -use_wallclock_as_timestamps 1 -fflags nobuffer -rtsp_transport tcp -stimeout 5000000 -i rtsp://admin:secret@10.20.1.14:554 -vf fps=fps=5,vpp_qsv=w=1280:h=720 -c:v h264_qsv -g 25 -profile:v main -b:v 1M -an -f rawvideo -pix_fmt yuv420p test_output.yuv
Проблема в том, что аппаратный декодер использует nv12 в качестве внутреннего формата, что приводит к предупреждению:
Несовместимый формат пикселей «yuv420p» для кодека «h264_qsv», автоматический выбор формата «nv12»
Намерение здесь состоит в том, чтобы передать необработанное видео другому процессу, который будет выполнять обнаружение объектов и поддерживает только yuv420p. Я пытался использовать vaapi вместо qsv, но это дало мне ту же проблему. Как преобразовать формат pix_format с помощью ffmpeg?
1 ответ
Наконец-то я нашел ответ на этот вопрос благодаря комментарию на Reddit .
ffmpeg -hide_banner -loglevel warning -hwaccel qsv -c:v hevc_qsv -use_wallclock_as_timestamps 1 -fflags nobuffer -rtsp_transport tcp -stimeout 5000000 -i rtsp://admin:secret@10.20.1.14:554 -vf fps=fps=5,vpp_qsv=w=1280:h=720:format=nv12,hwdownload,format=nv12,format=yuv420p -an -f rawvideo test_output.yuv
Проблема заключалась (насколько я понимаю), в том, что когда мы используем операции аппаратного ускорения, кадры сохраняются в аппаратно-зависимом формате. В этом случае nv12 и преобразование при нахождении в памяти GPU невозможно. Но с помощью инструкции «hwdownload» кадры перемещаются в обычную память, и мы можем преобразовать их в yuv420p.