2009-04-03 9 views
3

私はPyQt4でビデオアプリケーションを作成しようとしています。Pythonのctypesを使用して古いレガシービデオデコーダライブラリをフックしています。ライブラリは私に32ビットのARGBデータを与え、私はそれをQImageに変換する必要があります。私は次のように働いて持っている:ctypesデータをできるだけ早くPython文字列に変換する


# 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のを構築することができるようにPythonの文字列にそれを有効にする必要があるということです。私のコピーメカニズムは現在、画像あたり約300msかかるため、痛いほど遅いです。プロセスのデコードと表示部分は約50msしかかかりません。

誰もがこのプロセスをスピードアップし、私が現在やっているようにバッファを2回コピーする必要を避けるために取ることができる任意の賢明なショートカットを考えることができますか?

答えて

6

ctypes.c_char_Array_829400インスタンスには、NULバイトを含む可能性のある文字列を返す.rawプロパティと、1つ以上含まれている場合は最初のNULバイトまでの文字列を返すプロパティ.valueがあります。

しかし、ctypesを使用してself.rgb_buffer_ptrという文字列にアクセスすることもできます。 ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size);これはmemmove呼び出しの必要性を避けるでしょう。

+0

ありがとう、string_at関数がトリックを行いました。私は本当にドキュメントを読むことでより良くなる必要があります。私はそれらを数回チェックして、まだそれを逃した! – chrism1

関連する問題