2

pydub 中是否有类似终止或停止功能的东西,这样在 play() 启动后的流可以在仍在播放时突然停止,而不是音频播放到全长然后停止。

4

5 回答 5

2

正如已经提到的 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

于 2021-12-28T02:09:23.607 回答
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.')永远不会执行。它只是进入循环的顶部,插入语句并播放声音(因此,很明显,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会停止声音并结束循环。目前尚不清楚为什么这种逻辑适用于其中一种而不适用于另一种,但你有它。我很想开悟。

于 2019-10-15T19:24:27.627 回答
0

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

检查文件here并用这个替换pydub中的playback.py

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

于 2020-04-09T07:52:42.623 回答
0

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

但是,您可以按 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
于 2017-12-04T03:59:26.573 回答
0

据我所知,我是第一次使用整个声音处理,您可以使用 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 循环中。

我将尝试在我制作的项目中使用这种组合。希望它有效。:)

于 2020-02-15T20:13:54.917 回答