Windows 10 用の Canon EDSDK バージョン 13.11.10 への Python ctypes インターフェイスのライブ ビューで次の問題があります。 EdsDownloadEvfImage の呼び出しに約 2.6 秒かかります。これは EDSDK 関数の呼び出しであるため、速度を改善する方法がわかりません。
以下は、ダウンロード中に呼び出されるさまざまな関数のタイミング情報です。これらは、PC への表示変更の通知を受け取った後に呼び出されます。これらのテストは Canon EOS Rebel SL3 で行われました。
downloadEvfData: EdsCreateMemoryStream ok. time: 0.000
downloadEvfData: EdsCreateEvfImageRef ok. time: 0.000
downloadEvfData: EdsDownloadEvfImage ok, time: 2.589
downloadEvfData: Length Ok = c_ulonglong(160035)
downloadEvfData: Get length ok. time: 0.002
downloadEvfData: Get pointer ok. time: 0.000
downlaodEvfData: copy bytes time: 0.000
downloadEvfData: full fn time: 2.598
downloadEvfData: EdsCreateMemoryStream ok. time: 0.000
downloadEvfData: EdsCreateEvfImageRef ok. time: 0.000
downloadEvfData: EdsDownloadEvfImage ok, time: 2.587
downloadEvfData: Length Ok = c_ulonglong(159924)
downloadEvfData: Get length ok. time: 0.002
downloadEvfData: Get pointer ok. time: 0.001
downlaodEvfData: copy bytes time: 0.000
downloadEvfData: full fn time: 2.596
PC への evf 出力変更の通知を受け取ったら - ダウンロード プロセスを開始するために必要なフレーム レートでスレッドの生成を開始します - ライブ データの各フレームに対して次の関数が呼び出されます {ストリームの取得、evf 画像参照の取得、evf 画像のダウンロード、ズーム値、長さの取得、ポインターの取得、evf 画像参照の解放、ストリームの解放などの evf 関連パラメーターを取得します。}
2-3 fps よりも優れているようには見えません。
以下は、Windows 10 用の Canon EDSDK バージョン 13.11.10 を使用したダウンロード関数のサンプル コードです。
from ctypes import *
err = c_int32(-1)
evfStream = c_void_p()
evfImageRef = c_void_p()
err = self.EDSDK64Dll.EdsCreateMemoryStream(0, byref(evfStream))
err = self.EDSDK64Dll.EdsCreateEvfImageRef(evfStream, byref(evfImageRef))
err = self.EDSDK64Dll.EdsDownloadEvfImage(inCameraRef, evfImageRef)
outLength = c_uint64(0)
err = self.EDSDK64Dll.EdsGetLength(evfStream, byref(outLength))
image_data = (c_ubyte * outLength.value)()
p_image_data = (POINTER(c_ubyte))(image_data)
# get the pointer to the starting memory location of the stream
err = self.EDSDK64Dll.EdsGetPointer(evfStream, byref(p_image_data))
# copy over the data from obtained location of image_data
# check if ctypes string_at can be used to speed up copy
arr_bytes = bytearray(string_at(p_image_data, outLength.value))
im = (Image.open(io.BytesIO(arr_bytes))).transpose(Image.FLIP_LEFT_RIGHT) # PIL image
ライブ ビュー用の AC# サンプルは、同じ EDSDK を使用する同じ PC ではるかに高速なフレーム レートで動作します。