停止在pydub中播放音频

时间:2017-12-01 14:55:01

标签: python audio playback pydub

在pydub中是否存在类似终止或停止功能的内容,以便播放后播放的流()可以在播放时突然停止,而不是播放的音频全长,然后停止播放。

4 个答案:

答案 0 :(得分:0)

目前没有直接停止在pydub播放音频的方法,因为它可以在后端使用pyaudioffplay(具体取决于安装的内容)并且可访问)。 请参阅后端代码here

的详细信息

但是,你可以点击 Ctrl + c 来打破游戏,并在play块中包裹try - except方法。它会生成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

答案 1 :(得分:0)

冒着因不提及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.')不会被执行。它只是到达循环的顶部,对语句进行inrt并播放声音(因此,很明显,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 确实会停止声音并结束循环。目前尚不清楚为什么这种逻辑只适用于一个逻辑而不适用于另一个逻辑。我很想开悟。

答案 2 :(得分:0)

据我所知,这是我第一次使用整个声音处理程序,您可以使用pyaudio将wav文件作为流播放。 pyaudio不是pydub。 :)

首先,使用pydub / ffmpeg将anydata文件转换为wav文件,请参见下文,然后使用pyaudio将其作为具有逻辑之间的流播放。

因为,当我使用pydub播放MP3时,它会等待几秒钟,然后指出该文件已在/ tmp-folder中转换为wav。那么,为什么不将其转换一次并保存到您自己的位置呢?无论哪种方式,它都会持续几秒钟,但是后者的转换只需完成一次(假设您有成吨的千兆字节:)),然后您就可以检查文件是否已经存在。

->转换
Python convert mp3 to wav with Pydub

->使用python播放和录制声音-> pyaudio(全面指南)
https://realpython.com/playing-and-recording-sound-python/#pyaudio

如代码中所见,您可以将自己的逻辑放入播放流的while循环中。

我将尝试在我制作的项目中使用该组合。希望它能工作。 :)

答案 3 :(得分:0)

您可以在pydub的播放文件中使用多线程来播放/暂停,甚至停止音乐。

在此处检查文件,并用

替换pydub中的playback.py。

https://github.com/NeelRanka/pydub_edited_play-pause-stop.git