Objective-C, CoreAudio:播放的声音有额外的噪音,嘶嘶声和砰的一声的可能原因

Objective-C, CoreAudio: Possible reasons for which played sound has additional noise, hiss and pops?

本文关键字:一声 嘶嘶声 声音 播放 CoreAudio Objective-C 噪音      更新时间:2023-10-16

我使用CoreAudio播放一些连续的声音。我设法让它工作,但是我现在有一个问题,我无法克服。它播放的声音,更重要的是它是我真正需要的声音,不仅仅是噪音,而且还有噪音,嘶嘶声,爆裂声。

我验证了采样率,零化了所有的沉默缓冲区,检查了通道(我肯定我只有1个),并仔细检查了提供回放方法的算法。(但我将在这里添加它只是为了确保)。我在声音方面的经验很有限,所以我可能做错了什么。我想知道是否还有其他事情需要检查,或者最好的方法是什么,首先要看哪里?

//init
playedBufferSize=audioFilesSize[audioFilesIndex];
startPointForPlayedBuffer=0;

//feed the audio
static OSStatus playbackCallback(void *inRefCon, 
                          AudioUnitRenderActionFlags *ioActionFlags, 
                          const AudioTimeStamp *inTimeStamp, 
                          UInt32 inBusNumber, 
                          UInt32 inNumberFrames, 
                          AudioBufferList *ioData) {
    AudioBuffer buffer = ioData->mBuffers[0];
    if (playedBufferSize>=buffer.mDataByteSize) {
        memcpy(buffer.mData , audioFiles[audioFilesIndex]+startPointForPlayedBuffer, buffer.mDataByteSize);
        playedBufferSize-=buffer.mDataByteSize;
        startPointForPlayedBuffer+=buffer.mDataByteSize;
    }else {
        memcpy(buffer.mData , audioFiles[audioFilesIndex]+startPointForPlayedBuffer, playedBufferSize);
        nextAudioFileIndex();
        memcpy(buffer.mData+playedBufferSize, audioFiles[audioFilesIndex], playedBufferSize);
        playedBufferSize = audioFilesSize[audioFilesIndex]-(buffer.mDataByteSize-playedBufferSize);
        startPointForPlayedBuffer = (buffer.mDataByteSize-playedBufferSize);
    }

    return noErr;
}

编辑:我知道上面的代码不会连续播放声音,因为它在某些时候用一堆0填充缓冲区,但是,我得到了许多奇怪的声音,如果声音会播放并停止一小段时间并重新开始,我会很高兴,一个好的开始:)

EDIT2:我编辑了代码,使它不再输出沉默,但不幸的是,我仍然得到嘶嘶声和砰的一声…

谢谢!

我不完全熟悉你在做什么,但我在OSX上使用Core Graphics的东西有一个类似的问题-在某些情况下,我的图像上出现了可见的"噪音"。这里的问题是我的缓冲,我必须把它们归零,否则就会有噪声。你能试着在缓冲区上做一个memset吗?在使用mData[]之前?

出现的问题,以及为什么我认为你可能会看到相同类型的事情,是当你在OSX中分配大块内存时,出于安全原因,它通常为零,但对于小块内存,它不会为零。这可能会导致奇怪的bug -例如,一开始你可能会分配一个足够大的内存块,它已经为你清除了,但是当你继续流式传输时,你可能会分配较小的内存块,而这些内存块不会被清除。