如何在 MacOS 中从 AudioQueueRef 获取原始音频数据?

问题描述 投票:0回答:1

我正在尝试使用 AudioToolbox 和 CoreFoundation 框架从系统麦克风获取原始音频数据。到目前为止,将数据包写入文件逻辑是有效的,但是当我尝试将原始数据捕获到文件中时,某些值是 0。

static void MyAQInputCallback(void *inUserData, AudioQueueRef inQueue,
                             AudioQueueBufferRef inBuffer,
                             const AudioTimeStamp *inStartTime,
                             UInt32 inNumPackets,
                             const AudioStreamPacketDescription *inPacketDesc)
{
   MyRecorder *recorder = (MyRecorder *)inUserData;
   
   if (inNumPackets > 0)
   {
       
       CheckError(AudioFileWritePackets(recorder->recordFile, FALSE, inBuffer->mAudioDataByteSize,
                                        inPacketDesc, recorder->recordPacket, &inNumPackets, 
                                        inBuffer->mAudioData), "AudioFileWritePackets failed");
       
       recorder->recordPacket += inNumPackets;
       int sampleCount = inBuffer->mAudioDataBytesCapacity / sizeof(AUDIO_DATA_TYPE_FORMAT);
       
       AUDIO_DATA_TYPE_FORMAT* samples = (AUDIO_DATA_TYPE_FORMAT*)inBuffer->mAudioData;
       FILE *fp = fopen(filename, "a");
       for (int i = 0; i < sampleCount; i++){
           fprintf(fp, "%i;\n",samples[i]);
       }
       fclose(fp);
       
   }
   
   if (recorder->running)
       CheckError(AudioQueueEnqueueBuffer(inQueue, inBuffer,
                                          0, NULL), "AudioQueueEnqueueBuffer failed");
}

还有一些属性:

NumberRecordBuffers = 3
缓冲持续时间 = 0.1
格式->mFramesPerPacket = 1024
采样率 = 44100
inNumPackets = 4

1024 个样本中,仅填充了约 400 个。增加缓冲区持续时间会按比例增加有效数量,但总体数据仍然存在差距。写入的音频文件没有这样的错误。任何帮助表示赞赏。预先感谢您。

objective-c macos core-audio audioqueueservices
1个回答
0
投票

解决了它使用

recordFormat.mFormatID = kAudioFormatLinearPCM
记录和使用

int sampleCount = inBuffer->mAudioDataByteSize / sizeof(AUDIO_DATA_TYPE_FORMAT)
© www.soinside.com 2019 - 2024. All rights reserved.