Подтвердить что ты не робот

Можно ли воспроизводить видео с помощью Avplayer в фоновом режиме?

Я использую Avplayer для показа видеороликов, и когда я вернусь (приложение в фоновом режиме), остановитесь. Как я могу продолжать проигрывать видео?

У меня есть поиск фоновой задачи и фонового потока, IOS поддерживает музыку только в фоновом режиме (не видео)  http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

вот несколько дискуссий о воспроизведении видео в фоновом режиме

1) https://discussions.apple.com/thread/2799090?start=0&tstart=0

2) http://www.cocoawithlove.com/2011/04/background-audio-through-ios-movie.html

Но в AppStore есть много приложений, которые воспроизводят видео в фоновом режиме, например

Swift Player: https://itunes.apple.com/us/app/swift-player-speed-up-video/id545216639?mt=8&ign-mpt=uo%3D2

SpeedUpTV: https://itunes.apple.com/ua/app/speeduptv/id386986953?mt=8

4b9b3361

Ответ 1

Этот метод поддерживает все возможности:

  • Экран, заблокированный пользователем;
  • Элемент списка
  • нажата кнопка "Дом";

Пока у вас есть экземпляр AVPlayer, работающего под управлением iOS, предотвращает автоматическую блокировку устройства.

Сначала вам нужно настроить приложение для поддержки звукового фона из файла Info.plist, добавляя в массив UIBackgroundModes аудио элемент.

Затем добавьте свой AppDelegate.m в

- (BOOL) приложение: (UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions:

эти методы

[[AVAudioSession sharedInstance] setDelegate: self];    
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

и #import < AVFoundation/AVFoundation.h >

Затем в вашем представлении контроллер, который управляет AVPlayer

-(void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  [self becomeFirstResponder];
}

и

- (void)viewWillDisappear:(BOOL)animated
{
    [mPlayer pause];    
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
}

затем ответьте на

 - (void)remoteControlReceivedWithEvent:(UIEvent *)event {
        switch (event.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:
                if([mPlayer rate] == 0){
                    [mPlayer play];
                } else {
                    [mPlayer pause];
                }
                break;
            case UIEventSubtypeRemoteControlPlay:
                [mPlayer play];
                break;
            case UIEventSubtypeRemoteControlPause:
                [mPlayer pause];
                break;
            default:
                break;
        }
    }

Еще один трюк необходим для возобновления воспроизведения, если пользователь нажимает кнопку "домой" (в этом случае воспроизведение приостанавливается с постепенным исчезновением).

Когда вы управляете воспроизведением видео (у меня есть методы воспроизведения), установите

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];

и соответствующий метод, который будет запущен, который запустит таймер и возобновит воспроизведение.

- (void)applicationDidEnterBackground:(NSNotification *)notification
{
    [mPlayer performSelector:@selector(play) withObject:nil afterDelay:0.01];
}

Свои работы для меня для того чтобы сыграть видео в Backgorund. Спасибо всем.

Ответ 2

Если вы попытаетесь изменить фоновый режим: Извините, App Store не одобрит его. MPMoviePlayerViewController воспроизводит видео после перехода на фон для youtube

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

Ответ 3

Воспроизведение фоновой музыки/видео с помощью Avplayer невозможно. Но можно использовать

MPMoviePlayerViewController. Я сделал это в одном из своих приложений, используя этот плеер и это приложение

успешно запускается в appstore.

Ответ 4

Попробуйте этот фрагмент, я уже интегрировал его с моим приложением, и это полезно для меня... надеюсь, что это сработает для вас!

Выполните следующие действия:

  • Добавить UIBackgroundModes в APPNAME-Info.plist с выбором Приложение воспроизводит аудио
  • Затем добавьте фреймворк AudioToolBox в рамки фреймворка.
  • В APPNAMEAppDelegate.h добавить:

    - #import < AVFoundation/AVFoundation.h>

    - #import < AudioToolbox/AudioToolbox.h>

  • В APPNAMEAppDelegate.m добавьте следующее:

    //Установить AudioSession

     NSError *sessionError = nil;
    
        [[AVAudioSession sharedInstance] setDelegate:self];
    
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
    
  • /* Выберите любой из них */

  • //1. Переопределение выходного аудио маршрута

//UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; //AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), & audioRouteOverride);

=============================================== =========================

//2. Изменение выходного аудиодорожка по умолчанию

UInt32 doChangeDefaultRoute = 1;

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

в

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  • но перед двумя строками:

    [self.window addSubview: viewController.view];

    [self.window makeKeyAndVisible];

Наслаждайтесь программированием!

Ответ 5

В дополнение к ответу fattomhk, вот что вы можете сделать, чтобы достичь переадресации видео до того момента, когда оно будет на вашем переднем плане:

  • Получите currentPlaybackTime воспроизведения видео при переходе на задний план и сохраните его в lastPlayBackTime
  • Храните время, когда приложение переходит в фоновый режим (возможно, в userDefault)
  • Снова получите время, когда приложение выходит на передний план
  • Рассчитайте duration между фоном и передним планом
  • Установите текущее время воспроизведения видео на lastPlayBackTime + duration

Ответ 6

Быстрая версия для принятого ответа.

В делегате:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)

В контроллере представления, который управляет AVPlayer

override func viewDidAppear(animated: Bool) {
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()
}

override func viewWillDisappear(animated: Bool) {
    mPlayer.pause()
    UIApplication.sharedApplication().endReceivingRemoteControlEvents()
    self.resignFirstResponder()
}

Не забудьте "импортировать AVFoundation"

Ответ 7

Если вы воспроизводите видео с помощью WebView, вы можете обрабатывать javascript для воспроизведения видео на фоне.

strVideoHTML = @"<html><head><style>body.........</style></head> <body><div id=\"overlay\"><div id=\"youtubelogo1\"></div></div><div id=\"player\"></div> <script> var tag = document.createElement('script'); tag.src = \"http://www.youtube.com/player_api\"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; events: { 'onReady': onPlayerReady, } }); } function onPlayerReady(event) { event.target.playVideo(); } function changeBG(url){ document.getElementById('overlay').style.backgroundImage=url;} function manualPlay() {  player.playVideo(); }  function manualPause() {  player.pauseVideo(); }  </script></body> </html>";

NSString *html = [NSString stringWithFormat:strVideoHTML,url, width, height,videoid;
webvideoView.delegate = self;
[webvideoView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://www.your-url.com"]];

В диалоговом режиме просмотра

strscript = @"manualPlay();
[webvideoView stringByEvaluatingJavaScriptFromString:strscript];

Ответ 8

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

Я узнал, что когда вы идете на фон, свойство rate AVPlayer иногда кажется опустимым до 0.0 (т.е. приостановлено), и по этой причине нам просто нужно всегда проверять свойство скорости KVO, или, по крайней мере, когда мы идем на задний план. Если скорость падает ниже 0.0, и мы можем предположить, что пользователь хочет играть (т.е. Пользователь не намеренно нажал кнопку паузы в пульте дистанционного управления, фильм закончился и т.д.), Нам нужно снова вызвать .play() на AVPlayer.

AFAIK нет другого переключателя на AVPlayer, чтобы он не приостанавливался, когда приложение переходит в фоновый режим.