是否可以在后台使用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和后台播放很长一段时间没有问题,但是这一次我不能得到它的工作。
我发现当你走后台的时候, AVPlayer
的rate
属性有时似乎会下降到0.0(即暂停),因此我们只需要KVO随时检查rate属性,或者至less当我们去背景。 如果速率低于0.0,我们可以假设用户想玩(即用户没有故意轻敲遥控器中的暂停,电影结束等),我们需要再次调用AVPlayer上的.play()
。
AFAIK AVPlayer上没有其他切换function,以防止应用程序进入后台时自行暂停。