【发布时间】: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