#c #objective-c #c #core-audio
#c #objective-c #c #core-audio
Вопрос:
Я использую 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;
}
РЕДАКТИРОВАТЬ: Я знаю, что этот приведенный выше код не будет воспроизводить звук непрерывно, потому что в какой-то момент он заполняет буфер множеством нулей, однако вместе с этим я получаю много странных звуков, если звук будет воспроизводиться, ненадолго останавливаться и начинаться снова, я был бы счастлив, хорошее начало 🙂
ПРАВКА 2: Я отредактировал код так, чтобы он больше не выводил тишину, к сожалению, я все еще получаю шипение и хлопки…
Спасибо!
Комментарии:
1. Мне не нужно решение для этого, поскольку я понимаю, что информация довольно ограничена и многое может пойти не так, подсказка о том, как опытный разработчик звука мог бы это отладить, все равно была бы отличной!
2. Что это за указатель startPointForPlayedBuffer? Важно, что вы добавляете, когда выполняете startPointForPlayedBuffer =buffer. mDataByteSize
Ответ №1:
Я не совсем знаком с тем, что вы делаете, но у меня была похожая проблема с использованием графического ядра в OSX — когда я получал видимый «шум» на своих изображениях в определенных ситуациях. Проблема была с моими буферами, мне пришлось фактически обнулить их, иначе я бы получил шум на них. Можете ли вы попробовать создать memset в буфере.mData[] перед его использованием?
Проблема, которая возникла при воспроизведении, и почему я думаю, что вы можете видеть вещи того же типа, заключается в том, что когда вы выделяете большие куски памяти в OSX, она обычно обнуляется по соображениям безопасности, но для небольших кусков памяти она не будет обнулена. Это может привести к странным ошибкам — т. Е. Сначала вы можете выделить достаточно большую часть памяти, чтобы она была очищена для вас, но по мере продолжения потоковой передачи вы можете выделить меньшие части, которые не очищены.