pydub中是否有类似terminate或stop的特性,这样在play()启动后,流可以在播放时突然停止,而不是将音频播放到全长然后停止。
发布于 2021-12-28 02:09:24
正如前面提到的,pydub本身并没有提供这样的功能。但是,可以使用多处理来停止音乐:
from pydub import AudioSegment
from pydub.playback import play
from multiprocessing import Process
some_audio = AudioSegment.from_file('yourAudioFile.mp3')
process = Process(target=play, args=(some_audio,))
if __name__ == '__main__':
    process.start()
    time.sleep(2000) # do some stuff inbetween
    process.terminate()方法terminate()会停止该进程,并停止播放音频。
编辑
我找到了一种更好的方法,省去了不必要的繁重进程。
from pydub import AudioSegment
from pydub.playback import _play_with_simpleaudio
some_audio = AudioSegment.from_file('yourAudioFile.mp3')
playback = _play_with_simpleaudio(some_audio)
time.sleep(2000)  # do some stuff inbetween
playback.stop()  更多细节:https://github.com/jiaaro/pydub/issues/160#issuecomment-497953546
发布于 2017-12-04 11:59:27
目前还没有直接停止播放pydub音频的方法,因为它可以在后台使用pyaudio或ffplay (取决于安装的和可访问的内容)。查看后端代码here的详细信息
但是,您可以按Ctrl +c来中断播放,并在try - except块中绕过play方法。它会生成KeyboardInterrupt异常,您可以根据需要对其进行处理。
这是一个在windows上测试过的工作示例。
from pydub import AudioSegment
from pydub.playback import play
song = AudioSegment.from_wav("audio.wav")
while True:
    try:
        play(song)
    except KeyboardInterrupt:
        print "Stopping playing"
        break #to exit out of loop, back to main program发布于 2019-10-16 03:24:28
冒着没有提到pydub而被否决的风险,我想我应该在这一点上分享我所知道的。我从来没有让它与pydub一起工作,据我所知,我使用了@Anil_M的答案。让我在这里再次分享这一点,因为代码格式显然不能在注释中工作。
from pydub import AudioSegment
from pydub.playback import play
# music files
f = '/home/worldwidewilly/workspace/deliberate-action/action/on-the-run-snippet.mp3'
# run pydub
sound = AudioSegment.from_file(f, format="mp3")
def ring():
    sound_alarm = True
    while True:
        try:
            print(f'sound_alarm is {sound_alarm}')
            if sound_alarm == False:
                return
            play(sound)
        except KeyboardInterrupt:
            sound_alarm = False
            print('done playing sound.')
            break
if __name__ == "__main__":
    import sys
    ring()当执行上面的代码并按下ctrl+C时,声音确实停止播放,但它永远不会到达KeyboardInterrupt逻辑,即print('done playing sound.')永远不会执行。它只是转到循环的顶部,插入语句,并播放声音(所以,很明显,var sound_alarm永远不会等于False)。
我想到的解决方案是使用simpleaudio。缺点是我还没有弄清楚如何播放.wav文件以外的任何文件。下面是实现该功能的代码:
# run simpleaudio
wave_obj = sa.WaveObject.from_wave_file(f)
def ring():
    # sound_alarm = True
    while True:
        try:
            play_obj = wave_obj.play()
            play_obj.wait_done()
        except KeyboardInterrupt:
            play_obj.stop()
            print('done playing sound.')
            break
if __name__ == "__main__":
    import sys
    ring()在这里按ctrl-C确实会停止声音,也会结束循环。目前还不清楚为什么这种逻辑只适用于其中一个,而不适用于另一个,但现在你已经知道了。我很想得到启发。
https://stackoverflow.com/questions/47596007
复制相似问题