繁体   English   中英

AVPlayer无法在后台转发流跟踪

[英]AVPlayer not forwarding streaming track in background

我在AVPlayer不在后台播放时遇到问题。

详细信息如下:

我有一个AVPlayer对象和一个AVPlayerItem作为视图控制器的实例变量,以从存储在NSMutableArray, linkArray中的链接流式播放音乐。 当用户在UITableView中点击轨道时,两个对象都将被实例化,如下所示:

musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:indexPath.row]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];

...而且播放非常完美。 只要在应用程序处于活动状态时跟踪结束,就会跳过正常,或者当我手动触发应用程序以跳过跟踪时(无论它处于活动状态还是背景运行)。 但是,当应用程序在后台运行时(包括设备锁定时),跳过时不会播放下一首曲目。

因此,它会自动跳到下一首曲目,但不会播放。 我要么必须再次使该应用程序处于活动状态,要么调用播放(通过耳机控件或系统范围的音乐控件)。

这是skipTrack方法的代码,在手动调用时或在歌曲到达曲目结尾时由系统调用:

        if (nowPlaying == [linkArray count]-1) {
            nowPlaying = 0;
            musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]];
            player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
        } else {
            NSLog(@"NowPlaying (before increment: %i", nowPlaying);
            //If not, increment nowPlaying by one and play
            nowPlaying++;
            NSLog(@"NowPlaying (after increment: %i", nowPlaying);
            musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]];
            player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
     }

真的希望有人可以帮助我

因此,问题在于,因为您已启用应用程序在后台播放音频,所以在播放音乐时它将保持活动状态。 音乐一停止,它就会暂停。 因此,您需要在歌曲停止播放后立即请求时间在后台执行任务(大多数播放器都具有回调功能,以便在歌曲播放完毕时将此代码放在开头)。 所以你的代码看起来像这样...

UIBackgroundTaskIdentifier newTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    // Clean up any unfinished task business by marking where you.
    // stopped or ending the task outright.
    [application endBackgroundTask:newTaskID];
    newTaskID = UIBackgroundTaskInvalid;
}];];

if (nowPlaying == [linkArray count]-1) {
        nowPlaying = 0;
        musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]];
        player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
    } else {
        NSLog(@"NowPlaying (before increment: %i", nowPlaying);
        //If not, increment nowPlaying by one and play
        nowPlaying++;
        NSLog(@"NowPlaying (after increment: %i", nowPlaying);
        musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]];
        player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
 }

[[UIApplication sharedApplication] endBackgroundTask:newTaskID];
newTaskID = UIBackgroundTaskInvalid;'

“ beginBackgroundTaskWithExpirationHandler:”方法将使您有一些时间在后台执行操作。 如果您的时间用完了,将执行发送到该方法的代码块。 您需要包括以防万一出问题了,并且需要清理任务。 在开发人员库中阅读更多有关它的信息: 这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM