在pydub中是否有类似终止或停止功能的特性,使得通过play()开始播放的音频可以在仍在播放时突然停止,而不是播放到完整长度后再停止。
如前所述,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()
-> 使用Python播放和录制声音 -> PyAudio(全面指南)
https://realpython.com/playing-and-recording-sound-python/#pyaudio
从代码中可以看出,在播放流的 while 循环中,您可以将自己的逻辑放入其中。
我将尝试在我制作的项目中使用该组合。希望它能够正常工作。 :)
你可以在pydub的播放文件中使用多线程来播放/暂停甚至停止音乐。
在这里检查文件并用它替换pydub中的playback.py。
https://github.com/NeelRanka/pydub_edited_play-pause-stop.git
目前在pydub
中没有直接停止播放音频的方法,因为它可以使用后端的pyaudio
或ffplay
(取决于安装和可访问性)。
有关后端代码的详细信息,请参见此处。
但是,您可以按下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
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
我得到以下输出:sound_alarm is True ^Csound_alarm is True ^Csound_alarm is True sound_alarm is True
并且它继续无限循环。 - Bill Turnerstty intr ^c
进行设置,然后再尝试上述操作。 - Anil_M有可能因为没有提到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.')
从未被执行。它只是回到循环的顶部,在语句中播放声音(因此,显然,变量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()