如何使用 pyaudio 循环播放音频?
How to loop-play an audio with pyaudio?
我想使用 Pyaudio 和 tkinter 播放音频波形文件,按下按钮时播放音频,按下停止按钮时音频停止。现在,音频是一个简单的 5 秒 wave 文件,正如它所假设的那样,音频在 5 秒后停止。我想知道如何循环播放,这样除非单击停止按钮,否则音频会一直播放。我找不到使用此代码的方法。
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
并将此函数作为线程的目标传递:
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 和 tkinter 播放音频波形文件,按下按钮时播放音频,按下停止按钮时音频停止。现在,音频是一个简单的 5 秒 wave 文件,正如它所假设的那样,音频在 5 秒后停止。我想知道如何循环播放,这样除非单击停止按钮,否则音频会一直播放。我找不到使用此代码的方法。
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
并将此函数作为线程的目标传递:
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()