Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS在线广播流媒体问题_Ios_Audio_Streaming_Metadata_Ogg - Fatal编程技术网

iOS在线广播流媒体问题

iOS在线广播流媒体问题,ios,audio,streaming,metadata,ogg,Ios,Audio,Streaming,Metadata,Ogg,我必须创建应用程序,提供在线广播流(icecast),最好是.ogg格式。 所以我还有下一个问题: 如何播放.ogg格式音频流?是否有任何支持 上课?因为我找不到,所以我认为这是不可能的 无需使用CFNetwork,CoreAudio进行许多位操作, AudioToolbox等(我不看cocos2d,因为它很可笑) 我错了吗? 我现在正在播放mp3流(我不可能使用.ogg)。我 尝试使用AVPlayer,MPMovieMediaController,音频查找库 MattGallagher和by

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

  • 如何播放.ogg格式音频流?是否有任何支持 上课?因为我找不到,所以我认为这是不可能的 无需使用
    CFNetwork
    CoreAudio
    进行许多位操作,
    AudioToolbox
    (我不看cocos2d,因为它很可笑) 我错了吗?
  • 我现在正在播放mp3流(我不可能使用.ogg)。我 尝试使用
    AVPlayer
    MPMovieMediaController
    音频查找库 MattGallagher和by 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];
    }
    
    arrit_元计数始终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的这两个项目:

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

    1st
    元数据='StreamTitle='

    2nd
    元数据='
    比特率='128000'

    (所以我想我必须处理http头响应中的字节或类似的内容?但是wtf,它应该是cast元数据,但我的无线流是icecast。不知道)

    如果有任何帮助,我将不胜感激

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

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

    最重要的元数据键是icy metaint键。此值将告诉您元数据在流中发送的频率。有关解析此元数据的更多信息,请访问此网站:


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

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

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

    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Icy-MetaData"), CFSTR("1"));
    
    在我的例子中,我将这一行添加到Matt Galaghers的音频拖缆中。结果是,我可以在播放流时听到元数据,因为它包含在流数据中。下一步是过滤元数据并对其进行解释。为了实现这一点,这里已经提到了所有必要的信息


    祝你好运

    是的,我看到了cocoaWithLove的“mp3流”帖子周期和元数据的HTTP直播综述。。。这个问题至少每周都有人回答。搜索。Icecast是为了与SHOUTcast兼容而构建的,并以相同的方式返回元数据。哦,谢谢,我会尝试查找它。只有在更新元数据时,您才能获得元数据。否则,块的第一个字节为
    0x00
    ,表示0字节的长度。。。没有变化。如果第一个块表示您的
    StreamTitle
    等于一个空字符串,那么您的服务器没有从编码器接收元数据。您所说的“我的服务器”是什么意思?我的应用程序?顺便说一句,如果你已经回答了这个问题,你能分享这个问题的链接吗?无论如何,谢谢你;]