我有这样的拜耳图像https://drive.google.com/file/d/1OjHQyR44ECMMs4BtlZacejkmgSjeY2Nq/view?usp=sharing
我需要获取两个输出文件
- 直接将此图像去马赛克并保存为
.bmp
- 将图像解拜耳压缩为
.h264
,然后解压缩并保存为.bmp
为了做到这一点,我使用了这样的批处理脚本
@echo off
set main_dir=my_main_dir
set file_name=orig_bayer
set input=%main_dir%\%file_name%.bmp
set output_direct_debayer_bmp=%main_dir%\gpl_cmd_direct_decompress.bmp
set output_h264=%main_dir%\result_h264_%file_name%.h264
set output_h264_to_bmp=%main_dir%\gpl_cmd_decompress.bmp
set video_size=4096x3000
rem direct debayering
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -pix_fmt yuv420p %output_direct_debayer_bmp%
rem debaer -> h264 -> decompress
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -framerate 30 -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -c:v hevc_nvenc -qp 0 -pix_fmt yuv420p %output_h264%
ffmpeg -y -i %output_h264% -f image2 %output_h264_to_bmp% -hide_banner
pause
因此,使用方法 #1 时,我
...
rem direct debayering
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -pix_fmt yuv420p %output_direct_debayer_bmp%
...
我得到这样的输出https://drive.google.com/file/d/1-DA2440zZ2F9WRcd15iqFUt3UhtkQRZT/view?usp=sharing
并使用方法 #2
...
rem debaer -> h264 -> decompress
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -framerate 30 -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -c:v hevc_nvenc -qp 0 -pix_fmt yuv420p %output_h264%
ffmpeg -y -i %output_h264% -f image2 %output_h264_to_bmp% -hide_banner
...
我得到这样的输出https://drive.google.com/file/d/103dtgaDVaXsNy13XHaVLSgugQhh0Uj9N/view?usp=sharing
第二个颜色有差异......
答案1
它看起来像是颜色转换算法中的一个错误,但我不确定。
替换时的颜色-pix_fmt yuv420p
与-pix_fmt yuv444p
直接转换相同。
- 颜色转换路径:拜耳->yuv420p修改颜色。
- 颜色转换路径:拜耳 -> yuv444p工作正常。
共同点去马赛克算法从拜耳转换为 RGB,而不是从拜耳直接转换为 YUV,但我不知道 FFmpeg 使用的内部转换管道。
我找到了一种使用以下颜色转换路径对 yuv420p 进行编码的解决方案:
拜耳 -> yuv444p -> yuv420p
解决方案是使用format
视频滤镜。在 之后
添加参数:。-vf format=yuv444p
-i pipe:
使用以下命令:
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -framerate 30 -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -vf format=yuv444p -c:v hevc_nvenc -qp 0 -pix_fmt yuv420p %output_h264%
结果(缩小尺寸)从左到右:
- 不含
-vf format=yuv444p
(颜色不正确): - 使用
-vf format=yuv444p
(正确的颜色): - 直接转换(正确的颜色):
笔记:
- 高效视频编码是 H.265 而不是 H.264