2011-04-25 66 views
2

我的應用程序讀取音頻並在製作者/使用者設置中播放。消費者線程請求新的樣本呈現給硬件。生產者線程使用AVAssetReader從磁盤讀取音頻數據到其緩衝區。生產者線程循環運行,檢查是否需要讀取更多的樣本。製作者的緩衝區大小等於4秒的音頻。AVAssetReader讀取音頻,然後失敗

當我指示我的應用程序緩衝音頻時,樣本被成功讀取而沒有錯誤。當我觸發我的製作人線程開始渲染音頻時,4秒緩衝區將完美播放,然後靜音。進一步的調查發現,我的資產讀者在重放時的開始發生故障,因此,沒有進一步的樣品,其中所述初始緩衝之後讀:

CMSampleBufferRef ref = [readaudiofile copyNextSampleBuffer]; 
if (ref == NULL && filereader.status == AVAssetReaderStatusFailed) { 
    NSLog(@"reader failed: %@", filereader.error); 
} 
// this produces: 
// {NSLocalizedFailureReason=An unknown error occurred (-12785), 
// NSUnderlyingError=0x161f60 "The operation couldn’t be completed. 
// (OSStatus error -12785.)", NSLocalizedDescription=The operation 
// could not be completed} 

我的生產者線程代碼是相同的功能的代碼示例MusicLibraryRemoteIODemo。我的消費者線程代碼是不同的,但我已經將兩條線逐行比較了幾天,似乎無法找到順利。任何想法可能會導致AVAssetReader閱讀器失敗?

This post描述了類似的解決方案,它得出的結論是音頻會話需要正確設置(儘管它沒有說明如何)。 AVAudioSesion配置和AVAssetReader的行爲之間有任何連接嗎?

回答

3

我得到同樣的錯誤,我貼這個答案的其他線程以及

- (void)setupAudio { 
    [[AVAudioSession sharedInstance] setDelegate:self]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; 
    NSError *activationError = nil; 
    [[AVAudioSession sharedInstance] setActive: YES error:&activationError]; 

    NSLog(@"setupAudio ACTIVATION ERROR IS %@", activationError); 
    [[AVAudioSession sharedInstance] setPreferredIOBufferDuration:0.1 error:&activationError]; 
    NSLog(@"setupAudio BUFFER DURATION ERROR IS %@", activationError); 
} 
+0

這工作。搖滾。 – ManicBlowfish 2012-04-16 21:20:18

相關問題