Я пытаюсь загрузить аудио из Windows Media Foundation, используя python ctypes и coms, но не могу заставить его работать.
Проблема в том, что мне нужен интерфейсный объект IMFAttributes
для использования его методов после создания, в этом примере SetUINT32
. Таким образом, чтобы получить объект указателя, я использую attrib_config.contents
, который возвращает объект IMAttributes
. Однако попытка доступа к любым методам приводит к ошибке доступа для чтения.
Вот соответствующий код без спама всего файла.
class IMFAttributes(com.IUnknown):
_methods_ = [
.....
('SetUINT32',
com.STDMETHOD(POINTER(GUID), c_uint32))
]
MFCreateAttributes = mfplat.MFCreateAttributes
MFCreateAttributes.restype = HRESULT
MFCreateAttributes.argtypes = [POINTER(POINTER(IMFAttributes)), c_uint32]
Что должно соответствовать рекомендациям Microsoft:
HRESULT MFCreateAttributes(
IMFAttributes **ppMFAttributes,
UINT32 cInitialSize
)
В основном один двойной указатель и int32.
Итак, я все инициализировал и создал так:
MF_LOW_LATENCY = com.GUID(0x9c27891a, 0xed7a, 0x40e1, 0x88, 0xe8, 0xb2, 0x27, 0x27, 0xa0, 0x24, 0xee)
MFStartup(MF_VERSION, 0)
attrib_config = POINTER(IMFAttributes)()
result = MFCreateAttributes(byref(attrib_config), 1)
attrib_config.contents.SetUINT32(byref(MF_LOW_LATENCY), 1)
результат возвращается как S_OK
(0), но после попытки использования SetUINT32
я сразу получаю OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF
Я новичок в ctypes, поэтому любая помощь был бы очень признателен.