如何在Python中访问GStreamer缓冲区的数据?

4 投票
1 回答
6166 浏览
提问于 2025-04-20 23:01

在以前的GStreamer绑定中(在引入GObject introspection之前),我们可以通过.data属性或者将其转换为str来访问gst.Buffer的数据。但现在这种方法已经不再可行了:

>>> p buf.data
*** AttributeError: 'Buffer' object has no attribute 'data'
>>> str(buf)
'<GstBuffer at 0x7fca2c7c2950>'

1 个回答

7

要访问最近版本中一个 Gst.Buffer 的内容,你首先需要使用 map() 方法,这样才能得到一个 Gst.MapInfo 对象。这个对象里面有一个叫 data 的属性,它的类型是 bytes(在 Python 2 中是 str)。

(result, mapinfo) = buf.map(Gst.MapFlags.READ)
assert result

try:
    # use mapinfo.data here
    pass
finally:
    buf.unmap(mapinfo)

你还可以通过 get_memory() 方法来访问这个缓冲区里面的 Gst.Memory 元素,并且可以单独对它们进行映射。(据我所知,调用 Buffer.map() 相当于调用 .get_all_memory() 并对得到的 Memory 进行映射。)

不过,遗憾的是,写入这些缓冲区是不可能的,因为在 Python 中,它们是用不可变类型表示的,即使你设置了 Gst.MapFlags.WRITE 标志。相反,你需要做的是创建一个新的 Gst.Memory,里面包含修改后的数据,然后使用 Gst.Buffer.replace_all_memory() 方法。

撰写回答