AVAssestReader остановить аудио обратные вызовы - PullRequest
0 голосов
/ 24 сентября 2011

Так что я настраиваю аудио сеанс

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 и при этом оставаться основным источником звука?

1 Ответ

0 голосов
/ 01 ноября 2011

Начиная с iOS 5 это было исправлено. Это все еще не работает в iOS 4 или ниже. MixWithOthers не требуется (можно установить значение false), и AudioQueue / RemoteIO продолжит получать обратные вызовы, даже если AVAssetReader читает.

...