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

时间:2013-03-18 05:47:18

标签: iphone ios ios5 video 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

8 个答案:

答案 0 :(得分:13)

此方法支持所有可能性:

  • 用户锁定的屏幕;
  • 列表项
  • 按下主页按钮;

只要您有运行iOS的AVPlayer实例,就会阻止设备自动锁定。

首先,您需要配置应用程序以支持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播放视频。 谢谢大家。

答案 1 :(得分:3)

如果您尝试更改后台模式: 对不起,App Store不会批准它。MPMoviePlayerViewController playback video after going to background for youtube

在我的研究中,有人会在进入背景时将声道播放到背景中,因为视频会暂停,并在进入前景时获得恢复播放的播放时间

答案 2 :(得分:2)

使用Avplayer无法播放背景音乐/视频。但是可以使用

MPMoviePlayerViewController。我在我的一个应用程序中使用此播放器&这个应用程序

成功运行到appstore。

答案 3 :(得分:2)

尝试使用此代码段,我已经将其与我的应用程序&它对我有用..希望这对你有用!!

按照以下步骤操作:

  • 使用选择在APPNAME-Info.plist中添加UIBackgroundModes 应用播放音频
  • 然后将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),&amp; 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];

享受编程!!

答案 4 :(得分:1)

除了fattomhk的回复之外,您可以采取以下措施来实现视频转发到应用程序进入前台后的应用时间:

  • 转到后台时获取播放视频的currentPlaybackTime并将其存储在lastPlayBackTime
  • 存储应用程序转到后台的时间(可能在userDefault中)
  • 再次获取应用程序进入前台的时间
  • 计算背景和前景时间之间的duration
  • 将视频的当前播放时间设置为lastPlayBackTime + duration

答案 5 :(得分:1)

接受答案的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()
}

不要忘记&#34;导入AVFoundation&#34;

答案 6 :(得分:0)

如果您正在使用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];

答案 7 :(得分:0)

我想添加一些因某种原因最终成为我的罪魁祸首的东西。我已经使用AVPlayer和背景播放很长一段时间没有问题,但有一次我无法让它工作。

我发现当你去后台时,rate的{​​{1}}属性有时似乎会下降到0.0(即暂停),因此我们只需要KVO检查率属性在任何时候,或者至少在我们去背景时。如果费率低于0.0并且我们可以假设用户想要播放(即用户没有故意点击遥控器中的暂停,电影结束等)我们需要再次在AVPlayer上调用AVPlayer。 / p>

AFAIK AVPlayer上没有其他切换功能可以防止它在应用程序转到后台时暂停。

相关问题