当前位置: 首页 > wzjs >正文

电脑外设网站建设论文正常做网站多少钱

电脑外设网站建设论文,正常做网站多少钱,网页制作工具按其制作方式分为,wordpress介绍1. 背景介绍 在多线程环境下使用 PyAudio 可能会导致段错误(Segmentation Fault)或其他不可预期的行为。这是因为 PyAudio 在多线程环境下可能会出现资源冲突或线程安全问题。 PyAudio 是一个用于音频输入输出的 Python 库,它依赖于 PortAu…

1. 背景介绍

在多线程环境下使用 PyAudio 可能会导致段错误(Segmentation Fault)或其他不可预期的行为。这是因为 PyAudio 在多线程环境下可能会出现资源冲突或线程安全问题。

PyAudio 是一个用于音频输入输出的 Python 库,它依赖于 PortAudio 库。在多线程环境下,如果多个线程同时创建和销毁 PyAudio 实例,可能会导致资源冲突,从而引发段错误。

在多线程环境下,尽量避免在每个线程中创建和销毁 PyAudio 实例。相反,应该在主线程中创建一个共享的 PyAudio 实例,并在子线程中使用它。

import pyaudio
import threading# 在主线程中创建共享的 PyAudio 实例
p = pyaudio.PyAudio()def audio_thread_function():# 在子线程中使用共享的 PyAudio 实例stream = p.open(format=pyaudio.paInt16,channels=1,rate=44100,input=True,frames_per_buffer=1024)# 音频处理逻辑stream.stop_stream()stream.close()# 创建并启动多个音频线程
threads = []
for _ in range(4):thread = threading.Thread(target=audio_thread_function)thread.start()threads.append(thread)# 等待所有线程完成
for thread in threads:thread.join()# 在主线程中释放 PyAudio 资源
p.terminate()

2. 实际问题和解决方案

2.1 问题代码

import time
import pyaudio
import numpy as np
import librosa
import soundfile as sf
import threading
import os# 查找设备索引
def find_device_index(device_name, is_input=True):p = pyaudio.PyAudio()device_count = p.get_device_count()for i in range(device_count):device_info = p.get_device_info_by_index(i)if device_name in device_info['name']:if is_input and device_info['maxInputChannels'] > 0:p.terminate()return ielif not is_input and device_info['maxOutputChannels'] > 0:p.terminate()return ip.terminate()raise ValueError(f"Device '{device_name}' not found or not a {'input' if is_input else 'output'} device.")# 播放音频文件
def play_audio(file_path, device_index, start_event):start_event.wait()  # 等待事件被设置audio_data, sr = librosa.load(file_path, sr=None)# 创建 PyAudio 实例p = pyaudio.PyAudio()# 打开流stream = p.open(format=pyaudio.paFloat32,channels=1,rate=sr,output=True,output_device_index=device_index)# 播放音频stream.write(audio_data.astype(np.float32).tobytes())# 关闭流stream.stop_stream()stream.close()p.terminate()# 录音
def record_audio(device_index, output_file, start_event, stop_event):start_event.wait()  # 等待事件被设置p = pyaudio.PyAudio()# 打开输入流stream = p.open(format=pyaudio.paFloat32,channels=1,rate=44100,input=True,input_device_index=device_index,frames_per_buffer=1024)print(f"Recording to {output_file}...")frames = []while not stop_event.is_set():  # 检查停止事件data = stream.read(1024)frames.append(data)print("Recording finished.")# 关闭流stream.stop_stream()stream.close()p.terminate()# 保存录音audio_data = b''.join(frames)audio_array = np.frombuffer(audio_data, dtype=np.float32)sf.write(output_file, audio_array, 44100)# 主程序
if __name__ == "__main__":# 根据设备名称查找设备索引CUBE_4NANO_DYNA_INDEX = find_device_index("Cube 4Nano Dyna", is_input=False)SOUNDMATRIX_A10_OUTPUT_INDEX = find_device_index("SoundMatrix A10", is_input=False)SOUNDMATRIX_A10_INPUT_INDEX = find_device_index("SoundMatrix A10", is_input=True)# 获取音频文件列表audio_file1_folder = './Soundplay'audio_file2_folder = './A10play'audio_file1_list = [f for f in os.listdir(audio_file1_folder) if f.endswith('.wav')]audio_file2_list = [f for f in os.listdir(audio_file2_folder) if f.endswith('.wav')]# 创建事件对象start_event = threading.Event()stop_event = threading.Event()# 遍历每一对组合for audio_file1 in audio_file1_list:for audio_file2 in audio_file2_list:file_path1 = os.path.join(audio_file1_folder, audio_file1)file_path2 = os.path.join(audio_file2_folder, audio_file2)print(file_path1, file_path2)# 创建线程play_thread1 = threading.Thread(target=play_audio, args=(file_path1, CUBE_4NANO_DYNA_INDEX, start_event))play_thread2 = threading.Thread(target=play_audio,args=(file_path2, SOUNDMATRIX_A10_OUTPUT_INDEX, start_event))output_file_name = f"{os.path.splitext(audio_file1)[0]}_{os.path.splitext(audio_file2)[0]}_soundmatrix.wav"output_file_path = os.path.join('./A10rec', output_file_name)record_thread = threading.Thread(target=record_audio, args=(SOUNDMATRIX_A10_INPUT_INDEX, output_file_path, start_event, stop_event))# 启动录音和播放线程record_thread.start()  # 启动录音线程play_thread1.start()  # 播放第一个音频play_thread2.start()  # 播放第二个音频# 设置事件,开始播放和录音start_event.set()# 等待播放线程完成play_thread1.join()play_thread2.join()# 设置停止事件,结束录音stop_event.set()record_thread.join()# 重置事件以便下次使用start_event.clear()stop_event.clear()print("All tasks completed.")

报错:

./Soundplay/cafeteria_SNR0_副本3.wav ./A10play/SER0.wav
Recording to ./A10rec/cafeteria_SNR0_副本3_SER0_soundmatrix.wav...
Recording finished.
./Soundplay/cafeteria_SNR0_副本2.wav ./A10play/SER0.wavProcess finished with exit code 139 (interrupted by signal 11:SIGSEGV)

2.2 解决方案:共享 PyAudio 实例

import time
import pyaudio
import numpy as np
import librosa
import soundfile as sf
import threading
import os# 查找设备索引
def find_device_index(device_name, is_input=True, p=None):if p is None:p = pyaudio.PyAudio()need_terminate = Trueelse:need_terminate = Falsedevice_count = p.get_device_count()for i in range(device_count):device_info = p.get_device_info_by_index(i)if device_name in device_info['name']:if is_input and device_info['maxInputChannels'] > 0:if need_terminate:p.terminate()return ielif not is_input and device_info['maxOutputChannels'] > 0:if need_terminate:p.terminate()return iif need_terminate:p.terminate()raise ValueError(f"Device '{device_name}' not found or not a {'input' if is_input else 'output'} device.")# 播放音频文件
def play_audio(file_path, device_index, start_event, p):start_event.wait()  # 等待事件被设置audio_data, sr = librosa.load(file_path, sr=None)# 打开流stream = p.open(format=pyaudio.paFloat32,channels=1,rate=sr,output=True,output_device_index=device_index)# 播放音频stream.write(audio_data.astype(np.float32).tobytes())# 关闭流stream.stop_stream()stream.close()# 录音
def record_audio(device_index, output_file, start_event, stop_event, p):start_event.wait()  # 等待事件被设置buffer_size = 2048# 打开输入流stream = p.open(format=pyaudio.paFloat32,channels=1,rate=44100,input=True,input_device_index=device_index,frames_per_buffer=buffer_size)print(f"Recording to {output_file}...")frames = []while not stop_event.is_set():  # 检查停止事件data = stream.read(buffer_size)frames.append(data)print("Recording finished.")# 关闭流stream.stop_stream()stream.close()# 保存录音audio_data = b''.join(frames)audio_array = np.frombuffer(audio_data, dtype=np.float32)sf.write(output_file, audio_array, 44100)# 主程序
if __name__ == "__main__":# 创建共享的 PyAudio 实例p = pyaudio.PyAudio()# 根据设备名称查找设备索引CUBE_4NANO_DYNA_INDEX = find_device_index("Cube 4Nano Dyna", is_input=False, p=p)SOUNDMATRIX_A10_OUTPUT_INDEX = find_device_index("SoundMatrix A10", is_input=False, p=p)SOUNDMATRIX_A10_INPUT_INDEX = find_device_index("SoundMatrix A10", is_input=True, p=p)# 获取音频文件列表audio_file1_folder = './Soundplay'audio_file2_folder = './A10play'audio_file1_list = [f for f in os.listdir(audio_file1_folder) if f.endswith('.wav')]audio_file2_list = [f for f in os.listdir(audio_file2_folder) if f.endswith('.wav')]# 创建事件对象start_event = threading.Event()stop_event = threading.Event()# 遍历每一对组合for audio_file1 in audio_file1_list:for audio_file2 in audio_file2_list:file_path1 = os.path.join(audio_file1_folder, audio_file1)file_path2 = os.path.join(audio_file2_folder, audio_file2)print(file_path1, file_path2)# 创建线程play_thread1 = threading.Thread(target=play_audio, args=(file_path1, CUBE_4NANO_DYNA_INDEX, start_event, p))play_thread2 = threading.Thread(target=play_audio,args=(file_path2, SOUNDMATRIX_A10_OUTPUT_INDEX, start_event, p))output_file_name = f"{os.path.splitext(audio_file1)[0]}_{os.path.splitext(audio_file2)[0]}_soundmatrix.wav"output_file_path = os.path.join('./A10rec', output_file_name)record_thread = threading.Thread(target=record_audio, args=(SOUNDMATRIX_A10_INPUT_INDEX, output_file_path, start_event, stop_event, p))# 启动录音和播放线程record_thread.start()  # 启动录音线程play_thread1.start()  # 播放第一个音频play_thread2.start()  # 播放第二个音频# 设置事件,开始播放和录音start_event.set()# 等待播放线程完成play_thread1.join()play_thread2.join()# 设置停止事件,结束录音stop_event.set()record_thread.join()# 重置事件以便下次使用start_event.clear()stop_event.clear()time.sleep(3)# 释放 PyAudio 资源p.terminate()

文章转载自:

http://BadgzkBy.rtmqy.cn
http://ziFMVVjh.rtmqy.cn
http://jQNnpimd.rtmqy.cn
http://9Sbx1i8p.rtmqy.cn
http://OWbE7pmR.rtmqy.cn
http://OtW7kXsA.rtmqy.cn
http://HKo0bvxU.rtmqy.cn
http://kwgWTl90.rtmqy.cn
http://PphaAf7c.rtmqy.cn
http://clIiUAHg.rtmqy.cn
http://OxAwwnKF.rtmqy.cn
http://2y7QuXtO.rtmqy.cn
http://keLsdvLy.rtmqy.cn
http://dDIKaLB1.rtmqy.cn
http://k4qzXmqG.rtmqy.cn
http://xouOzSHY.rtmqy.cn
http://O2qoJXO1.rtmqy.cn
http://Fg7tNjCR.rtmqy.cn
http://sVdvvAha.rtmqy.cn
http://GDmAcqRp.rtmqy.cn
http://cWiA0czE.rtmqy.cn
http://OO53VitB.rtmqy.cn
http://9cVYRCSo.rtmqy.cn
http://25mwQAD3.rtmqy.cn
http://GHUP3IpM.rtmqy.cn
http://zUdNDo78.rtmqy.cn
http://msyPmsrt.rtmqy.cn
http://1yNLArOc.rtmqy.cn
http://I5Ky9aeH.rtmqy.cn
http://G72SC6t4.rtmqy.cn
http://www.dtcms.com/wzjs/689988.html

相关文章:

  • 重庆建网站wordpress+4.4.1+中文
  • 微信网站模板免费下载iis里如何装php网站
  • 免费网站宣传网站建设公司推荐时代创信
  • 列出网站目录网页设计作业html代码大全
  • 怎么查网站注册信息wordpress修改版权信息
  • 河北住房和城乡建设厅网站首网页策划案的范文
  • 做彩票网站服务器网站 繁体 js
  • 快速网站推广优化广东省自然资源厅事务中心
  • 南昌住房和城乡建设部网站电话上海比较好的外包公司
  • 腾讯云网站建设流程嘉兴网站公司
  • 网站添加地图自己做的娱乐平台网站
  • 四川鸿业建设集团网站上海待遇好的十大国企排名
  • 有没有学做蛋糕的网站和视频购物网站开发报告
  • 海口网站建设方案报价网站开发人员绩效考核
  • 常德网站建设产品写论文的好网站
  • 个人注册域名可以做网站么wordpress 标签模板下载
  • 常州建站价格文化馆门户网站建设的作用及意义
  • 怎么经营团购网站电商网站改版
  • 58同城网站建设目的个人养老缴费明细查询
  • asp和php网站的区别小语言网站建设
  • 绝味鸭脖网站建设规划书宿州商务网站建设
  • 网站备案网站名称网站开发专业就业前景分析
  • 宁波住房和建设局网站怎么做蛋糕
  • 微网站难做么微信怎么推广
  • 文化传媒公司 网站备案跨境电商无货源模式怎么做
  • 郑州seo网站推广桂林市建设局网站
  • 怎样成立网站dw软件怎么用怎么做网页
  • 哪里可以做拍卖网站最新新闻热点国家大事
  • 网站备案用的幕布可以淘宝做吗网站显示系统建设中
  • 阿里云对象存储做静态网站网站建设 名词解释