gpt4 book ai didi

python - 使用 PlaySound() 时不产生声音

转载 作者:行者123 更新时间:2023-12-01 09:24:38 27 4
gpt4 key购买 nike

基本上我想使用 PlaySound() ctypes 中的函数。

Yes I know winsound module is built on it and I could use that, but I have a reason to not do so :)

<小时/>

在 C 中,我会这样调用该函数:

PlaySound("sound.wav", NULL, SND_FILENAME);
<小时/>

我有等效的 Python 脚本:

import ctypes

winmm = ctypes.WinDLL('winmm.dll')

winmm.PlaySound("sound.wav", None, 0x20000)

我运行它,没有返回错误,但声音也不播放。

<小时/>

我怀疑问题出在十六进制值(0x20000)上,因为其他一切看起来都很好。我得到这样的值:

import winsound
print(hex(winsound.SND_FILENAME))

或者以不同的方式:

import ctypes, winsound

winmm = ctypes.WinDLL('winmm.dll')

winmm.PlaySound("sound.wav", None, winsound.SND_FILENAME)

那么我怎样才能让它工作以便播放我的文件?

最佳答案

在 Windows 中,函数有 Unicode 和 ANSI 版本。 documentation表示文件名是 LPCTSTR。对于 ANSI 版本,定义为 LPCSTR;对于 Unicode,定义为 LPCWSTR

这是调用 Windows 函数的正确方法。通常您需要该函数的 W 版本。定义 .argtypes.restype 也有助于错误检查。正如您所发现的,您可以传递错误的类型,并且它将不起作用。定义 .argtypes 后,将捕获不兼容的类型。

from ctypes import *
from ctypes import wintypes as w

dll = WinDLL('winmm')

dll.PlaySoundW.argtypes = w.LPCWSTR,w.HMODULE,w.DWORD
dll.PlaySoundW.restype = w.BOOL

SND_FILENAME = 0x20000

# Call it with a Unicode string and it works.
dll.PlaySoundW('sound.wav',None,SND_FILENAME)

# Call it with a byte string and get an error since `.argtypes` is defined.
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)

输出(声音播放后):

Traceback (most recent call last):
File "C:\test.py", line 15, in <module>
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

或者跳过所有这些工作,只使用winsound 模块:

import winsound
winsound.PlaySound('sound.wav',winsound.SND_FILENAME)

关于python - 使用 PlaySound() 时不产生声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50535102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com