gpt4 book ai didi

iphone - AVPlayer 不在后台转发流媒体轨道

转载 作者:行者123 更新时间:2023-11-28 23:05:18 26 4
gpt4 key购买 nike

我遇到了 AVPlayer 无法在后台播放 的问题。

详情如下:

我有一个 AVPlayer 对象和一个 AVPlayerItem 作为我的 View Controller 的实例变量,用于从存储在 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:”方法会给你一些时间在后台做事。如果您的时间用完,则执行发送到该方法的代码块。您需要包括它以防出现问题并且您需要清理任务。在开发库中阅读更多相关信息:here

关于iphone - AVPlayer 不在后台转发流媒体轨道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com