События класса AVPlayer - PullRequest
       14

События класса AVPlayer

4 голосов
/ 30 августа 2011

Есть ли какие-либо методы делегата в классе AVPlayer? Мне нужно обрабатывать прерывания, такие как телефонный звонок и т. Д. AVAudioPlayer поддерживает. Если AVPlayer не поддерживает его, как передавать аудио с AVAudioPlayer?

Ответы [ 5 ]

8 голосов
/ 11 марта 2012

AVPlayer не имеет методов, которые вы хотите, но вы можете использовать AVAudioSession объект вместо

1) Выберите AVAudioSession объект (например, [AVAudioSession sharedInstance])
2) Установите его активным, вызвав setActive:error: method
3) Установите его делегат (класс, реализующий протокол AVAudioSessionDelegate)
4) Реализуйте методы делегата, такие как

-(void)beginInterruption;
-(void)endInterruptionWithFlags:(NSUInteger)flags;
-(void)endInterruption;
1 голос
/ 24 июля 2015

Прошло много времени с момента публикации вопроса.Однако для завершения я хотел бы добавить: AVPlayer можно использовать для обработки прерываний, добавив TimeObserver следующим образом:

Когдаинициализация AVPlayer:

AVPlayer *_aplayer;
id _aplayerObserver;

_aplayer = [[AVPlayer alloc] initWithURL:mediaURL];
_aplayerObserver = [_aplayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:NULL usingBlock:^(CMTime time)
{
    if (((time.value/time.timescale) >= (_aplayer.currentItem.asset.duration.value/_aplayer.currentItem.asset.duration.timescale))
    {
        // media file played to its end
        // you can add here code that should run after the media file is completed, 
        // thus mimicing AVAudioPlayer's audioPlayerDidFinishPlaying event
    }
    else
    {
        if (_aplayer.rate == 0)
            // audio player was interrupted
    }
}

Если вы выберете это решение, обратите внимание на то, что в документации addPeriodicTimeObserverForInterval написано:

Вы должны сохранить возвращаемое значение[т.е. _aplayerObserver] до тех пор, пока вы хотите, чтобы наблюдатель времени вызывался игроком.Каждый вызов этого метода должен быть связан с соответствующим вызовом removeTimeObserver:.

1 голос
/ 30 августа 2011

Я не думаю, что AVPlayer приведет вас туда.Взгляните на AVAudioPlayerDelegate, audioPlayerBeginInterruption будет методом делегата, который вы ищете.

Вот пример кода, который я использую для AVAudioPlayer (я предполагаю, что вы уже знаете, как создать свой URL):

// Instantiates the AVAudioPlayer object, initializing it with the sound
NSError * errAV = nil;
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfUrl: mUrl error: &errAV];
if (newPlayer == nil) {

    NSString * msg = [[NSString alloc] initWithFormat:@"An internal error has occured:  %@", [errAV localizedDescription]];
    UIAlertView *uiav = [[UIAlertView alloc] initWithTitle:@"Play Sound" 
                                                   message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [uiav show];
    [uiav release];
    [msg release];
} else {

    self.appSoundPlayer = newPlayer;
    [newPlayer release];
    // "Preparing to play" attaches to the audio hardware and ensures that playback
    //      starts quickly when the user taps Play
    [appSoundPlayer prepareToPlay];
    [appSoundPlayer setVolume: 1.0];
    [appSoundPlayer setDelegate: self];
    [appSoundPlayer play];
}
1 голос
/ 31 августа 2011

Даже при использовании AVAudioPlayer вы можете инициализировать аудиосеанс, где вы можете указать тип воспроизведения (или записи, если на то пошло), который вы будете выполнять, и обратный вызов для обработки прерываний, таких как телефонные звонки.

Посмотрите на AudioSessionInitialize() и его третий параметр, функцию обратного вызова для обработки прерываний. В вашем обратном вызове вы можете обрабатывать как начало, так и конец прерывания.

Существенное отличие здесь между использованием AudioSession и использованием обратных вызовов AVAudioPlayer состоит в том, что первый происходит на более низком уровне, возможно, перед вызовом методов делегата последнего. Так что с обратным вызовом AudioSession у вас есть более точное управление, я думаю, но тогда вам придется делать больше, возможно, в зависимости от сложности настройки аудио вашего приложения.

1 голос
/ 30 августа 2011

EDIT

Я не вижу доступных делегатов в AVPlayer class

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

и учебник


Справочник по протоколу AVAudioPlayerDelegate http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioPlayerDelegateProtocolReference/Reference/Reference.html#//apple_ref/doc/uid/TP40008068

  • Ответ на завершение воспроизведения звука
    - audioPlayerDidFinishPlaying: успешно:

  • Ответ на ошибку декодирования звука
    - audioPlayerDecodeErrorDidOccur: ошибка:

  • Обработка прерываний звука
    - audioPlayerBeginInterrupt:
    - audioPlayerEndInterrupt:
    - audioPlayerEndInterrupt: withFlags:

...