如何使用pyaudio循环播放音频? [英] How to loop-play an audio with pyaudio?

查看:383
本文介绍了如何使用pyaudio循环播放音频?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Pyaudio和tkinter播放音频波形文件,其中按下按钮时播放音频,按下停止按钮时音频停止.现在,音频是一个简单的5秒波形文件,假设如此,音频将在5秒后停止.我想知道如何循环播放,这样除非单击停止按钮,否则音频将一直持续播放.我找不到这种代码的方法.

I want to play an audio wave file using Pyaudio and tkinter where the audio plays when the button is pressed and the audio stops when the stop button is pressed. Now, the audio is a simple 5 secs wave file, as it is suppose to, the audio stops after 5 secs. I would like to know how to loop it, such that the audio keeps on playing forever unless the stop button is clicked. I cannot find a way with this code.

from tkinter import *
import pyaudio
import wave
import sys
import threading

# --- classes ---

def play_audio():
    global is_playing
    global my_thread
    chunk = 1024
    wf = wave.open('sound.wav', 'rb')
    p = pyaudio.PyAudio()

    stream = p.open(
        format = p.get_format_from_width(wf.getsampwidth()),
        channels = wf.getnchannels(),
        rate = wf.getframerate(),
        output = True)

    data = wf.readframes(chunk)

    while data != '' and is_playing: # is_playing to stop playing
        stream.write(data)
        data = wf.readframes(chunk)



    stream.stop_stream()
    stream.close()
    p.terminate()


# --- functions ---

def press_button_play():
    global is_playing
    global my_thread

    if not is_playing:
        is_playing = True
        my_thread = threading.Thread(target=play_audio)
        my_thread.start()

def press_button_stop():
    global is_playing
    global my_thread

    if is_playing:
        is_playing = False
        my_thread.join()

# --- main ---

is_playing = False
my_thread = None

root = Tk()
root.title("Compose-O-Matic")
root.geometry("400x300")

button_start = Button(root, text="PLAY", command=press_button_play)
button_start.grid()

button_stop = Button(root, text="STOP", command=press_button_stop)
button_stop.grid()

root.mainloop()

推荐答案

循环播放音频的一种方法是定义一个函数loop_play,该函数将在循环中执行play_audio并将该函数作为线程的目标传递:

A way to loop-play the audio is to define a function loop_play that will execute play_audio in loop and pass this function as target of the thread:

def loop_play():
    while is_playing:
        play_audio()

def press_button_play():
    global is_playing
    global my_thread

    if not is_playing:
        is_playing = True
        my_thread = threading.Thread(target=loop_play)
        my_thread.start()

这篇关于如何使用pyaudio循环播放音频?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆