首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在pydub中停止播放音频

在pydub中停止播放音频
EN

Stack Overflow用户
提问于 2017-12-01 22:55:01
回答 5查看 3.8K关注 0票数 1

pydub中是否有类似terminate或stop的特性,这样在play()启动后,流可以在播放时突然停止,而不是将音频播放到全长然后停止。

EN

回答 5

Stack Overflow用户

发布于 2021-12-28 02:09:24

正如前面提到的,pydub本身并没有提供这样的功能。但是,可以使用多处理来停止音乐:

代码语言:javascript
运行
复制
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()会停止该进程,并停止播放音频。

编辑

我找到了一种更好的方法,省去了不必要的繁重进程。

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2017-12-04 11:59:27

目前还没有直接停止播放pydub音频的方法,因为它可以在后台使用pyaudioffplay (取决于安装的和可访问的内容)。查看后端代码here的详细信息

但是,您可以按Ctrl +c来中断播放,并在try - except块中绕过play方法。它会生成KeyboardInterrupt异常,您可以根据需要对其进行处理。

这是一个在windows上测试过的工作示例。

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-10-16 03:24:28

冒着没有提到pydub而被否决的风险,我想我应该在这一点上分享我所知道的。我从来没有让它与pydub一起工作,据我所知,我使用了@Anil_M的答案。让我在这里再次分享这一点,因为代码格式显然不能在注释中工作。

代码语言:javascript
运行
复制
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文件以外的任何文件。下面是实现该功能的代码:

代码语言:javascript
运行
复制
# 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确实会停止声音,也会结束循环。目前还不清楚为什么这种逻辑只适用于其中一个,而不适用于另一个,但现在你已经知道了。我很想得到启发。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47596007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档