我有一个应用程序,使用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类
答案 0 :(得分: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;
} }
这样的事对我有用。
答案 1 :(得分:1)
我上传了我的AudioPlayer /流媒体课程,部分灵感来自Matt Gallagher的AudioStreamer https://code.google.com/p/audjustable
其中一个较酷的功能是支持无间隙播放。这意味着AudioQueue永远不会在间隙之间关闭;阻止iOS暂停您的应用。
您可以通过调用AudioPlayerDelegate:didFinishBufferingSourceWithQueueItemId
来实施AudioPlayerDelegate:didFinishPlayingQueueItemId
和AudioPlayer:queueDataSource
以排队下一首曲目。
如果您需要帮助,请告诉我。