是否可以在后台使用Avplayer播放video?

我使用Avplayer来显示video剪辑,当我回去(应用程序在后台)video停止。 我怎样才能继续播放video?

我有search关于后台任务和后台线程,IOS只支持背景音乐(不是video) http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

这里是关于在后台播放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中有很多应用程序,像背景播放video

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

这种方法支持所有的可能性:

  • 屏幕由用户locking;
  • 项目清单
  • 主页button被按下;

只要你有一个运行iOS的AVPlayer实例防止设备自动locking。

首先,您需要configuration应用程序以支持来自Info.plist文件的audio背景,在UIBackgroundModes数组中添加audio元素。

然后把你的AppDelegate.m放进去

– (BOOL)application:(UIApplication *)application 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; } } 

如果用户按下主页button(在这种情况下再现被暂停而淡出),则需要另一个技巧来恢复再现。

当你控制video的再现(我有玩的方法)设置

 [[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播放video。 谢谢大家。

如果您尝试更改背景模式:对不起,app store不会批准它。 MPMoviePlayerViewController后为YouTube的背景回放video

在我的研究中,当video暂停时,有人会把声音播放到后台播放,并在进入前台时获得重新播放的播放时间

使用Avplayer播放背景音乐/video是不可能的。 但有可能使用

MPMoviePlayerViewController。 我已经在我的应用程序中使用这个播放器和这个应用程序做了这个

成功运行到appstore。

试试这个片段,我已经把它与我的应用程序集成在一起,这对我来说很有用..希望这会对你有用!

遵循以下步骤:

  • 在APPNAME-Info.plist中添加UIBackgroundModes,selectApp播放audio
  • 然后将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]; 
  • / *select其中任何一个* /

  • // 1.覆盖输出audio路由

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

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

// 2.更改默认的输出audio路由

 UInt32 doChangeDefaultRoute = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 

进入

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  • 但在两行之前:

    [self.window addSubview:viewController.view];

    [self.window makeKeyAndVisible];

享受编程!

除了fattomhk的回应,下面是你可以做什么来实现video转发的时间应该是你的应用程序在前台后:

  • 获取当前播放video的当前播放时间并将其存储在lastPlayBackTime
  • 存储应用程序转到后台的时间(可能在userDefault
  • 再次获得应用程序进入前台的时间
  • 计算背景和前景时间之间的duration时间
  • 将video的当前播放时间设置为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播放video,则可以使用JavaScript处理后台播放video。

 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和后台播放很长一段时间没有问题,但是这一次我不能得到它的工作。

我发现当你走后台的时候, AVPlayerrate属性有时似乎会下降到0.0(即暂停),因此我们只需要KVO随时检查rate属性,或者至less当我们去背景。 如果速率低于0.0,我们可以假设用户想玩(即用户没有故意轻敲遥控器中的暂停,电影结束等),我们需要再次调用AVPlayer上的.play()

AFAIK AVPlayer上没有其他切换function,以防止应用程序进入后台时自行暂停。