AVAssetReader убивает воспроизведение (в AVAudioPlayer) - PullRequest
5 голосов
/ 14 сентября 2011

Я использую AVAssetReader для чтения аудиоданных активов библиотеки ipod и визуализации изображения формы волны. это происходит с помощью кода, который я описал в своем ответе на этот вопрос

это иногда происходит во время воспроизведения звука экземпляром AVAudioPlayer.

независимо от того, воспроизводится ли звук, это тот же ресурс, который читается, в тот момент, когда я нажимаю

[reader startReading];

воспроизводимый звук «затухает». (как будто AVAudioPlayer как-то было сказано остановить воспроизведение). Это странно, поскольку я на самом деле не играю аудио, просто читаю его.

Я выполнил поиск по SO и нашел это возможное решение однако я обнаружил, что это, похоже, не решает проблему.

примечание - у меня есть несколько экземпляров воспроизведения AVAudioPlayer, и их запуск, кажется, не мешает друг другу - однако

[reader startReading];

даже уничтожит несколько одновременных экземпляров AVAudioPlayer, что приведет к их синхронному исчезновению.

есть идеи?

1 Ответ

15 голосов
/ 15 сентября 2011

отвечая на мой собственный вопрос ....

дальнейшие поиски в SO привели меня к реализации этого альтернативного решения:

- (void)setupAudio {
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 1;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
}

это было взято из здесь

** РЕДАКТИРОВАНИЕ ** ОБНОВЛЕНО ****

С тех пор я превратил это в класс, который также предварительно инициализирует аудио-очередь (полезно как в симуляторе, так и на устройстве, поскольку устраняет задержку при запуске)от воспроизведения первого аудиофайла.

вы можете найти point1sec.mp3 здесь: http://www.xamuel.com/blank-mp3s/

#import <AVFoundation/AVFoundation.h>
#import "AudioToolbox/AudioServices.h"

@interface sw_AVAudioPlayerSetup : NSObject
 <AVAudioPlayerDelegate> {

}

+ (void)setupAudio ;
+ (void)setupSharedSession ;

@end
@implementation sw_AVAudioPlayerSetup

+ (void)setupSharedSession {

    static BOOL audioSessionSetup = NO;
    if (audioSessionSetup) {
        return;   
    }
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 1;

    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);

    [[AVAudioSession sharedInstance] setActive: YES error: nil];

    audioSessionSetup = YES;

}

+ (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    // delegate callback to release player
    [player release];
}

+ (void)setupAudio {

    [self setupSharedSession];

    NSString *filepath = [[NSBundle mainBundle]                                                                                                  
                          pathForResource:@"point1sec"                                                                                                 
                          ofType:@"mp3"];

    if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {

        AVAudioPlayer* player = [[AVAudioPlayer alloc] 
                                 initWithContentsOfURL:
                                 [NSURL fileURLWithPath:filepath] 
                                 error:nil];

        player.delegate = (id <AVAudioPlayerDelegate>) self;

        [player play];
    }
}
...