Нет звука, хотя возвращается «0» (успешно). Мой Python3.7 и Win10. Я также пробовал utf-8, utf-16-le, ничего не получалось.
Вы должны добавить флаг wait
. Если этот флажок установлен, вы действительно сможете ждать завершения вызываемой функции. Причина, по которой вы можете воспроизвести ваш файл. В случае, если вы удалили его, он начнет воспроизведение и сразу после его закрытия.
Весь код (ASCII):
from ctypes import c_buffer, windll
from sys import getfilesystemencoding
if __name__ == '__main__':
buf = c_buffer(255)
filesystemencoding = getfilesystemencoding()
filename = r'.\file_example.mp3'
# ASCII
command = 'open ' + filename + ' alias test2'
waitcommand = 'play test2 wait'
byte_string_command = command.encode(filesystemencoding)
waiting = waitcommand.encode(filesystemencoding)
errorCode = int(windll.winmm.mciSendStringA(byte_string_command, buf, 254, 0))
# errorCode should be 275: Cannot find the file
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
print("{}: {}".format(errorCode, errorBuffer.value.decode()))
errorCode = int(windll.winmm.mciSendStringA(waiting, buf, 254, 0))
# errorCode should be 275: Cannot find the file
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
print("{}: {}".format(errorCode, errorBuffer.value.decode()))
UNICODE:
from ctypes import c_buffer, windll
from sys import getfilesystemencoding
if __name__ == '__main__':
buf = c_buffer(255)
filesystemencoding = getfilesystemencoding()
filename = r'.\file_example.mp3'
# ASCII
command = r'open ' + filename + r' alias test2'
waitcommand = r'play test2 wait'
byte_string_command = command.encode(filesystemencoding)
waiting = waitcommand.encode(filesystemencoding)
# Unicode
errorCode = int(windll.winmm.mciSendStringW(command, buf, 254, 0))
# errorCode should be 296: The specified file cannot be played
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
print("{}: {}".format(errorCode, errorBuffer.value.decode()))
errorCode = int(windll.winmm.mciSendStringW(waitcommand, buf, 254, 0))
# errorCode should be 275: Cannot find the file
errorBuffer = c_buffer(255)
windll.winmm.mciGetErrorStringA(errorCode, errorBuffer, 254)
print("{}: {}".format(errorCode, errorBuffer.value.decode()))
Если код работает, он вернет 0: The specified command was carried out
.
Примечание:
- sys.getfilesystemencoding ()
Возвращает имя кодировки, используемой для преобразования между именами файлов Unicode и именами байтов. Для лучшей совместимости str следует использовать для имен файлов во всех случаях, хотя также поддерживается представление имен файлов в байтах. Функции, принимающие или возвращающие имена файлов, должны поддерживать либо str, либо байты и внутренне преобразовываться в предпочтительное представление системы.
This encoding is always ASCII-compatible.
[os.fsencode()][2] and [os.fsdecode()][3] should be used to ensure that the
correct encoding and errors mode are used.
In the UTF-8 mode, the encoding is utf-8 on any platform.
On macOS, the encoding is 'utf-8'.
On Unix, the encoding is the locale encoding.
On Windows, the encoding may be 'utf-8' or 'mbcs', depending on user
configuration.
Changed in version 3.6: Windows is no longer guaranteed to return
'mbcs'. See PEP 529 and [_enablelegacywindowsfsencoding()][4] for more
information.
Changed in version 3.7: Return ‘utf-8’ in the UTF-8 mode.
Использование псевдонима Когда вы открываете устройство, вы можете использовать флаг «псевдоним», чтобы указать идентификатор устройства для устройства. Этот флаг позволяет назначать короткий идентификатор устройства для составных устройств с длинными именами файлов и позволяет открывать несколько экземпляров одного и того же файла или устройства.
Избегайте использования wait Если вы хотите играть без ожидания, вам нужно обработать MCI_NOTIFY
, установить дескриптор окна обратного вызова и обработать MM_MCINOTIFY
после завершения воспроизведения.
hwndCallback : Обрабатывать окно обратного вызова, если в командной строке был указан флаг "notify".