18

我正在使用 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 中有很多应用程序,它们在后台播放视频,例如

斯威夫特播放器: 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

4

8 回答 8

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 中播放视频。谢谢大家。

于 2013-03-22T06:53:16.367 回答
3

如果您尝试更改后台模式:对不起,App Store 不会批准。MPMoviePlayerViewController 在进入 youtube 后台后播放视频

在我的研究中,有人会在进入后台时将音轨拿出​​来在后台播放,因为视频会暂停并获得播放时间以在进入前台时恢复播放

于 2013-03-18T05:56:06.797 回答
2

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

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

成功运行到应用商店。

于 2013-03-22T05:42:47.123 回答
2

试试这个片段,我已经将它与我的应用程序集成,它对我很有用..希望这对你有用!

请按照以下步骤操作:

  • 在 APPNAME-Info.plist 中添加 UIBackgroundModes,选择 App 播放音频
  • 然后将 AudioToolBox 框架添加到文件夹 frameworks 中。
  • 在 APPNAMEAppDelegate.h 中添加:

    --#import < AVFoundation/AVFoundation.h>

    --#import < AudioToolbox/AudioToolbox.h>

  • 在 APPNAMEAppDelegate.m 中添加以下内容:

    // 设置音频会话

     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.window addSubview:viewController.view];

    [self.window makeKeyAndVisible];

享受编程!!

于 2013-03-23T07:57:00.217 回答
2

已接受答案的 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”

于 2015-06-15T04:56:47.480 回答
1

除了 fattomhk 的响应之外,您还可以执行以下操作来将视频转发到应用程序进入前台后的时间:

  • currentPlaybackTime转到后台时获取播放视频并将其存储在lastPlayBackTime
  • 存储应用程序进入后台的时间(userDefault可能)
  • 再次获得应用程序进入前台的时间
  • 计算duration背景时间和前景时间
  • 将视频的当前播放时间设置为lastPlayBackTime+duration
于 2013-03-20T07:06:32.287 回答
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"]];

在视图中消失呼叫

strscript = @"manualPlay();
[webvideoView stringByEvaluatingJavaScriptFromString:strscript];
于 2014-05-08T06:56:23.787 回答
0

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

我发现当你进入后台时,有时该rate属性AVPlayer似乎下降到 0.0(即暂停),因此我们只需要随时检查速率属性,或者至少在我们进入后台时。如果速率下降到 0.0 以下并且我们可以假设用户想要播放(即用户没有故意点击遥控器中的暂停、电影结束等),我们需要.play()再次调用 AVPlayer。

AFAIK AVPlayer 上没有其他开关可以防止它在应用程序进入后台时自行暂停。

于 2017-10-01T01:21:51.537 回答