iOS在线广播流媒体问题

时间:2012-03-22 21:02:00

标签: ios audio streaming metadata ogg

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

  1. 如何播放 .ogg 格式的音频流?有没有支持 班?因为我找不到任何东西,所以我认为这是不可能的 没有使用CFNetworkCoreAudio进行多次按位操作, AudioToolbox(我不看cocos2d,因为它很荒谬) 我错了吗?
  2. 我现在正在播放mp3流(对我来说没有.ogg的可能性)。一世 尝试使用AVPlayerMPMovieMediaController AudioSreaming lib MattGallagher和DigitalDJ ,这些解决方案都不能 为我提供元数​​据访问。
  3. 对于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计数始终 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中获得

    第一次 Metadata = 'StreamTitle='

    第二次 metadata = ''bitrate = '128000'
    (所以我想我必须处理来自 http 标头响应的字节或其他内容像这样?但是wtf,它是shoutcast元数据,但是我的无人机是冰球。不知道) 我将不胜感激任何帮助!

3 个答案:

答案 0 :(得分: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流。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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

祝你好运!