gpt4 book ai didi

ios - 如果没有输出缓冲区,AudioUnit 会产生噪音

转载 作者:行者123 更新时间:2023-11-28 23:59:08 88 4
gpt4 key购买 nike

我正在尝试实现播放通过套接字从远程服务器接收到的 pcm 音频。这是我之前的问题 link .这工作正常,因为我使用循环缓冲区始终输入传入缓冲区。

但是我有一个问题,如果我没有为我的输出提供缓冲区,就会产生巨大的噪音。当我开始使用 AudioOutputUnitStart(_audioUnit) 并且没有缓冲区可以播放时,就会发生这种情况。

我怀疑我必须在下面的 OutputRenderCallback 函数中修复此问题,或者我可能需要做其他事情:

static OSStatus OutputRenderCallback(void                        *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData){


Test *output = (__bridge Test*)inRefCon;


TPCircularBuffer *circularBuffer = [output outputShouldUseCircularBuffer];
if( !circularBuffer ){
SInt32 *left = (SInt32*)ioData->mBuffers[0].mData;
for(int i = 0; i < inNumberFrames; i++ ){
left[ i ] = 0.0f;
}
return noErr;
};

int32_t bytesToCopy = ioData->mBuffers[0].mDataByteSize;
SInt16* outputBuffer = ioData->mBuffers[0].mData;

uint32_t availableBytes;
SInt16 *sourceBuffer = TPCircularBufferTail(circularBuffer, &availableBytes);

int32_t amount = MIN(bytesToCopy,availableBytes);
memcpy(outputBuffer, sourceBuffer, amount);

TPCircularBufferConsume(circularBuffer,amount);

return noErr;
}

非常感谢您的帮助。谢谢。

最佳答案

音频单元回调要求您始终将请求数量的样本放入 AudioBufferList 缓冲区。如果数量(来自可用的循环缓冲区)较少,您的代码不会这样做。

所以总是把一些东西放在输出缓冲区中,就像你的代码在没有循环缓冲区的情况下所做的那样。

顺便说一句:调用一个方法:

[output outputShouldUseCircularBuffer]

回调内部违反了 Apple 的实时音频规则。

关于ios - 如果没有输出缓冲区,AudioUnit 会产生噪音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150629/

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