2014-02-16 44 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

莫爾而不是回答這是一個評論,但它相當大,所以我會在這裏發佈。

我沒有時間和耐心研究YB API內部的代碼。但我腦海中出現了一些行話。

首先我記得嘗試使用音頻單元(使用Apple的API),並且我有很多口吃正在進行。我解決了在將數據提供給我的AUGraph的回調中刪除所有Objective-C調用的問題(當然,我除去了一個不能刪除的數據)。我用純C和C++調用替換了所有Objective-c調用。例如:

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

這只是一個例子,但它有顯着的改善,我擺脫了口吃。也許你可以看看YBXX API的實現,看看回調中是否有很多obj-c調用,如果有的話,我不會使用API​​。第二個觀察。

第二個觀察。看起來你只是在試圖播放一個音頻文件,對於這個文件,AudioGraph有很大的開銷,你可以使用一個沒有Graph的單個IO音頻單元。

+0

沒有回調,一切都通過了。我知道第二個對我來說不起作用。我實際上正在利用效果和兩個軌道的多通道混音器。我不會說音頻路由的複雜性會成爲一個問題,因爲我只是在基本設置中遇到了這個問題。 – kezi

0

有大量的問題要問:

首先,你是否使用壓縮音頻文件?如果是這樣,您可能需要考慮填充幀(kAudioFilePropertyPacketTableInfo)以獲取文件中音頻幀的實際數量。也許試試AIFF,CAF或WAV文件。

你確定沒有其他音頻應用程序在後臺運行嗎?

是否有任何日誌消息?

你有沒有嘗試發佈到他們在github上的問題頁面?

最後一個問題是你爲什麼試圖使用他們的框架(兩年內還沒有更新)。我會推薦The Amazing Audio Engine。它由iOS上的一些最好的音頻人員積極開發。