pydub 中是否有类似终止或停止功能的东西,这样在 play() 启动后的流可以在仍在播放时突然停止,而不是音频播放到全长然后停止。
5 回答
正如已经提到的 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
冒着因为不提及 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会停止声音并结束循环。目前尚不清楚为什么这种逻辑适用于其中一种而不适用于另一种,但你有它。我很想开悟。
您可以在 pydub 的播放文件中使用多线程来播放/暂停甚至停止音乐。
检查文件here并用这个替换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
据我所知,我是第一次使用整个声音处理,您可以使用 pyaudio 将 wav 文件作为流播放。pyaudio 不是 pydub。:)
首先,使用 pydub/ffmpeg 将您的 anydata 文件转换为 wav 文件,见下文,然后使用 pyaudio 将其作为流播放,其中包含逻辑。
因为,当我用 pydub 播放 MP3 时,它会等待几秒钟,然后在 /tmp 文件夹中声明文件已转换为 wav。那么,为什么不只转换一次并将其保存到您自己的位置呢?无论如何,它都会持续几秒钟,但后一种转换只需完成一次(假设你有大量的千兆字节:)),然后你可以检查文件是否已经存在。
->
使用 Pydub 转换 Python 将 mp3 转换为 wav
-> 使用 python 播放和录制声音 -> pyaudio (综合指南)
https://realpython.com/playing-and-recording-sound-python/#pyaudio
正如您在代码中看到的,您可以将自己的逻辑放入播放流的 while 循环中。
我将尝试在我制作的项目中使用这种组合。希望它有效。:)