Превращение данных ctypes в строку Python как можно быстрее - PullRequest
3 голосов
/ 03 апреля 2009

Я пытаюсь написать видео-приложение на 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 мс на изображение, поэтому он мучительно медленный. Часть процесса декодирования и отображения занимает всего около 50 мс.

Кто-нибудь может вспомнить какие-нибудь хитрые ярлыки, которые я могу использовать, чтобы ускорить этот процесс и избежать необходимости дважды копировать буфер, как я делаю в настоящее время?

1 Ответ

6 голосов
/ 03 апреля 2009

Экземпляр ctypes.c_char_Array_829400 имеет свойство .raw, которое возвращает строку, возможно, содержащую байты NUL, и свойство .value, которое возвращает строку до первого байта NUL, если он содержит один или несколько.

Однако вы можете также использовать ctypes для доступа к строке в self.rgb_buffer_ptr, например так: ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); это позволит избежать необходимости вызова memmove.

...