2

我有一个使用 Matt Gallagher 的 AudioStreamer 类流式传输音乐的应用程序。这可以作为后台进程正常工作,除非我希望能够在流完成后跳到下一首歌曲。不幸的是,这部分不起作用。最初我有一个监视流的计时器,但意识到当应用程序后台运行时,该计时器不再运行。所以我尝试在数据包读取函数中添加一个委托回调:

void ASReadStreamCallBack(CFReadStreamRef aStream, CFStreamEventType eventType, void* inClientInfo)
{
   AudioStreamer* streamer = (AudioStreamer *)inClientInfo;
   double percent = [streamer progress]/[streamer duration];
   if(percent>=0.98 || (percent>=0.95 && [streamer isIdle])){
     if([streamer.delegate respondsToSelector:@selector(didFinishPlayingStream:)] ){
         [streamer.delegate didFinishPlayingStream:streamer];
         streamer.delegate = nil;
     }
   }


   [streamer handleReadFromStream:aStream eventType:eventType];
}

这在应用程序处于前台时工作正常,但在应用程序处于后台时不再工作。委托方法基本上发送一个请求以获取下一首歌曲的流 URL,然后一旦它创建一个新的 AudioStreamer 类

4

2 回答 2

1

当应用程序在后台时,您可以实现委托来处理不同的远程控制状态。

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 
switch (receivedEvent.subtype) {
    case UIEventSubtypeRemoteControlTogglePlayPause:
        if (player.isPlaying) {
            [player pause];
        } else {
            [player start];
        }
        break;

    case UIEventSubtypeRemoteControlPreviousTrack:
        break;

    case UIEventSubtypeRemoteControlNextTrack:
        [self skipSong:nil];
        break;

    default:
        break;
} }

像这样的东西对我有用。

于 2012-05-15T09:14:31.340 回答
1

我已将部分受 Matt Gallagher 的 AudioStreamer 启发的 AudioPlayer/streamer 类上传到 https://code.google.com/p/audjustable

更酷的功能之一是它支持无缝播放。这意味着 AudioQueue 永远不会在间隙之间关闭;防止 iOS 暂停您的应用程序。

您可以通过调用来实现AudioPlayerDelegate:didFinishBufferingSourceWithQueueItemIdAudioPlayerDelegate:didFinishPlayingQueueItemId排队下一首曲目AudioPlayer:queueDataSource

如果您在使用它时需要帮助,请告诉我。

于 2012-06-03T12:27:48.280 回答