【问题标题】:How can I play audio (playsound) in the background of a Python script?如何在 Python 脚本的背景中播放音频(playsound)?
【发布时间】:2017-11-12 07:40:34
【问题描述】:

我只是为了好玩而编写一个小型 Python 游戏,并且我有一个函数来完成开头的叙述。

我正在尝试让音频在后台播放,但不幸的是,MP3 文件在功能继续之前先播放。

如何让它在后台运行?

import playsound

def displayIntro():
    playsound.playsound('storm.mp3',True)
    print('')
    print('')
    print_slow('The year is 1845, you have just arrived home...')

另外,有没有办法控制playsound模块的音量?

我使用的是 Mac,我并不热衷于使用 playsound。它似乎是我可以开始工作的唯一模块。

【问题讨论】:

    标签: python audio python-playsound


    【解决方案1】:

    只需将 True 更改为 False(我使用 Python 3.7.1)

    import playsound
    playsound.playsound('storm.mp3', False)
    print ('...')
    

    【讨论】:

    • 信息:这不适用于 Ubuntu 20.04。它给出以下错误:NotImplementedError: block=False cannot be used on this platform yet
    • 这适用于我在 Windows 上使用 Python 3.7.3
    • 经过一些测试后,由于底层 Gstreamer 实现仅为 Windows 驱动程序配置,因此看起来这仅适用于 Windows
    【解决方案2】:

    在 Windows 中:

    使用 winsound.SND_ASYNC 异步播放它们:

    import winsound
    winsound.PlaySound("filename", winsound.SND_ASYNC | winsound.SND_ALIAS )
    

    停止播放

    winsound.PlaySound(None, winsound.SND_ASYNC)
    

    在 Mac 或其他平台上:

    你可以试试这个Pygame/SDL

    pygame.mixer.init()
    pygame.mixer.music.load("file.mp3")
    pygame.mixer.music.play()
    

    【讨论】:

    • 嘿,谢谢。我设法让 pygame 声音正常工作,谢谢。但是它不是在后台播放。知道该怎么做吗?
    • 抱歉,我在脚本中留下了 playsound 代码。 pygame 混音器没有播放任何声音:/
    • 已修复,只是无法播放 .mp3 文件。它适用于 .wav 文件
    • 是的尝试使用pymedia我猜将mp3转换为wav
    【解决方案3】:

    好吧,你可以只使用 pygame.mixer.music.play(x):

    #!/usr/bin/env python3
    # Any problems contact me on Instagram, @vulnerabilties
    import pygame
    
    pygame.mixer.init()
    pygame.mixer.music.load('filename.extention')
    pygame.mixer.music.play(999)
    
    # Your code here
    

    【讨论】:

    • Instagram 上的@vulnerabilties 是你吗?还是其他人?你能详细说明一下吗?
    【解决方案4】:

    in Pygame 有一个名为 mixer 的库,您可以将 MP3 文件添加到其中包含 Python 脚本的文件夹中,然后在其中放入如下代码:

    from pygame import mixer
    
    mixer.init()
    mixer.music.load("mysong.mp3")
    mixer.music.play()
    

    【讨论】:

    【解决方案5】:

    一个很好的方法是使用 vlc。非常常见且受支持的库。

    pip install python-vlc
    

    然后编写你的代码

    import vlc
    
    #Then instantiate a MediaPlayer object
    
    player = vlc.MediaPlayer("/path/to/song.mp3")
    
    #And then use the play method
    
    player.play()
    
    #You can also use the methods pause() and stop if you need.
    
    player.pause()
    player.stop
    
    #And for the super fancy thing you can even use a playlist :)
    
    playlist = ['/path/to/song1.mp3', '/path/to/song2.mp3', '/path/to/song3.mp3']
    
        for song in playlist:
            player = vlc.MediaPlayer(song)
            player.play()
    

    【讨论】:

      【解决方案6】:
      from pygame import mixer
      
      mixer.music.init()
      mixer.music.load("audio.mp3") # Paste The audio file location 
      mixer.play() 
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      • 该代码实际上与Rinzler786's answer 中的代码相同(尽管代码注释略有改进)。这个答案有一个解释。
      【解决方案7】:

      使用vlc

      import vlc
      player = None
      def play(sound_file):
          global player
          if player is not None:
              player.stop()
          player = vlc.MediaPlayer("file://" + sound_file)
          player.play()
      

      【讨论】:

      • 你能expand this answer吗?例如,需要安装什么? VLC media player?或者别的什么(一些开发文件不是 VLC 媒体播放器安装的一部分)?还是完全独立于 VLC 媒体播放器本身(一些独立库)?你在什么平台上测试过这个? (但没有“编辑:”、“更新:”或类似的 - 问题/答案应该看起来好像是今天写的。)
      • rambopython's answer 不那么简洁。
      【解决方案8】:

      我使用了一个单独的线程来播放声音而不阻塞主线程。

      from threading import Thread
      from playsound import playsound
      
      def play(path):
          """
          Play sound file in a separate thread
          (don't block current thread)
          """
          play_thread = Thread(target=lambda: playsound(path))
          play_thread.start()
      

      【讨论】:

        【解决方案9】:

        这是一种重现相似长度声音的解决方案。这个解决方案帮助我解决了错误:

        指定的设备未打开或未被 MCI 识别。

        这里遵循作为类方法的语法,但即使没有类,您也可以将其更改为工作。

        导入这些包:

        import multiprocessing
        import threading
        import time
        

        定义这个函数:

        def _reproduce_sound_nb(self, str_, time_s):
                def reproduce_and_kill(str_, time_sec=time_s):
                    p = multiprocessing.Process(target=playsound, args=(str_,))
                    p.start()
                    time.sleep(time_sec)
                    p.terminate()
                threading.Thread(target=reproduce_and_kill, args=(str_, time_s), daemon=True).start()
            
        

        在主程序/方法中:

        self._reproduce_sound_nb(sound_path, 3) # path to the sound, seconds after sound stop -> to manage the process end
        

        【讨论】:

          【解决方案10】:

          你可以试试just_playback。这是我围绕 miniaudio 编写的一个包装器,它在后台播放音频,同时提供播放控制功能,例如暂停、恢复、搜索和设置播放音量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多