iOS在线广播流媒体问题

Aft*_*ath 11 audio streaming metadata ogg ios

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

  1. 我怎么能播放.ogg格式的音频流?有没有支持的课程?因为我找不到任何,所以我认为它没有用很多位操作是不可能的CFNetwork,CoreAudio, AudioToolbox(我不看cocos2d的,因为这很可笑),我错了?
  2. 我现在正在播放mp3流(对我来说没有.ogg的可能性).我试图用AVPlayer,MPMovieMediaController,AudioSreaming LIB通过MattGallagher和DigitalDJ,以及这些解决方案都不能为我提供了元数据访问.

对于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];
}
Run Code Online (Sandbox Code Playgroud)

arrit_meta计数总是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];
Run Code Online (Sandbox Code Playgroud)

并在停止按钮方法:

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;
                    }
                }
            }
Run Code Online (Sandbox Code Playgroud)

[streamAudioPlayer timedMetadata] 永远没有.

我试过了

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

但仍然没有运气来获得当前播放曲目信息,其中只有在获得Shoutcast一样的应用程序

1 Metadata = 'StreamTitle=',

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

Kem*_*kin 6

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

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

最重要的元数据密钥是icy-metaint密钥。此值将告诉您流中发送元数据的频率。有关解析此元数据的更多信息,请访问以下网站:Shoutcast元数据协议

要播放ogg流,您需要使用开源FFmpeg库。该库可以针对iOS平台进行编译,并用于连接和解码ogg流。