如何解决如何使用 pyaudio 制作我的音频循环?
首先,我对这个库还很陌生,我并不是真的了解所有内容。在互联网的帮助下,我设法让这个代码片段工作。此代码基本上播放音频文件(具体来说是 .wav)。问题是它只播放一次;我希望音频文件循环播放,直到我将 is_looping
变量设置为 False。
import pyaudio
import wave
class AudioFile:
chunk = 1024
def __init__(self,file_dir):
""" Init audio stream """
self.wf = wave.open(file_dir,'rb')
self.p = pyaudio.PyAudio()
self.stream = self.p.open(
format=self.p.get_format_from_width(self.wf.getsampwidth()),channels=self.wf.getnchannels(),rate=self.wf.getframerate(),output=True
)
def play(self):
""" Play entire file """
data = self.wf.readframes(self.chunk)
while data != '':
self.stream.write(data)
data = self.wf.readframes(self.chunk)
def close(self):
""" Graceful shutdown """
self.stream.close()
self.p.terminate()
is_looping = True
audio = AudioFile("___.wav")
audio.play()
audio.close()
我试过做这样的事情,但还是不行:
is_looping = True
audio = AudioFile("___.wav")
while is_looping:
audio.play()
audio.close()
解决方法
我找不到使用我的代码循环播放音频的方法,但我在互联网上找到了一个代码,它完全符合我的要求。这是链接:https://gist.github.com/THeK3nger/3624478
这是来自该链接的代码:
import os
import wave
import threading
import sys
# PyAudio Library
import pyaudio
class WavePlayerLoop(threading.Thread):
CHUNK = 1024
def __init__(self,filepath,loop=True):
"""
Initialize `WavePlayerLoop` class.
PARAM:
-- filepath (String) : File Path to wave file.
-- loop (boolean) : True if you want loop playback.
False otherwise.
"""
super(WavePlayerLoop,self).__init__()
self.filepath = os.path.abspath(filepath)
self.loop = loop
def run(self):
# Open Wave File and start play!
wf = wave.open(self.filepath,'rb')
player = pyaudio.PyAudio()
# Open Output Stream (based on PyAudio tutorial)
stream = player.open(format=player.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)
# PLAYBACK LOOP
data = wf.readframes(self.CHUNK)
while self.loop:
stream.write(data)
data = wf.readframes(self.CHUNK)
if data == b'': # If file is over then rewind.
wf.rewind()
data = wf.readframes(self.CHUNK)
stream.close()
player.terminate()
def play(self):
"""
Just another name for self.start()
"""
self.start()
def stop(self):
"""
Stop playback.
"""
self.loop = False
你只需要在类外添加类似这样的东西就可以了:
player = WavePlayerLoop("sounds/1.wav")
player.play()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。