问题描述
from libs.PipeLine import PipeLine
from libs.YOLO import YOLOv5
from libs.Utils import *
from media.media import *
from media.pyaudio import *
import media.wave as wave
import os
def play_audio_file(filename):
"""播放音频文件(如果初始化失败则静默跳过,不影响主流程)"""
wf = None
stream = None
p = None
# 检查文件是否存在
try:
os.stat(filename)
except:
print(f"⚠️ 音频文件不存在: {filename}")
# 如果os.path.exists不可用,尝试直接打开文件
return
wf = wave.open(filename, 'rb') # 打开wav文件
CHUNK = int(wf.get_framerate() / 25) # 设置音频chunk值
print(f"CHUNK={CHUNK}")
p = PyAudio()
p.initialize(CHUNK) # 初始化PyAudio对象
# MediaManager.init()
# 注意:MediaManager已由Pipeline初始化,无需重复初始化
print(2)
# 创建音频输出流,设置的音频参数均为wave中获取到的参数
# 如果初始化失败(如资源被占用),则静默跳过
stream = p.open(format=p.get_format_from_width(wf.get_sampwidth()),
channels=wf.get_channels(),
rate=wf.get_framerate(),
output=True,
frames_per_buffer=CHUNK)
print(3)
# 设置音频输出流的音量
stream.volume(vol=5000000)
data = wf.read_frames(CHUNK) # 从wav文件中读取一帧数据
while data:
stream.write(data) # 将帧数据写入到音频输出流中
data = wf.read_frames(CHUNK) # 从wav文件中读取一帧数据
print(4)
if stream:
stream.stop_stream() # 停止音频输出流
stream.close() # 关闭音频输出流
if p:
p.terminate() # 释放音频对象
if wf:
wf.close() # 关闭wav文件
# MediaManager.deinit()
# 注意:不要调用MediaManager.deinit(),因为Pipeline还在使用它
if __name__=="__main__":
# 添加显示模式,默认hdmi,可选hdmi/lcd/lt9611/st7701/hx8399/nt35516,其中hdmi默认置为lt9611,分辨率1920*1080;lcd默认置为st7701,分辨率800*480
display_mode="lcd"
rgb888p_size=[320, 320]
pl=PipeLine(rgb888p_size=rgb888p_size,display_mode=display_mode)
pl.create()
while True:
play_audio_file("/sdcard/examples/0.wav")
pl.destroy()
硬件板卡
庐山派
软件版本
CanMV_K230_LCKFB_micropython_v1.4-24-gf73abaf_nncase_v2.9.0