我必须创建提供在线广播流(icecast)的应用程序,最好是 .ogg 格式。所以我有下一个问题:
- 如何播放.ogg格式的音频流?有支持的类吗?因为我找不到任何东西,所以我认为没有使用
CFNetwork
,CoreAudio
等 的许多按位运算是不可能的AudioToolbox
。(我不看 cocos2d,因为它很荒谬)我错了吗? - 我现在正在播放 mp3 流(.ogg 对我来说不可能)。我尝试使用MattGallagher 和 DigitalDJ 的 AudioSreaming 库,
AVPlayer
但这些解决方案都不能为我提供元数据访问。MPMovieMediaController
对于 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
,元数据更新从未调用
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]
总是零。
我试过了
这 2 个项目用于shoutcast 和icecast - http://www.mikejablonski.org/2009/04/17/reading-shoutcast-metadata-from-a-stream/
但是仍然没有运气获得当前的播放曲目信息,只能在SHOUTcast 应用程序中获取
第一 Metadata = 'StreamTitle='
,
第二 metadata = ''
和bitrate = '128000'
(所以我认为我必须处理来自http标头响应或类似内容的字节?但是 wtf,它是广播元数据,但我的无线电流是 icecast。不知道)
我将不胜感激任何帮助!