gpt4 book ai didi

objective-c - 如何从 iOS 中的 AudioQueueRef 获取 float 音频数据数组?

转载 作者:技术小花猫 更新时间:2023-10-29 10:26:12 30 4
gpt4 key购买 nike

我正在努力以一种可以将音频传递给 (C++) 分析算法的形式将音频导入 iPhone。当然,有很多选择:AudioQueue 教程 at trailsinthesand让事情开始。

不过,音频回调提供了一个 AudioQueueRef,而且我发现 Apple 的文档在这方面的内容很薄。写入文件的内置方法,但您实际上无法在数据包内部查看数据。

我需要数据。我不想向文件写入任何内容,这似乎是所有教程——甚至 Apple 的便利 I/O 对象——的目标。 Apple 的 AVAudioRecorder(令人恼火地)会给你水平和写入数据,但实际上不会让你访问它。除非我遗漏了什么...

如何做到这一点?在下面的代码中有 inBuffer->mAudioData 非常接近,但我找不到关于此“数据”的格式或如何访问它的信息。

音频队列回调:

void AudioInputCallback(void *inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription *inPacketDescs)
{
static int count = 0;
RecordState* recordState = (RecordState*)inUserData;
AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);

++count;
printf("Got buffer %d\n", count);
}

以及将音频写入文件的代码:

OSStatus status = AudioFileWritePackets(recordState->audioFile,
false,
inBuffer->mAudioDataByteSize,
inPacketDescs,
recordState->currentPacket,
&inNumberPacketDescriptions,
inBuffer->mAudioData); // THIS! This is what I want to look inside of.
if(status == 0)
{
recordState->currentPacket += inNumberPacketDescriptions;
}

最佳答案

  // so you don't have to hunt them all down when you decide to switch to float: 
#define AUDIO_DATA_TYPE_FORMAT SInt16

// the actual sample-grabbing code:
int sampleCount = inBuffer->mAudioDataBytesCapacity / sizeof(AUDIO_DATA_TYPE_FORMAT);
AUDIO_DATA_TYPE_FORMAT *samples = (AUDIO_DATA_TYPE_FORMAT*)inBuffer->mAudioData;

然后你就有了你的(在本例中为 SInt16)数组 samples,你可以从 samples[0]samples [sampleCount-1].

关于objective-c - 如何从 iOS 中的 AudioQueueRef 获取 float 音频数据数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880706/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com