Audio 核心音频队列破解
我在核心音频输出队列的开始和结束处得到一个裂缝。代码应该只生成一个音调 编辑:创建了一个示例项目 以下是设置:Audio 核心音频队列破解,audio,queue,core,Audio,Queue,Core,我在核心音频输出队列的开始和结束处得到一个裂缝。代码应该只生成一个音调 编辑:创建了一个示例项目 以下是设置: -(void) startOutputQueue { if(userData.outputQueue != NULL) { if(!checkError(AudioQueuePrime(userData.outputQueue, 0, NULL), "AudioQueuePrime")) { NSLog(@"Error priming
-(void) startOutputQueue {
if(userData.outputQueue != NULL) {
if(!checkError(AudioQueuePrime(userData.outputQueue, 0, NULL), "AudioQueuePrime")) {
NSLog(@"Error priming QutputQueue");
}
if(!checkError(AudioQueueStart(userData.outputQueue, NULL), "AudioQueueStart Output")) {
NSLog(@"Error starting OutputQueue");
}
}
}
-(void) setupOutputQueue {
memset(&userData.outputDesc, 0, sizeof(userData.outputDesc));
userData.outputDesc.mFormatID = kAudioFormatLinearPCM;
userData.outputDesc.mFramesPerPacket = 1;
userData.outputDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
userData.outputDesc.mChannelsPerFrame = 1;
userData.outputDesc.mSampleRate = 44100;
userData.outputDesc.mBitsPerChannel = 16;
userData.outputDesc.mBytesPerFrame = userData.outputDesc.mBytesPerPacket = 2;
userData.outputSamplePosition = 0;
if (userData.outputQueue == NULL) {
if(!checkError(AudioQueueNewOutput(&userData.outputDesc, outputCallback, &userData, NULL, NULL, 0, &userData.outputQueue), "AudioQueueNewOutput")) {
return;
}
UInt32 bufferSize = userData.outputDesc.mBytesPerFrame * userData.outputDesc.mSampleRate * DURATION;
for (int i=0; i<3; ++i) {
if(!checkError(AudioQueueAllocateBuffer(userData.outputQueue, bufferSize, &userData.outputBuffers[i]), "AudioQueueAllocateBuffer")) {
return;
}
outputCallback(&userData, userData.outputQueue, userData.outputBuffers[i]);
}
}
}
缓冲区的填充如下所示:
UInt32 sampleCount = DURATION * userData->outputDesc.mSampleRate;
double f1 = userData->outputDesc.mSampleRate / 10000.0f;
for (int i=0; i<sampleCount; ++i) {
SInt16 sample = CFSwapInt16HostToBig(SHRT_MAX * ( sin((userData->outputSamplePosition + i) * 2 * M_PI / f1) ));
((SInt16*)inBuffer->mAudioData)[i] = sample;
}
userData->outputSamplePosition += sampleCount;
inBuffer->mAudioDataByteSize = sampleCount * 2;
UInt32 sampleCount=DURATION*userData->outputDesc.mSampleRate;
双f1=userData->outputDesc.mSampleRate/10000.0f;
对于(int i=0;ioutputSamplePosition+i)*2*M_PI/f1));
((SInt16*)inBuffer->mAudioData)[i]=样品;
}
userData->outputSamplePosition+=sampleCount;
inBuffer->mAudioDataByteSize=样本计数*2;
录音如下所示:
UInt32 sampleCount = DURATION * userData->outputDesc.mSampleRate;
double f1 = userData->outputDesc.mSampleRate / 10000.0f;
for (int i=0; i<sampleCount; ++i) {
SInt16 sample = CFSwapInt16HostToBig(SHRT_MAX * ( sin((userData->outputSamplePosition + i) * 2 * M_PI / f1) ));
((SInt16*)inBuffer->mAudioData)[i] = sample;
}
userData->outputSamplePosition += sampleCount;
inBuffer->mAudioDataByteSize = sampleCount * 2;
尝试在SHRT_MAX(sin)((userData->。。。
这样,您的整个代码块如下所示
SInt16 sample=CFSwapInt16HostToBig((SInt16)SHRT_MAX*(sin((用户数据->输出采样位置+i)*2*M_PI/f1)))您使用的是哪种语言编写的代码?我们需要一段有问题的代码?图片可以作为支持,但不能单独使用。对不起,可能会有评论,但还没有代表点:/…但是,请记住,音频硬件的移动速度通常比硬件io更快,因此,您需要r音频硬件可能会耗尽数据,这可能是它产生这些噪音的原因…尝试创建一个内存缓冲区,将文件放在那里,或循环文件。这将有助于确保数据能够跟上音频硬件,此外,在写入文件时也可能需要应用此概念,因此不会有那么多的函数调用。