我正在尝试使用 ffmpeg 编写包含单通道 float32 值的 EXR 图像。 这是代码:
def test_ffmpeg_float_gray_to_exr():
import numpy as np
import subprocess
array1 = np.array([[0.1, 0.2], [0.4, 0.7]], np.float32) # Single-channel 2x2 image.
array1.tofile('temp1.raw')
ffmpeg_command_write = [
'ffmpeg', '-hide_banner',
'-f', 'rawvideo',
'-pix_fmt', 'grayf32le',
'-s', '2x2',
'-i', 'temp1.raw',
'-pix_fmt', 'grayf32le',
'-compression', 'zip1', # ['none', 'rle', 'zip1', zip16']
'-format', 'float', # ['half', 'float']
'-vcodec', 'exr',
'-y', 'output.exr',
]
subprocess.run(ffmpeg_command_write, check=True)
ffmpeg_command_read = [
'ffmpeg', '-hide_banner',
'-i', 'output.exr',
'-f', 'image2pipe',
'-pix_fmt', 'grayf32le',
'-y', 'temp2.raw',
]
subprocess.run(ffmpeg_command_read, check=True)
array2 = np.fromfile('temp2.raw', dtype=np.float32).reshape(2, 2)
print(array2)
test_ffmpeg_float_gray_to_exr()
写入时,ffmpeg 会给出消息
Incompatible pixel format 'grayf32le' for codec 'exr', auto-selecting format 'gbrpf32le'
,然后读回值会给出错误的结果。
如果我创建单通道 exr 图像(使用 OpenCV),它确实可以使用上述代码中的
ffmpeg_command_read
命令正确读取,因此只有写入部分被破坏。
而且,我可以使用 ffmpeg 和上述代码的变体创建 3 通道 (
gbrpf32le
) 和 4 通道 (gbrapf32le
) exr 图像。只是不是 1 通道。
源代码https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/exrenc.c表明应该可以编码
grayf32le
(但我不是专家)。
我是否缺少一些命令行选项来启用此功能?
grayf32le
自 v5.1 起支持 exr 编码