【问题标题】:Background Audio with cocoalibspotify带有 cocoalibspotify 的背景音频
【发布时间】:2012-07-16 23:36:25
【问题描述】:

我已经为我的应用(在 plist 中)正确启用了背景音频。在当前播放完成后在后台使用 SPPlaybackManager 播放下一首曲目(当手机被锁定/关闭时)不起作用。

当当前曲目结束并且音频停止时,应用程序不会开始播放下一曲目,直到手机解锁并且我的应用程序再次激活。

我该如何解决这个问题?这是我用来开始播放下一首曲目的 sn-p 代码。我观察到当前曲目变为 nil,然后开始播放下一首曲目。日志显示正在播放管理器对象中设置下一个当前曲目,但它是静默的。

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {



    if([keyPath isEqualToString:@"spotifyPlaybackManager.currentTrack"]){

        NSLog(@"%@ %@",keyPath,self.spotifyPlaybackManager.currentTrack);

        if(self.spotifyPlaybackManager.currentTrack==nil && self.mode == PlayerModeSpotify){

            NSLog(@"PLAY NEXT");
            [self.spotifyPlaybackManager playTrack:self.nextSPTrack callback:^(NSError *error){
                if(error) TKLog(@"Spotify Playback Error %@",error);
            }];
        }
        [[NSNotificationCenter defaultCenter] postNotificationName:PlayerNowPlayingItemDidChange object:self];
        return;
    }



    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

控制台:

spotifyPlaybackManager.currentTrack (null)
PLAY NEXT
spotifyPlaybackManager.currentTrack <SPTrack: 0x60f8390>: Karaoke

【问题讨论】:

    标签: spotify cocoalibspotify-2.0


    【解决方案1】:

    解决方案非常简单,但我花了一年时间才意识到。我的旧解决方案是在上一首曲目结束之前启动后台任务,并保持运行直到下一首曲目播放。那很容易出错。而是:

    跟踪您的播放状态(播放或暂停)。每当您过渡到 Playing 时,就启动一个后台任务。永远不要停止它,除非你过渡到暂停。即使在曲目之间也保持播放状态。只要您的 info.plist 中有音频背景模式并且正在播放音频,您的后台任务就会无限超时。

    一些伪代码:

    @interface PlayController
    @property BOOL playing;
    
    - (void)playPlaylist:(SPPlaylist*)playlist startingAtRow:(int)row;
    @end
    
    @implementation PlayController
    - (void)setPlaying:(BOOL)playing
    {
        if(playing == _playing) return;
        _playing = playing;
    
        UIApplication *app = [UIApplication sharedApplication];
        if(playing)
            self.playbackBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:^ {
                NSLog(@"Still playing music but background task expired! :(");
                        [app endBackgroundTask:self.playbackBackgroundTask];
                    self.playbackBackgroundTask = UIBackgroundTaskInvalid;
                }];
        else if(!playing && self.playbackBackgroundTask != UIBackgroundTaskInvalid)
            [app endBackgroundTask:self.playbackBackgroundTask];
    }
    ...
    @end
    

    编辑:哦,我finally blogged about it

    【讨论】:

    • 工作就像一个魅力。你是真正的救世主!
    • 啊,快。毕竟没有工作。这似乎一开始就不是我的问题。
    • 感谢 nevyn 的帖子。但是endBackgroundTask:不是停止了我们刚刚启动的后台任务,因此应用程序不能再运行任何其他代码了吗?即调用endBackgroundTask:后,应用程序将无法再次调用setPlaying:
    • Andrei:endBackgroundTask 在 else 子句中,所以只有在停止播放时才会调用它。之后很自然的,直到用户再次激活应用程序才能开始播放(因为只有用户才能开始播放)。请记住,此方法适用于用户是否在语义播放,而不是您当前是否正在接收流式音频,或者您是否在轨道之间。
    【解决方案2】:

    CocoaLibSpotify 为开始播放曲目做了很多工作,并且可能会在此过程中产生新的内部线程。我怀疑这在背景音频风格中是允许的,因此您可能需要启动一个临时后台任务来更改曲目。

    【讨论】:

    • 我只是尝试在调用“self.spotifyPlaybackManager playTrack:...”之前直接放入“beginBackgroundTaskWithExpirationHandler”,一旦尝试创建新任务,代码就会暂停运行。还有其他建议吗?
    • 我的音频应用(GroovePond)在播放背景音频的时候会做很多后台任务,比如接受新客户端和更新现有客户端的状态,Apple 似乎没有任何问题。我认为因为任务与音频的播放直接相关,所以是允许的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多