iOS在线电台stream媒体问题

我必须创build提供在线广播stream(icecast)的应用程序,最好是.ogg格式。 所以我有下面的问题:

  1. 如何播放.ogg格式的audiostream? 有支持的类吗? 因为我找不到任何东西,所以我认为没有许多使用CFNetworkCoreAudioAudioToolbox等的按位操作是不可能的(我不看cocos2d,因为它很荒谬)我错了吗?
  2. 我正在播放MP3stream(对我来说没有可能的.ogg)。 我试图使用由MattGallagher和DigitalDJ提供的AVPlayerMPMovieMediaControllerAudioSreaming lib ,而这些解决scheme都不能提供元数据访问。

对于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]; } 

arrit_meta数总是0 ,没有歌曲\艺术家\任何元数据。
对于MPMovieMediaController ,元数据更新永远不会被调用

 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]; 

并在停止button的方法:

 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]始终为零。

我试过了

  • https://github.com/mattgallagher/AudioStreamer
  • https://github.com/DigitalDJ/AudioStreamer

这两个shoutcast和icecast项目 – http://www.mikejablonski.org/2009/04/17/reading-shoutcast-metadata-from-a-stream/

但仍然没有得到当前播放的轨道信息,只有在SHOUTcast应用程序获得

第一个 Metadata = 'StreamTitle='

第二个 metadata = ''bitrate = '128000'
(所以我想我必须处理来自HTTP头响应的字节或类似的东西?但wtf,这是shoutcast元数据,但我的radiostream是icecast。不知道)
我将不胜感激任何帮助!

Icecast和Shoutcast是相互兼容的。 区别在于它们响应HTTP GET请求的方式。 当你发送一个HTTP GET请求到一个Icecast服务器时,它将回复一个HTTP 200 OK响应。 响应标题将包含icy-br,icy-metaint,icy-name,icy-genre和icy-url键的值。

当您向Shoutcast服务器发送HTTP GET请求时,它将响应ICY 200 OK响应。 在这种情况下,您将不得不分析响应数据,因为元数据在响应头文件中不可用。

最重要的元数据键是冰 – metaint键。 这个值会告诉你元数据在stream中发送的频率。 有关parsing这个元数据的更多信息请看这个网站: Shoutcast元数据协议

要玩oggstream,你需要使用开源的FFmpeg库。 这个库可以编译为iOS平台,并用于连接和解码oggstream。

要播放ogg格式的audiostream,您需要提供编解码器。 iOS不支持ogg格式

我认为首先要做的是通过设置请求头来“sorting”元数据:

 CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Icy-MetaData"), CFSTR("1")); 

在我的情况下,我把这一行添加到马特Galaghers的audiostream。 结果是,当stream播放时,我实际上可以听到元数据,因为它包含在stream数据中。 下一步是过滤元数据并解释它。 为了实现这一点,所有必要的信息已经在这里提到。

祝你好运!