Python Winmm.dll不';t返回文件的长度

Python Winmm.dll不';t返回文件的长度,python,c,dll,ctypes,winmm,Python,C,Dll,Ctypes,Winmm,我正在尝试使用winmm.dll(ctypes.windell.winmm)在python中播放.mp3文件。但当我试图以毫秒为单位获取某个文件的长度时,我得到的不是实际长度(05:23=大约323000毫秒),而是3。status命令得到的时间格式为“m”,设置命令后时间格式不变。下面是一些说明问题的代码: from ctypes import windll, c_buffer fp = 'song.mp3' alias = 'test' buf = c_buffer(255) r = w

我正在尝试使用winmm.dll(ctypes.windell.winmm)在python中播放.mp3文件。但当我试图以毫秒为单位获取某个文件的长度时,我得到的不是实际长度(05:23=大约323000毫秒),而是3。status命令得到的时间格式为“m”,设置命令后时间格式不变。下面是一些说明问题的代码:

from ctypes import windll, c_buffer

fp = 'song.mp3'
alias = 'test'

buf = c_buffer(255)
r = windll.winmm.mciSendStringW(f'open "{fp}" alias {alias}', buf, 254, 0)
print(r)

buf = c_buffer(255)
r = windll.winmm.mciSendStringW(f'status {alias} time format', buf, 254, 0)
print(r, buf.value)

buf = c_buffer(255)
r = windll.winmm.mciSendStringW(f'set {alias} time format milliseconds', buf, 254, 0)
print(r)

buf = c_buffer(255)
r = windll.winmm.mciSendStringW(f'status {alias} time format', buf, 254, 0)
print(r, buf.value)

buf = c_buffer(255)
r = windll.winmm.mciSendStringW(f'status {alias} length', buf, 254, 0)
print(r, buf.value)
其输出:

0
0 b'm'
0
0 b'm'
0 b'3'

提前感谢您的帮助

如我在评论中所述,这是一个典型的未定义行为示例。查看更多详细信息
此外,您正在混合8位和16位字符串

上市

代码00.py:

#/usr/bin/env蟒蛇3
导入系统
将ctypes导入为ct
从ctypes将wintypes作为wt导入
def主(*argv):
winmm_dll=ct.windell(“winmm.dll”)
mciSendString=winmm_dll.mciSendStringW
mciSendString.argtypes=(wt.LPCWSTR、wt.LPWSTR、wt.UINT、wt.HANDLE)
mciSendString.restype=wt.DWORD
file_name=“./SampleAudio_0.4mb.mp3”#从下载https://www.sample-videos.com/audio/mp3/crowd-cheering.mp3
别名_name=“test00”
状态_命令=[
f“状态{alias_name}时间格式”,
f“状态{alias_name}长度”,
]
命令=[f“打开\”{file_name}\“别名{alias_name}”]
命令。扩展(状态命令)
append(f“set{alias\u name}时间格式ms”)
命令。扩展(状态命令)
append(f“close{alias_name}”)
out\u buf\u len=0xFF
out\u buf=ct.创建unicode缓冲区(out\u buf\u len)
对于命令中的命令:
打印(f“发送{command}…”)
res=mciSendString(命令,out\u buf,out\u buf\u len,无)
打印(f“结果:{res}\n输出:{out\u buf.value}”)
如果名称=“\uuuuu main\uuuuuuuu”:
打印(“Python{0:s}{1:d}位在{2:s}\n.format(“.join(sys.version.split(“\n”)中的项的item.strip()),如果sys.maxsize>0x100000000,则为64,否则为32,sys.platform))
main(*sys.argv[1:])
打印(“\n完成”)
输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q059343461]>“e:\Work\Dev\VEnvs\py\u 064\u 03.07.03\u test0\Scripts\python.exe”code00.py
Python 3.7.3(v3.7.3:ef4ec6ed12,2019年3月25日,22:22:05)[MSC v.1916 64位(AMD64)]win32上的64位
正在发送打开的“/SampleAudio_0.4mb.mp3”别名test00。。。
结果:0
产出:1
正在发送状态test00时间格式。。。
结果:0
输出:毫秒
正在发送状态test00长度。。。
结果:0
产出:27746
正在发送设置test00时间格式毫秒。。。
结果:0
输出:
正在发送状态test00时间格式。。。
结果:0
输出:毫秒
正在发送状态test00长度。。。
结果:0
产出:27746
正在发送关闭test00。。。
结果:0
输出:
完成。
你有未定义的行为。