ffmpeg无法写入单通道float32 exr图像?

问题描述 投票:0回答:1

我正在尝试使用 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
(但我不是专家)。

我是否缺少一些命令行选项来启用此功能?

ffmpeg openexr
1个回答
0
投票

grayf32le
自 v5.1 起支持 exr 编码

© www.soinside.com 2019 - 2024. All rights reserved.