首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何暂停使用MCI播放的歌曲?(使用线程或多处理)

如何暂停使用MCI播放的歌曲?(使用线程或多处理)
EN

Stack Overflow用户
提问于 2021-07-04 13:57:02
回答 1查看 65关注 0票数 0

我试图制作一个简单的音频播放器,具有播放,停止,暂停和恢复歌曲的能力。

我想做的是

  • 在一个单独的线程上运行音频,然后可以从主线程中使用MCI暂停并恢复它。

什么不起作用

  • 试图调用函数来播放一首使用线程或多处理的MCI的歌曲时,会返回一个值为263的错误代码(不幸的是,在我能够找到的在线任何地方都没有关于数字错误代码的文档),并立即结束整个程序。

什么起作用?

不使用threading/multiprocessing.的

  • 播放、暂停和恢复

我的代码

代码语言:javascript
复制
from ctypes import windll
import threading
import time

class WinPlayAudio():
    def __init__(self):
        self.alias = "A{}".format(id(self))

    def _MCI_command(self,command):
        windll.winmm.mciSendStringW(command,0,0,0) # If printed, this returns 263 == unrecognized audio device

    # This does not play anything even tho wait is turned to: True
    def _play(self, start=0, wait = False):
        th = threading.Thread(target=self._MCI_command, args=(f'play {self.alias} from {start} {"wait" if wait else ""}',))
        th.start()

    def _open_song(self, audio_path):
        self._MCI_command(f'open {audio_path} alias {self.alias}')
    
    def _set_volume(self):
        self._MCI_command(f'setaudio {self.alias} volume to 500')

    def _pause(self):
        self._MCI_command(f'pause {self.alias}')

    def _resume(self):
        self._MCI_command(f'resume {self.alias}')

    def _stop(self):
        self._MCI_command(f'stop {self.alias}')
    

if __name__ == '__main__':
    p = WinPlayAudio()
    p._open_song(r"D:\songs\bee.mp3")
    p._play(0, True)
EN

回答 1

Stack Overflow用户

发布于 2021-08-17 23:38:05

固定代码,如果您想要多线程,请远离别名

代码语言:javascript
复制
import threading
from ctypes import windll


class WinPlayAudio():
    def __init__(self):
        self.alias = "A{}".format(id(self))
        self.audio_path = ""

    def _MCI_command(self, command):
        print(command)
        err = windll.winmm.mciSendStringW(command, 0, 0, 0)  # If printed, this returns 263 == unrecognized audio device
        print(err)

    def _play(self, start=0, wait=True):
        th = threading.Thread(target=self.__play__, args=(start, wait))
        th.start()

    def __play__(self, start, wait):
        self._MCI_command(f'play {self.audio_path} from {start} {"wait" if wait else ""}', )

    def _open_song(self, audio_path):
        self.audio_path = audio_path
        self._MCI_command(f'open {audio_path} alias {self.alias}')

    def _set_volume(self):
        self._MCI_command(f'setaudio {self.alias} volume to 500')

    def _pause(self):
        self._MCI_command(f'pause {self.alias}')

    def _resume(self):
        self._MCI_command(f'resume {self.alias}')

    def _stop(self):
        self._MCI_command(f'stop {self.alias}')


if __name__ == '__main__':
    p = WinPlayAudio()
    p._open_song("start.mp3")
    p._play()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68245425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档