|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
程式思路:
1.将声音输出调到最大
2.有3个录音文件,
一边播放录音文件,一边弹窗询问是否有声音
若在声音播放完成前点击了是/否的选项,就强行停止当前声音播放,
3.开始播放下一个录音文件并弹出新的窗口来问是否有声音
问题描述:
我发现在强行关闭音频播放的时候可能导致如下错误,但是不知道如何设置防止
代码部分如下:
- from pygame import mixer
- import sounddevice as sd
- from comtypes import CLSCTX_ALL
- from ctypes import cast, POINTER
- from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
复制代码
class audio_manual_check():
def __init__(self,status):
self.status = status
if(status == 'step1'):
basicname = logsavepath+'\\faudio_function_before_all.wav'
afters3name = logsavepath+'\\faudio_function_after_s3.wav'
afters4name = logsavepath+'\\faudio_function_after_s4.wav'
resultfile = program_results['front audio']
manual_check_file = faudio_manual_check_file
elif(status == 'step2'):
basicname = logsavepath+'\\baudio_function_before_all.wav'
afters3name = logsavepath+'\\baudio_function_after_s3.wav'
afters4name = logsavepath+'\\baudio_function_after_s4.wav'
resultfile = program_results['back audio']
manual_check_file = baudio_manual_check_file
self.ans = False
audio_check = self.set_audio_device()
if(audio_check == False):
self.ask_window(title='提示',choosetype = 1,filename='')
else:
self.ans = True
if self.ans == True:
with open(manual_check_file,'w',encoding='utf-8')as f:
f.write('yes')
self.set_speaker_volume()
if os.path.exists(basicname):
check = True
mixer.init()
mixer.music.load(basicname)
mixer.music.play()
self.ask_window(title='Result check',choosetype = 2,filename=basicname)
if self.ans == False:
check = False
else:
check = False
if(check == False):
with open(resultfile,"w",encoding='utf-8') as f:
f.write('fail')
try:
mixer.music.stop()
pygame.quit()
return
except:
return
try:
mixer.music.stop()
except:
pass
if os.path.exists(afters3name):
check = True
mixer.music.load(afters3name)
mixer.music.play()
self.ask_window(title='Result check',choosetype = 3,filename=afters3name)
if self.ans == False:
check = False
else:
check = False
if(check == False):
with open(resultfile,"w",encoding='utf-8') as f:
f.write('fail')
try:
mixer.music.stop()
pygame.quit()
return
except:
return
if(check == True):
try:
mixer.music.stop()
except:
pass
if os.path.exists(afters4name):
check = True
mixer.music.load(afters4name)
mixer.music.play()
self.ask_window(title='Result check',choosetype = 4,filename=afters4name)
if self.ans == False:
check = False
else:
check = False
if(check == False):
with open(resultfile,"w",encoding='utf-8') as f:
f.write('fail')
try:
mixer.music.stop()
pygame.quit()
return
except:
return
else:
with open(resultfile,"w",encoding='utf-8') as f:
f.write('fail')
with open(manual_check_file,'w',encoding='utf-8')as f:
f.write('yes')
def ask_window(self,title,choosetype,filename):
self.filename = filename
self.music_check = False
self.win = tk.Tk()
self.count = 30
w,h = 400,180
# Define Color
bgcolora = '#0099CC'
bgcolorb = '#FFFFCC'
bgcolorc = '#666699'
# Add a title
self.win.title(title)
self.win.attributes('-topmost',1)
self.win.wm_geometry('')
#self.win.geometry('%sx%s'%(w,h))
self.win.geometry("+"+str(int(int(self.win.winfo_screenwidth())/2)-int(w/2))+"+"+str(int(int(self.win.winfo_screenheight())/2-int(h/2))))
# Disable resizing the GUI
self.win.resizable(0,0)
self.win.iconbitmap(iconfile)
self.win.protocol('WM_DELETE_WINDOW',self.callback) # 窗体的通信协议方法
#background color
self.win.config(background=bgcolora)#"#f4fffc")
if(choosetype == 1):
message1 = "即将测试audio声音文件"
message2 = "检测到当前无audio输入输出设备"
message3 = "请接入设备后,点击重新检测或Fail audio function"
elif(choosetype == 2):
message1 = "正在检测:Front Audio Function"
message2 = "正在播放30s的音频,剩余时间 : 30s"
message3 = "请确认是否有声音输出且声音流畅"
elif(choosetype == 3):
message1 = "正在检测:after S3"
message2 = "正在播放30s的音频,剩余时间 : 30s"
message3 = "请确认是否有声音输出且声音流畅"
elif(choosetype == 4):
message1 = "正在检测:after S4"
message2 = "正在播放30s的音频,剩余时间 : 30s"
message3 = "请确认是否有声音输出且声音流畅"
textlabel = LabelFrame(self.win,bg=bgcolorb,bd=0)
text1=tk.Label(textlabel,text=message1,bg=bgcolorb,fg='Red',font=('黑体', 16, 'bold'))
text1.pack(anchor=tk.W,pady=5)
self.text2=tk.Label(textlabel,text=message2,bg=bgcolorb,fg=bgcolorc,font=('黑体', 14))
self.text2.pack(anchor=tk.W,pady=5)
text3=tk.Label(textlabel,text=message3,bg=bgcolorb,fg=bgcolorc,font=('黑体',14))
text3.pack(anchor=tk.W,pady=5)
textlabel.pack(padx=10,pady=10,fill=BOTH)
btnlabel = LabelFrame(self.win,bd=0,background=bgcolora)
if(choosetype != 1):
pause = 25
yesbtn =tk.Button(btnlabel, text="是", relief='raised', width=6, height=1,font=("Times",12,"bold"),fg = bgcolorc,bg = bgcolorb,command=self.yes_part)
yesbtn.grid(row=0,column=0,padx=pause,sticky=N)
nobtn =tk.Button(btnlabel, text="否", relief='raised', width=6, height=1,font=("Times",12,"bold"),fg = bgcolorc,bg = bgcolorb,command=self.no_part)
nobtn.grid(row=0,column=2,padx=pause,sticky=N)
playbtn =tk.Button(btnlabel, text="重新播放", relief='raised', width=10, height=1,font=("Times",12,"bold"),fg = bgcolorc,bg = bgcolorb,command=self.replay_part)
playbtn.grid(row=0,column=1,padx=pause,sticky=N)
btnlabel.pack(padx=10,pady = 10,fill = BOTH)
self.win.after(1000,self.jian)
else:
pause = 60
yesbtn =tk.Button(btnlabel, text="重新检测", relief='raised', width=10, height=1,font=("Times",12,"bold"),fg = bgcolorc,bg = bgcolorb,command=self.detect_audio)
yesbtn.grid(row=0,column=0,padx=pause,sticky=N)
nobtn =tk.Button(btnlabel, text="Audio Fail", relief='raised', width=10, height=1,font=("Times",12,"bold"),fg = bgcolorc,bg = bgcolorb,command=self.no_part)
nobtn.grid(row=0,column=2,padx=pause,sticky=N)
btnlabel.pack(padx=10,pady = 10,fill = BOTH)
#======================
# Start GUI
#======================
self.win.mainloop()
def callback(self):
pass
def djs(self):
if(self.count > 0):
self.text2["text"]=("正在播放30s的音频,剩余时间 : %ss"%self.count)
self.s=self.win.after(1000,self.jian)
else:
self.text2["text"]=("音频播放已完成,点击重新播放")
def jian(self):
try:
self.count -= 1
except:
self.count = 29
self.djs()
def detect_audio(self):
self.win.destroy()
audio_manual_check(self.status)
def yes_part(self):
self.win.destroy()
self.ans = True
if(self.music_check == True):
try:
mixer.music.stop()
pygame.quit()
return
except:
return
def no_part(self):
self.win.destroy()
self.ans = False
if(self.music_check == True):
try:
mixer.music.stop()
pygame.quit()
return
except:
return
def replay_part(self):
mixer.init()
mixer.music.load(self.filename)
mixer.music.play()
self.music_check = True
self.count = 30
def set_audio_device(self):
alldevice = sd.query_devices()
minput,moutput,setname = None,None,None
for a in alldevice:
if('Realtek(R) Audio' in a['name']):
if('Microphone' in a['name']):
minput = a['index']
if('麦克风' in a['name']):
minput = a['index']
if('Speakers' in a['name']):
moutput = a['index']
setname = a['name']
if('扬声器' in a['name']):
moutput = a['index']
setname = a['name']
if(minput != None)and(moutput != None):
break
if(minput == None)and(moutput == None):
for a in alldevice:
if('High Definition' in a['name']):
if('Microphone' in a['name']):
minput = a['index']
if('麦克风' in a['name']):
minput = a['index']
if('Speakers' in a['name']):
moutput = a['index']
setname = a['name']
if('扬声器' in a['name']):
moutput = a['index']
setname = a['name']
if(minput != None)and(moutput != None):
break
if(minput != None)and(moutput != None):
try:
sd.default.device = [minput,moutput]
for f in (str(sd.query_devices()).split('\n')):
if('<'in f):
if(moutput in f):
print('audio output set successfully')
return True
return True
except:
print('First Set audio device fail')
print('Ready to set second time')
try:
workpath = os.getcwd()
os.chdir(workpath+'\\lib')
os.system("nircmdc setdefaultsounddevice %s" % setname)
os.chdir(workpath)
except:
print('Second Set audio device fail')
return False
else:
print('No audio device found')
return False
def set_speaker_volume(self):
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
# 判断是否静音,mute为1代表是静音,为0代表不是静音
mute = volume.GetMute()
if mute == 1:
print('Speaker当前是静音状态')
print('尝试设置Speaker为非静音状态')
setcheck = volume.SetMute(0,None)
if(setcheck == 1):
print('设置Speaker为非静音状态 - 成功')
else:
print('设置Speaker为非静音状态 - 失败')
else:
print('Speaker当前是非静音状态')
# 获取音量值,0.0代表最大,-65.25代表最小
vl = volume.GetMasterVolumeLevel()
print('当前Speaker音量值为%s' % vl)
# 获取音量范围,我的电脑经测试是(-65.25, 0.0, 0.03125),第一个应该代表最小值,第二个代表最大值,第三个不知道是干嘛的。也就是音量从大到小是0.0到-65.25这个范围
try:
vr = volume.GetVolumeRange()
print('当前Speaker音量值为%s' % str(vr))
except:
vr = (-65.25, 0.0, 0.03125)
print('使用默认的Speaker音量值为%s' % str(vr))
# 设置音量, 比如-13.6代表音量是40,0.0代表音量是100
volume.SetMasterVolumeLevel(vr[1], None)
print('已设置Speaker音量为100%')
|
|