AVAssetReader убивает воспроизведение (в AVAudioPlayer)

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

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

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

[reader startReading];

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

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

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

[reader startReading];

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

Любые идеи?


person unsynchronized    schedule 14.09.2011    source источник


Ответы (1)


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

дальнейший поиск по 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];
    }
}
person unsynchronized    schedule 15.09.2011
comment
Если вы используете ARC, аудиоплеер должен быть объявлен мощным. В противном случае он может быть выпущен слишком рано, и вы не получите никакого звука. - person Sten; 28.01.2013
comment
AudioSessionSetProperty устарела в iOS8 - person Gabriel.Massana; 16.01.2015