iOS在线广播流媒体问题
我必须创建应用程序,提供在线广播流(icecast),最好是.ogg格式。 所以我还有下一个问题:iOS在线广播流媒体问题,ios,audio,streaming,metadata,ogg,Ios,Audio,Streaming,Metadata,Ogg,我必须创建应用程序,提供在线广播流(icecast),最好是.ogg格式。 所以我还有下一个问题: 如何播放.ogg格式音频流?是否有任何支持 上课?因为我找不到,所以我认为这是不可能的 无需使用CFNetwork,CoreAudio进行许多位操作, AudioToolbox等(我不看cocos2d,因为它很可笑) 我错了吗? 我现在正在播放mp3流(我不可能使用.ogg)。我 尝试使用AVPlayer,MPMovieMediaController,音频查找库 MattGallagher和by
CFNetwork
,CoreAudio
进行许多位操作,
AudioToolbox
等(我不看cocos2d,因为它很可笑)
我错了吗?AVPlayer
,MPMovieMediaController
,音频查找库
MattGallagher和by DigitalDJ,这些解决方案都不能
为我提供元数据访问 -(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_元计数始终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]
始终为零
我试过了
元数据='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
等于一个空字符串,那么您的服务器没有从编码器接收元数据。您所说的“我的服务器”是什么意思?我的应用程序?顺便说一句,如果你已经回答了这个问题,你能分享这个问题的链接吗?无论如何,谢谢你;]