首页 文章

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

提问于
浏览
16

我正在使用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

8 回答

  • 1

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

    我发现当你去背景时, AVPlayerrate 属性有时似乎会下降到0.0(即暂停),因此我们只需要KVO一直检查rate属性,或者至少在我们去的时候背景 . 如果利率低于0.0,我们可以假设用户想要播放(即用户没有故意点击遥控器中的暂停,电影结束等)我们需要再次在AVPlayer上调用 .play() .

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

  • 3

    此方法支持所有可能性:

    • 用户锁定的屏幕;

    • 列出项目

    • 按下主页按钮;

    只要你有一个运行iOS的AVPlayer实例就可以防止设备自动锁定 .

    首先,您需要配置应用程序以支持Info.plist文件中的音频背景,在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;
            }
        }
    

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

    当你控制视频的再现(我有播放方法)设置

    [[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播放视频 . 谢谢大家 .

  • 0

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

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

  • 1

    使用Avplayer无法播放背景音乐/视频 . 但它有可能使用

    MPMoviePlayerViewController . 我在我的一个应用程序中使用此播放器和此应用程序完成了此操作

    成功运行到appstore .

  • 0

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

    请按照以下步骤操作:

    • 在APPNAME-Info.plist中添加UIBackgroundModes,选择App播放音频

    • 然后将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 {
    
    • 但在两行之前:

    [self.window addSubview:viewController.view];

    [self.window makeKeyAndVisible];

    享受编程!!

  • 2

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

    • 获取背景时播放视频的 currentPlaybackTime 并将其存储在 lastPlayBackTime

    • 存储应用程序转到后台的时间(可能在 userDefault 中)

    • 再次获取应用程序进入前台的时间

    • 计算背景和前景时间之间的 duration

    • 将视频的当前播放时间设置为 lastPlayBackTime duration

  • 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”

  • 13

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

相关问题