2014-02-16 3 views
5

Я получаю заикающееся звучание, когда я впервые запускаю AUGraph и воспроизвожу песню с компонентом kAudioUnitSubType_AudioFilePlayer. Заикание составляет около 3 секунд, но его достаточно, чтобы беспокоить меня, и я замечаю, что музыка иногда останавливается на долю секунды во время игры (я думаю, что буфера?). Я попытался изменить kAudioUnitProperty_ScheduledFilePrime на случайные значения, но не заметил никаких изменений.Остановить заикание AUGraph

Какие переменные или ценности следует изменить, чтобы избавиться от этого недостатка? Это проблема с форматом потока?

Я использую YBAudioUnit от https://github.com/ronaldmannak/YBAudioFramework/tree/master/YBAudioUnit

Код:

YBAudioFilePlayer:

- (void)setFileURL:(NSURL *)fileURL typeHint:(AudioFileTypeID)typeHint { 
    if (_fileURL) { 
     // Release old file: 
     AudioFileClose(_audioFileID); 
    } 

    _fileURL = fileURL; 

    if (_fileURL) { 
     YBAudioThrowIfErr(AudioFileOpenURL((__bridge CFURLRef)fileURL, kAudioFileReadPermission, typeHint, &_audioFileID)); 
     YBAudioThrowIfErr(AudioUnitSetProperty(_auAudioUnit, kAudioUnitProperty_ScheduledFileIDs, kAudioUnitScope_Global, 0, &_audioFileID, sizeof(AudioFileID))); 

     // Get number of audio packets in the file: 
     UInt32 propsize = sizeof(_filePacketsCount); 
     YBAudioThrowIfErr(AudioFileGetProperty(_audioFileID, kAudioFilePropertyAudioDataPacketCount, &propsize, &_filePacketsCount)); 

     // Get file's asbd: 
     propsize = sizeof(_fileASBD); 
     YBAudioThrowIfErr(AudioFileGetProperty(_audioFileID, kAudioFilePropertyDataFormat, &propsize, &_fileASBD)); 

     // Get unit's asbd: 
     propsize = sizeof(_fileASBD); 
     AudioUnitGetProperty(_auAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &_unitASBD, &propsize); 

     if (_fileASBD.mSampleRate > 0 && _unitASBD.mSampleRate > 0) { 
      _sampleRateRatio = _unitASBD.mSampleRate/_fileASBD.mSampleRate; 
     } else { 
      _sampleRateRatio = 1.; 
     } 
    } 
} 

Чтобы играть я называю эти методы на YBAudioFilePlayer:

[player1 setFileURL:item.url typeHint:0]; 
[player1 scheduleEntireFilePrimeAndStartImmediately]; 
[graph start];//On a YBAudioUnitGraph which is really just a basic AUGraph 
+0

Это на симуляторе? Устройство? Или оба? – Nick

+0

Это на устройстве – kezi

+0

Вы используете обратный вызов? Если да, можете ли вы опубликовать код? – Merlevede

ответ

0

Mor чем ответ, это комментарий, но он довольно большой, поэтому я отправлю его здесь.

У меня нет времени и терпения, чтобы изучить код внутри YB .. API. Но мне приходит в голову несколько призраков.

Сначала я помню эксперименты с аудиоустройствами (с использованием API от Apple), и у меня было много заикания. Я решил проблему удаления всех вызовов объектного C внутри обратного вызова, который передает данные на мой AUGraph (ну, я удалил все, кроме одного, от которого я не мог избавиться). Я заменил все вызовы Objective-c чистыми вызовами C и C++. Пример:

... this is the render callback 
int i = [myClass someProperty]; // obj-c 
int i = myClass->someVarialbe; // c, c++ 

Это был просто пример, но он значительно улучшился, и я избавился от заикания. Возможно, вы можете взглянуть на реализацию YBXX API и посмотреть, есть ли в обратном вызове много вызовов obj-c, и если они есть, я бы не использовал API.

Второе наблюдение. Кажется, что вы только пытаетесь воспроизвести аудиофайл, для которого наличие AudioGraph - это много накладных расходов, вы можете использовать один IO Audio Unit без Графа.

+0

Нет обратных вызовов, все прошло. Я знаю, что второй не будет работать для меня. Я действительно использую эффекты и многоканальный микшер с двумя треками. Я бы не сказал, что сложность маршрутизации звука будет проблемой, так как я столкнулся с этой проблемой только с базовой настройкой. – kezi

0

Есть большое количество вопросов, чтобы спросить:

Во-первых, вы используете сжатый аудиофайл? Если это так, вам может потребоваться учитывать кадры заполнения (kAudioFilePropertyPacketTableInfo), чтобы получить реальное количество звуковых кадров в файле. Возможно, попробуйте файл AIFF, CAF или WAV.

Вы уверены, что в фоновом режиме не работает другое звуковое приложение?

Есть ли сообщения о регистрации?

Вы пробовали разместить на своей странице проблемы github?

Последний вопрос: почему вы пытаетесь использовать свои рамки (которые не обновлялись через два года). Я бы порекомендовал The Amazing Audio Engine. Он активно развивается некоторыми из лучших аудиозаписей на iOS.

Смежные вопросы