0

我有一个播放 wav 文件的非常基本的 pyaudio 代码。

    open_wave = wave.open("tone_silence/l0r1d0_500.wavc",'rb')

    pyAudio_session = pyaudio.PyAudio()

    def callback(in_data, frame_count, time_info, status):
        data = open_wave.readframes(frame_count)
        return (data, pyaudio.paContinue)
    pyAudio_stream = pyAudio_session.open(
        format = pyAudio_session.get_format_from_width(open_wave.getsampwidth()),
        channels = open_wave.getnchannels(),
        rate = open_wave.getframerate(),
        output = True,
        stream_callback=callback)

    while pyAudio_stream.is_active():
        time.sleep(0.1)

    pyAudio_stream.stop_stream()
    pyAudio_stream.close()
    print("Stopped")
    pyAudio_session.terminate()

我已经搜索了互联网的每个角落,以找到一种方法,以便我可以根据需要更改流的分贝级别并将立体声输出平移到特定通道(仅限左扬声器/仅限右扬声器)。但我找不到任何方法。

我无法切换到 pydub(它实际上具有此功能),因为它不允许我随时关闭流;它播放完整的音频,不能突然关闭。

4

1 回答 1

0

虽然pydub没有直接停止audioSegment播放的方法,但根据此文档,它将音频分成半秒的块以方便键盘中断。

因此,如果我们获取音频并while loop在一个try-except块内运行,我们应该能够使用“Ctrl + c”中断播放

这是一个工作示例代码,它根据此处的文档将音频平移到左声道或右声道,然后使用上述逻辑在“Ctrl + c”时停止播放

from pydub import AudioSegment
from pydub.playback import play

song = AudioSegment.from_wav("music.wav")

# pan the sound 15% to the right
panned_right = song.pan(+0.15)

# pan the sound 50% to the left
panned_left = song.pan(-0.50)

#Play panned left audio
while True:
    try:
        play(panned_left)
    except KeyboardInterrupt:
        print "Stopping playing"
        break

从播放循环中断后,我们会得到空闲会话提示。您可以根据自己的需要定制。

Output:
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Stopping playing
>>> 

这使您可以轻松地使用内置的平移方法,pydub并且还可以在中途中断播放。希望这可以帮助您解决问题。

EDIT-1
上面的解决方案可能会遇到问题,即while循环将无限期地播放(如果你不打破它。)。它可能仅适用于测试。

另一种选择是使用python multiprocess模块来生成一个播放音频片段的进程,并terminate在不需要时播放它。这在播放期间提供了更多控制。

这是一个例子。

from multiprocessing import Process

def play_audio(seg):
    play(seg)

if __name__ == '__main__':
    p = Process(target=play_audio, args=(panned_left,))
    p.start()

当您需要停止音频时,只需p.terminate()在 IDE 或程序中调用即可。

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
>>> p.terminate()
>>> 
于 2017-12-04T04:37:28.557 回答