首页 文章

iOS在线广播流媒体问题

提问于
浏览
10

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

  • 如何播放 .ogg 格式的音频流?有没有支持的课程?因为我找不到任何东西,所以我认为没有很多按位操作就不可能使用 CFNetworkCoreAudioAudioToolbox 等 . (I don't look at cocos2d, because it's ridiculous) Am i wrong?

  • 我现在正在播放mp3流(对我来说没有.ogg的可能性) . 我尝试使用 AVPlayerMPMovieMediaControllerAudioSreaming lib by MattGallagher and by DigitalDJ ,这些解决方案都不能为我提供元数据访问 .

For 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 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] 总是没事 .

我试过了

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

但仍然没有运气获得当前的播放曲目信息,只能在SHOUTcast app中获得

1st Metadata = 'StreamTitle='

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

3 回答

  • 3

    要播放ogg格式的音频流,您需要提供编解码器 . iOS对ogg格式没有本机支持

  • 4

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

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

    最重要的元数据键是icy-metaint键 . 此值将告诉您在流中发送元数据的频率 . 有关解析此元数据的更多信息,请查看此网站:Shoutcast Metadata Protocol

    要播放ogg流,您需要使用开源FFmpeg库 . 该库可以为iOS平台编译,用于连接和解码ogg流 .

  • 2

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

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

    在我的情况下,我将这一行添加到Matt Galaghers的Audio Streamer中 . 结果是,当流播放时我实际上可以听到元数据,因为它包含在流数据中 . 下一步是过滤掉元数据并对其进行解释 . 为实现这一目标,这里已经提到了所有必要的信息 .

    祝好运!

相关问题