Превращение данных ctypes в строку python как можно быстрее
Вопрос
Я пытаюсь написать видеоприложение на 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 выводит данные как type "ctypes.c_char_Array_829440
" и мне нужно превратить это в строку python, чтобы я мог создать QImage.Мой механизм копирования в настоящее время занимает почти 300 мс на изображение, так что это мучительно медленно.Часть процесса декодирования и отображения занимает всего около 50 мс.
Кто-нибудь может придумать какие-нибудь хитрые ярлыки, которые я могу использовать, чтобы ускорить этот процесс и избежать необходимости копировать буфер дважды, как я делаю сейчас?
Решение
В ctypes.c_char_Array_829400
экземпляр обладает свойством .raw
который возвращает строку, возможно, содержащую нулевые байты, и свойство .value
который возвращает строку вплоть до первого нулевого байта, если она содержит один или несколько.
Однако вы также можете использовать ctypes для доступа к строке по адресу self.rgb_buffer_ptr
, вот так:ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size)
;это позволило бы избежать необходимости в вызове memmove.