Можно ли воспроизводить видео с помощью Avplayer в фоновом режиме?
Я использую Avplayer для показа видеоклипов, и когда я возвращаюсь (приложение в фоновом режиме), видео останавливается. Как я могу продолжать проигрывать видео?
У меня есть поиск по фоновой задаче и фоновой теме, IOS поддерживает только музыку в фоновом режиме (не видео) http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html
вот некоторые обсуждения о play video в фоновом режиме
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
8 ответов
этот метод поддерживает все возможности:
- экран заблокирован пользователем;
- элемент списка
- кнопка Home нажата;
пока у вас есть экземпляр AVPlayer под управлением iOS предотвращает автоматическую блокировку устройства.
сначала вам нужно настроить приложение для поддержки звукового фона из информации.plist-файл, добавляющий в массив UIBackgroundModes звуковой элемент.
после этого положите в ваше Файле AppDelegate.м в
- (BOOL)применение: (UIApplication *)применение didFinishLaunchingWithOptions: (NSDictionary *)launchOptions:
эти методы
[[AVAudioSession sharedInstance] setDelegate: self];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
и #import
затем в вашем контроллере просмотра, который управляет 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;
}
}
для возобновления воспроизведение если пользователь нажимает кнопку Home (в этом случае воспроизведение приостанавливается с затухание).
когда вы контролируете воспроизведение видео (у меня есть методы воспроизведения) установите
[[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. Благодарить всех.
при попытке изменить фоновый режим: Извините, App store не одобрит это.MPMoviePlayerViewController воспроизведение видео после перехода в фоновом режиме для youtube
в моем исследовании, кто-то взял бы звуковую дорожку, чтобы играть в фоновом режиме, когда он переходит в фоновом режиме, как видео будет пауза и получить playbacktime для возобновления воспроизведения, когда перейти на передний план
невозможно воспроизвести фоновую музыку / видео с помощью Avplayer. Но это возможно с помощью
MPMoviePlayerViewController. Я сделал это в одном из моих приложений, используя этот плеер и это приложение
успешно запущен в appstore.
попробуйте с этим фрагментом, я уже интегрировал это с моим приложением, и это полезно для меня..надеюсь, это сработает для вас!!
выполните следующие действия:
- добавить UIBackgroundModes в APPNAME-Info.plist, с выбором Приложение воспроизводит аудио
- затем добавьте audiotoolbox framework в рамки папок.
-
в APPNAMEAppDelegate.ч добавить:
--
#import < AVFoundation/AVFoundation.h>
--
#import < AudioToolbox/AudioToolbox.h>
-
в APPNAMEAppDelegate.м добавить следующее:
// Набор 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.окна с помощью addSubview:файл ViewController.view];
[self.окна makeKeyAndVisible];
Программирование!!
в дополнение к ответу fattomhk, вот что вы можете сделать, чтобы добиться переадресации видео в то время, когда это должно быть после того, как ваше приложение выходит на передний план:
- Get
currentPlaybackTime
воспроизведения видео, когда перейдите в фоновый режим и сохраните его вlastPlayBackTime
- хранить время, когда приложение переходит в фоновый режим (в
userDefault
наверное) - снова получите время, когда приложение выходит на передний план
- вычислить
duration
между фоном и время переднего плана - установите текущее время воспроизведения видео в
lastPlayBackTime
+duration
Swift версия для принятого ответа.
в делегат:
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"
Если вы воспроизводите видео с помощью 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"]];
на просмотр diappear вызова
strscript = @"manualPlay();
[webvideoView stringByEvaluatingJavaScriptFromString:strscript];
Я хотел бы добавить кое-что, что по какой-то причине оказалось виновником для меня. Я долгое время без проблем использовал AVPlayer и background play, но на этот раз я просто не мог заставить его работать.
я узнал, что, когда вы идете фоне rate
свойства AVPlayer
иногда кажется, что падает до 0.0 (т. е. приостановлено), и по этой причине нам просто нужно KVO проверить свойство rate во все времена или, по крайней мере, когда мы идем в фоновом режиме. Если скорость падает ниже 0.0 и мы можем предположить, что пользователь хочет играть (т. е. пользователь не умышленно нажмите паузу в пультах дистанционного управления, фильм закончился, и т. д.) Нужно позвонить .play()
на AVPlayer снова.
AFAIK нет другого переключателя на AVPlayer, чтобы он не приостанавливался, когда приложение переходит в фоновый режим.