在Beeware中使用Android AudioRecord采样麦克风遇歧义错误求助
问题:Beeware中使用Android AudioRecord读取PCM数据的类型歧义错误
我通过Beeware在Python脚本中调用Android的android.media类(MediaPlayer、MediaRecorder、AudioRecord),已在Galaxy23上实现基础音频播放与录制。但我的音频信号处理应用需要PCM格式输出,MediaRecorder无法满足需求,而AudioRecord虽支持PCM采样麦克风信号,却遇到了类型匹配问题:
尝试调用AudioRecord.read(byte[] ...)时传入dtype=np.int8/np.byte的numpy数组,或调用read(float[] ...)时传入dtype=np.float32的numpy数组,均触发歧义错误:
android.media.AudioRecord.read is ambiguous for arguments (ndarray, int, int): options are int android.media.AudioRecord.read(byte[], int, int), int android.media.AudioRecord.read(short[], int, int)
尽管np.int8/np.byte对应Java的signed byte类型,np.float32对应浮点类型,但AudioRecord无法识别numpy数组。由于第三方音频模块无法在Beeware环境中使用,需找到正确调用AudioRecord完成PCM采样的方法。
解决方法
调整后问题已解决,核心是使用Java原生类型数组作为AudioRecord.read()的参数,再将数据转换到numpy数组中处理。完整实现代码如下:
def record_file(self, widget): # 创建AudioRecord对象 self.source = MediaRecorder.AudioSource.MIC self.sampleRate = 8000 self.channel = AudioFormat.CHANNEL_IN_MONO self.encoding = AudioFormat.ENCODING_PCM_16BIT self.minBufferSize = AudioRecord.getMinBufferSize(self.sampleRate, self.channel, self.encoding) self.recorder = AudioRecord(self.source, self.sampleRate, self.channel, self.encoding, self.minBufferSize) self.recorder.startRecording() # 创建用于存储音频数据的字节数组 self.byteRate = 2 * self.sampleRate self.readTimePeriod = self.minBufferSize / self.byteRate self.readArray = np.zeros(self.minBufferSize, dtype=np.int8) self.audioData = jarray(jbyte)(self.readArray) while True: # 等待缓冲区填满 time.sleep(self.readTimePeriod) # 从缓冲区读取音频数据 self.bytesRead = self.recorder.read(self.audioData, 0, self.minBufferSize, 0) # 将字节数组中的数据转换到numpy数组 for i in range(self.minBufferSize): self.readArray[i] = self.audioData[i]
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

