c++ - Objective-C,CoreAudio : Possible reasons for which played sound has additional noise, 嘶嘶声和爆裂声?

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

我正在使用 CoreAudio 播放一些连续的声音。我设法使它工作,但是现在我遇到了无法克服的问题。它正在播放的声音,更重要的是它是我需要的实际声音,不仅仅是噪音,而且我还会听到噪音、嘶嘶声和砰砰声。

我验证了采样率,将所有静音缓冲区清零,检查了 channel (我很肯定我只有 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 时遇到了类似的问题 - 在某些情况下我的图像上出现了可见的“噪点”。我的缓冲区存在问题,我必须将它们归零,否则我会在它们上听到噪音。您可以在使用 buffer.mData[] 之前尝试对其进行内存设置吗?

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

关于c++ - Objective-C,CoreAudio : Possible reasons for which played sound has additional noise, 嘶嘶声和爆裂声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5673394/

相关文章:

c++ - 如何在 ios 平台上使用 c++ 实现 GameCenter

objective-c - Storyboard不会保存在 Xcode 中

ios - 如果文本是阿拉伯语,则使 UILabel 文本右对齐

c++ - 在构建期间捕获所有编译器调用和命令行参数

c - 理解 strspn(const char *s, const char *accept) 函数

c++ - 负 ASCII 值

android - 为 android 构建 openframeworks 时出错 : “invalid use of incomplete type ‘class Poco::Path’ ”

c++ - 如何在 64 位版本的 Windows 中调用 SetWindowLong()?

c++ - 如何在 std::map 中尝试放置 POD 结构?

c++ - 与派生类的虚指针混淆