如何在Python中访问GStreamer缓冲区的数据?
在以前的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()
方法。