首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果没有输出缓冲区,则为AudioUnit噪声

如果没有输出缓冲区,则为AudioUnit噪声
EN

Stack Overflow用户
提问于 2018-05-03 16:42:22
回答 2查看 189关注 0票数 0

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

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

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

代码语言:javascript
运行
复制
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;
}

我非常感谢你help.Thanks。

EN

回答 2

Stack Overflow用户

发布于 2018-05-04 09:53:56

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

因此,始终在输出缓冲区中放置一些内容,就像您的代码在没有循环缓冲区时所做的那样。

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

代码语言:javascript
运行
复制
[output outputShouldUseCircularBuffer]

在回调中,违反了苹果的实时音频规则。

票数 1
EN

Stack Overflow用户

发布于 2018-05-04 15:10:37

我张贴我的答案,以防其他人在同一点上与我跌跌撞撞。我是objective c的新手,所以如果有人有更好的解决方案。我非常欢迎任何建议。

正如@hotpaw2建议的那样,当我的circularBuffer中没有任何东西时,需要向AudioBufferList提供样本。我必须向AudioBufferList提供被设置为0.0f的帧

代码语言:javascript
运行
复制
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];

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);

if (amount>0) {
        memcpy(outputBuffer, sourceBuffer, amount);
        TPCircularBufferConsume(circularBuffer,amount);
}
else{

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

}

return noErr; }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50150629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档