我需要创建一款提供在线无线电流媒体(icecast)服务的应用程序,最好使用.ogg格式。
因此我有以下问题:
- 如何播放.ogg格式音频流?是否有任何支持的类?因为我找不到任何支持它的类,所以我认为除了使用多个位运算操作外,没有其他方法,这可能需要使用到
CFNetwork
,CoreAudio
,AudioToolbox
等等。(我不考虑cocos2d,因为那太荒谬了)我错了吗? - 目前我正在播放mp3流(对我来说没有.ogg的可能性)。我尝试使用
AVPlayer
、MPMovieMediaController
、由MattGallagher和DigitalDJ开发的AudioSreaming库,但是这些解决方案都不能提供元数据访问。
对于AVPlayer:
-(void)playButtonPressed:(id)sender
{
NSURL *grindURL = [NSURL URLWithString:@"http://radio.goha.ru:8000/grind.fm"];
grindFMPlayer = [[AVPlayer alloc] initWithURL:grindURL];
[grindFMPlayer.currentItem addObserver:self forKeyPath:@"status" options:0 context:nil];
AVPlayerItem *item = grindFMPlayer.currentItem;
[grindFMPlayer play];
}
-(void)stopButtonPressed:(id)sender
{
AVURLAsset *ass = grindFMPlayer.currentItem.asset;
NSArray *arr = [ass commonMetadata];
NSArray *it_meta = [grindFMPlayer.currentItem timedMetadata];
[grindFMPlayer pause];
}
arr和it_meta count始终为0,没有歌曲\艺术家\任何元数据。
对于MPMovieMediaController
也是如此,metadataUpdate从未被调用。
streamAudioPlayer = [[MPMoviePlayerController alloc]
initWithContentURL:[NSURL URLWithString:@"http://radio.goha.ru:8000/grind.fm"];
streamAudioPlayer.movieSourceType = MPMovieSourceTypeStreaming;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MetadataUpdate:) name:MPMoviePlayerTimedMetadataUpdatedNotification object:nil];
[streamAudioPlayer play];
并且在停止按钮方法中:
timedMeta = [streamAudioPlayer timedMetadata];
if ([streamAudioPlayer timedMetadata]!=nil && [[streamAudioPlayer timedMetadata] count] > 0)
{
NSLog(@"metadata count = %d", [[streamAudioPlayer timedMetadata] count]);
for (MPTimedMetadata *metadata in [streamAudioPlayer timedMetadata])
{
NSLog(@"description %@", metadata.allMetadata);
if ([[metadata.allMetadata valueForKey:@"key"] isEqualToString:@"title"])
{
NSString *text = [metadata.allMetadata valueForKey:@"value"];
NSString* filename = text;
}
}
}
[streamAudioPlayer timedMetadata]
总是 nil。
我已经尝试了
这两个项目用于 shoutcast 和 icecast - http://www.mikejablonski.org/2009/04/17/reading-shoutcast-metadata-from-a-stream/
但是仍然无法获取当前播放曲目信息,该信息只能在 SHOUTcast 应用程序 中获取,如下所示:
第一条 Metadata = 'StreamTitle='
,
第二条 metadata = ''
且 bitrate = '128000'
(所以我想我必须处理来自http头响应的字节或类似的东西?但它是 shoutcast 元数据,我的 radiostream 是 icecast。没有主意)
我会非常感激任何帮助!