将ctypes数据尽快转换为Python字符串

3

我正在尝试使用PyQt4编写一个视频应用程序,并使用Python ctypes钩入旧的遗留视频解码器库。该库提供给我32位ARGB数据,我需要将其转换为QImage。我已经按照以下方式使其正常工作:


# Copy the rgb image data from the pointer into the buffer
memmove(self.rgb_buffer, self.rgb_buffer_ptr, self.buffer_size)

# Copy the buffer to a python string
imgdata = ""
for a in self.rgb_buffer:
    imgdata = imgdata + a

# Create a QImage from the string data
img = QImage(imgdata, 720, 288, QImage.Format_ARGB32)

问题在于ctypes将数据输出为类型“ctypes.c_char_Array_829440”,我需要将其转换为Python字符串,以便构建QImage。目前我的复制机制每张图像需要近300毫秒的时间,因此速度非常慢。解码和显示过程仅需约50ms。
有没有人想到任何聪明的捷径可以加快这个过程并避免当前需要复制缓冲区两次的需要?
1个回答

6
ctypes.c_char_Array_829400实例具有属性.raw,该属性返回一个字符串,可能包含NUL字节,并且具有属性.value,如果其中包含一个或多个NUL字节,则返回第一个NUL字节之前的字符串。
但是,您也可以使用ctypes访问self.rgb_buffer_ptr处的字符串,如下所示:ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size)。这将避免需要memmove调用的需要。

非常感谢,string_at函数解决了问题。我真的需要更好地阅读文档。我检查了几次,还是错过了那个! - chrism1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接