문제

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 호출의 필요성을 피할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top