Можно ли воспроизводить видео с помощью 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
Ответы
Ответ 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 {
Наслаждайтесь программированием!
Ответ 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, чтобы он не приостанавливался, когда приложение переходит в фоновый режим.