如何通过视频压缩工具处理float32数组并还原?探寻原生支持float32的图像与视频格式
FFmpeg处理Float32格式的视频与图像问题解答
核心问题解答
1. FFmpeg是否支持原生float32格式?
FFmpeg完全支持float32像素格式(比如单通道的grayf32le/grayf32be,多通道的rgbf32le等),但你原命令失效的原因是:MP4容器默认使用的H.264/H.265编码器不支持浮点像素输入,FFmpeg会自动将float32格式转成8/10bit整数格式编码,导致最终输出的MP4和导出的TIFF都丢失了浮点信息。
2. 原生支持float32的图像格式
多种图像格式原生支持32位浮点存储,常见的包括:
- TIFF:需使用支持浮点的编码器,FFmpeg中指定
-c:v tiff并配合-pix_fmt grayf32le即可导出浮点TIFF; - OpenEXR:专业影视领域常用的浮点图像格式,FFmpeg支持导出;
- PFM:便携式浮点图像格式,体积小且采用纯文本+二进制混合存储,FFmpeg同样支持。
3. 原生支持float32的视频格式/编码组合
要实现带压缩的浮点视频存储,需要搭配支持浮点编码的编码器和兼容容器,推荐组合:
- FFV1 + MKV:FFV1是FFmpeg官方的无损编码器,原生支持浮点像素格式,MKV容器对编码格式兼容性极强;
- ProRes 4444 XQ + MOV:苹果ProRes编码的4444 XQ档次支持浮点存储,MOV容器完美适配;
- 若接受无压缩,可直接用
rawvideo格式,但文件体积会非常庞大,不推荐用于大量帧序列。
修正后的命令示例
编码为支持float32的压缩视频(MKV+FFV1)
DIMX=3250 DIMY=2132 dd if=$RAWARRAYSFILE | ffmpeg -y -framerate 30 -f rawvideo -s "${DIMX}x${DIMY}" -pix_fmt grayf32le -i - -c:v ffv1 -pix_fmt grayf32le vid.mkv
关键:明确指定
-c:v ffv1编码器,并强制输出像素格式为grayf32le,避免FFmpeg自动转码。
还原为float32格式的TIFF序列
ffmpeg -i vid.mkv -c:v tiff -pix_fmt grayf32le out/processed%05d.tif
直接还原为原始float32数组
ffmpeg -i vid.mkv -f rawvideo -pix_fmt grayf32le - output.raw
内容的提问来源于stack exchange,提问作者VojtaK
相关产品推荐
相关产品推荐

