2011-09-24 137 views
0

所以我设置音频会议AVAssestReader停止音频回调

AudioSessionInitialize(NULL, NULL, NULL, NULL); 
AudioSessionSetActive(true); 

UInt32 audioCategory = kAudioSessionCategory_MediaPlayback; //for output audio 
OSStatus tErr = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(audioCategory),&audioCategory); 

然后设置任何的AudioQueue或RemoteIO设置从文件直接播放一些音频。

AudioQueueStart(mQueue, NULL); 

一旦我的音频播放,我可以看到我的应用程序状态栏中的'播放图标'。我下一步设置AVAssetReader。

AVAssetTrack* songTrack = [songURL.tracks objectAtIndex:0]; 

NSDictionary* outputSettingsDict = [[NSDictionary alloc] initWithObjectsAndKeys: 

            [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey, 
            //  [NSNumber numberWithInt:AUDIO_SAMPLE_RATE],AVSampleRateKey, /*Not Supported*/ 
            //  [NSNumber numberWithInt: 2],AVNumberOfChannelsKey, /*Not Supported*/ 

            [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey, 
            [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey, 
            [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey, 
            [NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved, 

            nil]; 

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

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

{ 
    AVAssetReaderAudioMixOutput * readaudiofile = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:(songURL.tracks) audioSettings:outputSettingsDict]; 
    [reader addOutput:readaudiofile]; 
    [readaudiofile release]; 
} 

return reader; 

当我打电话给[reader startReading]时,音频停止播放。在RemoteIO和AudioQueue的情况下,回调都停止被调用。

如果我添加混合选项:

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (UInt32), &(UInt32) {0}); 

那么“播放图标”时AudioQueueStart后的音频被称为不再出现。由于手机不会将我视为主要音频源,因此我也被锁定在其他功能之外。

有谁知道一种方法,我可以使用AVAssetReader,仍然是主音频源?

回答

0

从iOS 5开始,这个问题已经解决。它仍然不适用于iOS 4或更低版本。 MixWithOthers不需要(可以设置为false),即使AVAssetReader正在读取,AudioQueue/RemoteIO也将继续接收回调。