iOS开源项目:AudioPlayer
AudioPlayer是一个基于AVAudioStreamer的在线音乐播放软件。
https://github.com/marshluca/AudioPlayer
首先将歌曲信息存储在NSArray中:
itemArray = [[NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys:@"温柔", @"song", @"五月天", @"artise", @"http://y1.eoews.com/assets/ringtones/2012/5/18/34049/oiuxsvnbtxks7a0tg6xpdo66exdhi8h0bplp7twp.mp3", @"url", nil], [NSDictionary dictionaryWithObjectsAndKeys:@"今天", @"song", @"刘德华", @"artise", @"http://y1.eoews.com/assets/ringtones/2012/5/18/34045/hi4dwfmrxm2citwjcc5841z3tiqaeeoczhbtfoex.mp3", @"url", nil], [NSDictionary dictionaryWithObjectsAndKeys:@"K歌之王", @"song", @"陈奕迅", @"artise", @"http://y1.eoews.com/assets/ringtones/2012/5/17/34031/axiddhql6nhaegcofs4hgsjrllrcbrf175oyjuv0.mp3", @"url", nil], [NSDictionary dictionaryWithObjectsAndKeys:@"知足", @"song", @"五月天", @"artise", @"http://y1.eoews.com/assets/ringtones/2012/5/17/34016/eeemlurxuizy6nltxf2u1yris3kpvdokwhddmeb0.mp3", @"url", nil], [NSDictionary dictionaryWithObjectsAndKeys:@"桔子香水", @"song", @"任贤齐", @"artise", @"http://y1.eoews.com/assets/ringtones/2012/6/29/36195/mx8an3zgp2k4s5aywkr7wkqtqj0dh1vxcvii287a.mp3", @"url", nil], nil] retain];
然后在播放的时候:
- (void)playAudio:(AudioButton *)button { NSInteger index = button.tag; NSDictionary *item = [itemArray objectAtIndex:index]; if (_audioPlayer == nil) { _audioPlayer = [[AudioPlayer alloc] init]; } if ([_audioPlayer.button isEqual:button]) { [_audioPlayer play]; } else { [_audioPlayer stop]; _audioPlayer.button = button; _audioPlayer.url = [NSURL URLWithString:[item objectForKey:@"url"]]; [_audioPlayer play]; } }
在[_audioPlayer play]内部,使歌曲的url初始化AudioStreamer,并用NSTimer设置一个每0.1秒调用一次的方法来更新歌曲的播放进度。然后注册一个播放状态变化的通知。
- (void)play { if (!streamer) { self.streamer = [[AudioStreamer alloc] initWithURL:self.url]; // set up display updater NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector:@selector(updateProgress)]]; [invocation setSelector:@selector(updateProgress)]; [invocation setTarget:self]; timer = [NSTimer scheduledTimerWithTimeInterval:0.1 invocation:invocation repeats:YES]; // register the streamer on notification [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateChanged:) name:ASStatusChangedNotification object:streamer]; } if ([streamer isPlaying]) { [streamer pause]; } else { [streamer start]; } }