首页 新闻 会员 周边

wasapi中使用GetMixFormat获得的位深度和默认值不一样

0
悬赏园豆:20 [待解决问题]

需求:需要使用麦克风录音,其中通道数为8,所以使用wasapi,在调用geimixformat接口时,返回的数据中位深度显示为32,但是设备只有一个默认值为16并且不能修改,如果修改位深度将会初始化失败,各位大佬们帮忙看看呗

问题补充:


一芝麻一的主页 一芝麻一 | 初学一级 | 园豆:182
提问于:2023-02-28 17:03
< >
分享
所有回答(1)
0

实际上,WASAPI支持的位深度和采样率也取决于音频设备的能力,如果音频设备只支持16位深度,那么调用geimixformat接口时返回的位深度也仅能是16,无法修改。因此,如果设备只有16位深度并且不能修改,你可能需要考虑以下解决方案:

  1. 使用多个设备或多个线路克服这个限制。例如,你可以使用多个8通道设备,或者使用音频混音器将多个设备的输入混合成单个通道。

  2. 考虑使用ASIO或者Core Audio等其他音频API。这些API提供更灵活的配置选项,同时也可以支持更高的位深度和采样率。

  3. 调整音频处理流程,减小对高位深度的需求。例如,可以使用音频压缩算法(例如MP3、AAC等)来压缩音频数据,以减小对高位深度的依赖。需要注意的是,音频压缩会对音质产生一定的影响,因此需要根据具体情况进行权衡。

需要注意的是,以上解决方案都可能会增加系统成本和开发复杂度,因此需要根据具体情况进行选择。另外,如果你使用的是商业音频软件开发库,可以咨询该库的支持团队,他们可能会提供更为有针对性的解决方案。

以下是一个使用pyaudio库录制8通道音频的示例代码,其中使用了WASAPI API:

import pyaudio
import threading

class AudioRecorder:
    def __init__(self):
        self.chunk = 1024  # 一次性读取的数据块大小
        self.sample_rate = 44100  # 采样率
        self.channels = 8  # 录制的通道数
        self.format = pyaudio.paInt16  # 音频格式
        self.frames = [[] for i in range(self.channels)]  # 用于存储录音数据的列表
        self.stop_flag = False

    def start(self):
        threading.Thread(target=self.record).start()

    def record(self):
        with pyaudio.PyAudio() as pa:
            stream = pa.open(format=self.format,
                             channels=self.channels,
                             rate=self.sample_rate,
                             input=True,
                             frames_per_buffer=self.chunk,
                             input_host_api_specific_stream_info=pyaudio.PaWasapiStreamInfo(
                                 flags=pyaudio.paWASAPI_INPUT,
                                 input_device='Microphone Array (Realtek(R) Audio)',
                                 channel_mask=0xff00,  # 用于指定每个通道的掩码
                                 sample_format=pyaudio.paInt16,
                                 output=None,
                                 frames_per_buffer=self.chunk,
                                 stream=None))
            while not self.stop_flag:
                # 从音频流中读取数据,分别存储到不同通道的列表中
                data = stream.read(self.chunk)
                for i in range(self.channels):
                    self.frames[i].append(data[i::self.channels])

    def stop(self):
        self.stop_flag = True

    def get_frames(self):
        return self.frames

其中,AudioRecorder类用来录制音频,start方法用于启动录制线程,stop方法用于停止录制,get_frames方法用于获取录制的音频数据。在pa.open函数调用中,通过input_host_api_specific_stream_info参数指定了使用WASAPI API来进行录制,并且设置了通道掩码channel_mask以及每个通道的采样格式和帧数。具体的参数设置需要根据自己的音频设备来进行调整。

小九九呀 | 园豆:383 (菜鸟二级) | 2023-06-17 20:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册