2011-06-02 37 views
1

我正在使用AVAssetReader從iPod庫中讀取音頻。 (see here)然後我讀取緩衝區並通過AudioUnit播放。我正在嘗試摺疊代碼以在播放音頻時在音頻中進行流式傳輸。但是,如果AVAssetReader正在運行,AudioUnit會停止接收對其kAudioUnitProperty_SetRenderCallback的調用。正在啓動AVAssetReader,將回調停止到遠程I/O AudioUnit

我簡化了我的代碼只有AudioUnits回調中播放的文件...

OSStatus UnitRenderCB(void* pRefCon, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* timeStamp, UInt32 busNum, UInt32 numFrames, AudioBufferList* pData){ 

    OSStatus tErr = noErr; 
    MySoundStream* pS = (MySoundStream*)pRefCon; 

    ExtAudioFileRead(pS->InRef, &numFrames, pData);  // Here's the MP3/WAV/etc Data loaded... 

    if (numFrames <= 0){ // EOF? 
     ExtAudioFileSeek(pS->InRef, 0); 
     return 1; 
    } 

    return tErr; 
} 

,然後我把這個代碼和AudioUnit停止播放時,UnitRenderCB不再調用。

NSError* error = nil; 
    AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songURL error:&error]; 

    { 
     AVAssetReaderTrackOutput* output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:outputSettingsDict]; 
     [reader addOutput:output]; 
     [output release]; 
    } 


    [reader startReading]; 

    [reader cancelReading]; 

    [reader release]; 

我使用的是相同的AudioUnit設置爲上市here

是否AVAssetReader使用AudioUnit系統?沒有辦法讓他們一起工作嗎?

回答

1

您必須創建一個AudioSession並設置一個可混合類別,在「使用音樂播放器」下描述here

本文檔實際上描述瞭如何配置AudioSession以與MediaPlayer框架配合使用,但它同樣適用於AVAssetReader。

+0

我正在使用'kAudioSessionProperty_AudioCategory - kAudioSessionCategory_MediaPlayback',所以我需要確保'kAudioSessionProperty_OverrideCategoryMixWithOthers'被設置爲true。 – TurqMage 2011-06-21 16:20:46

1

確保你已經調用'AudioSessionInitialize'沒有它可能會發生奇怪的事情。

相關問題