【问题标题】:Objective-C, CoreAudio: Possible reasons for which played sound has additional noise, hiss and pops?Objective-C,CoreAudio:播放声音有额外噪音、嘶嘶声和爆裂声的可能原因是什么?
【发布时间】:2011-04-15 07:04:09
【问题描述】:

我正在使用 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:我编辑了代码,使其不再输出静音,但不幸的是我仍然听到嘶嘶声和爆裂声......

谢谢!

【问题讨论】:

  • 我不需要这个解决方案,因为我知道它的信息非常有限,而且很多事情都可能出错,关于经验丰富的声音开发人员如何调试它的提示仍然很棒!
  • startPointForPlayedBuffer 是一个什么样的指针?执行 startPointForPlayedBuffer+=buffer.mDataByteSize 时添加的内容很重要

标签: c++ objective-c c core-audio


【解决方案1】:

我并不完全熟悉您在做什么,但我在 OSX 上使用 Core Graphics 时遇到了类似的问题 - 在某些情况下,我的图像上会出现明显的“噪音”。我的缓冲区存在问题,我必须将它们归零,否则我会在它们上产生噪音。你可以在使用之前尝试在 buffer.mData[] 上做一个 memset 吗?

出现的问题以及我认为您可能会看到相同类型的事情的原因是,当您在 OSX 中分配大块内存时,出于安全原因,它通常会归零,但对于小块内存不会归零。这可能会导致奇怪的错误 - 即,一开始您可能分配了足够大的内存块以便为您清除,但当您继续流式传输时,您可能会分配未清除的较小块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多