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가 데이터를 유형으로 출력한다는 것입니다. "ctypes.c_char_Array_829440
"그리고 나는 그것을 qimage를 구성 할 수 있도록 파이썬 문자열로 바꿔야합니다. 내 복사 메커니즘은 현재 이미지 당 거의 300ms를 가져 가서 고통스럽게 느립니다. 디코드와 프로세스의 일부는 약 50ms 만 소요됩니다.
누구 든지이 프로세스 속도를 높이고 현재하고있는 것처럼 버퍼를 두 번 복사 할 필요가없는 교활한 바로 가기를 생각할 수 있습니까?
해결책
그만큼 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 호출의 필요성을 피할 수 있습니다.
제휴하지 않습니다 StackOverflow