2014-10-20 5 views
1

Я пытаюсь сыграть короткое видео в своем приложении, используя либо MPMoviePlayerController, либо AVPlayer. Проблема в том, что (поскольку у моего видео нет звука), я не хочу вмешиваться в звучание других приложений в фоновом режиме. Я пытался играть с AVAudioSession:iOS воспроизводить видео без аудио сессии

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession setCategory:AVAudioSessionCategoryAmbient withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; 
[audioSession setActive:YES error:nil]; 

, но у меня не было никакой удачи. Как только начнется воспроизведение видео, музыка в фоновом режиме остановится. Я даже tryied установить аудио сеанс неактивным:

[[AVAudioSession sharedInstance] setActive:NO withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil]; 

, но в этом случае звук прекращается в течение половины секунды, а затем возобновляется и видеоплеер перестает играть. Есть ли способ добиться того, что я пытаюсь сделать? Благодарю.

+0

У вас есть только видеокодек в вашем видео? проверьте информацию о своем видеофайле. (должны быть только кодеки: например, H.264, но не H.264 AAC) – kabarga

+0

единственным кодеком является H.264 – Teo

ответ

0

Вы тестируете свое приложение для музыки bkg? Если нет, то, вероятно, ответ в том, что большинство музыкальных приложений содержат:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleAudioSessionInterruption:) 
              name:AVAudioSessionInterruptionNotification 
              object:aSession]; 

и реализация как:

- (void) handleAudioSessionInterruption:(NSNotification*)notification 
{ 
    NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey]; 
    .....code.... 

    switch (interruptionType.unsignedIntegerValue) { 
     case AVAudioSessionInterruptionTypeBegan:{ 
      // stop playing 
     } break; 
     case AVAudioSessionInterruptionTypeEnded:{ 
      // continue playing 
     } break; 
     default: 
      break; 
    } 
} 

Таким образом, они остановить воспроизведение и запустить его, когда прерывание закончено. (для входящих звонков и т. д.)

1

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

Нечего делать, но здесь есть обходное решение. Дело в том, что при инициализации видеопроигрывателя установите для категории аудиосеанса значение ambient, в этом случае он не будет прерывать сеансы аудио в других приложениях. Затем, если вам нужно «отключить» видео, вы можете установить для категории аудиосеанса значение по умолчанию (сольное окружение). Он прервет сеансы аудио в других приложениях и возобновит воспроизведение звука со звуком.

Пример:

- (void)initPlayer { 

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:0 error:nil]; 

    // some init logic 
    // e.g: 
    // 
    // _playerItem = [AVPlayerItem playerItemWithAsset:[AVAsset assetWithURL:_URL]]; 
    // _player = [AVPlayer playerWithPlayerItem:_playerItem]; 
    // _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player]; 
    // 
    // etc. 

} 

- (void)setMuted:(BOOL)muted { 
    if (!muted) { 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient withOptions:0 error:nil]; 
    } 

    self.player.muted = muted; 
} 

P.S. Я предполагаю, что приложение FB делает что-то похожее: когда видео начинает играть приглушенным, оно не будет прерывать другие приложения аудио, но когда пользователь нажимает на видео, он будет работать в полноэкранном режиме со звуком, на этом этапе будет активная аудио сессия этого видео , и все остальные приложения перестанут воспроизводить аудио.

+0

Спасибо! Только то, что я искал сейчас! – onnoweb