Мне нужно создать приложение, которое обеспечивает потоковое радио онлайн (icecast), предпочтительно в формате .ogg.
Поэтому у меня есть следующие вопросы:
- Как воспроизвести аудиопоток в формате .ogg ? Есть ли поддерживаемые
классы? Потому что я не могу найти ни одного, поэтому я думаю, что это невозможно
без множества побитовых операций с использованием
CFNetwork
, CoreAudio
,
AudioToolbox
и т. Д. (я не смотрю на cocos2d, потому что это смешно)
Я не прав?
- Сейчас я играю mp3-поток (для меня нет возможности .ogg). я
попытался использовать
AVPlayer
, MPMovieMediaController
, AudioSreaming lib
MattGallagher и 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];
}
arr и it_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]
всегда ноль.
Я пробовал
Эти 2 проекта для shoutcast и icecast - http://www.mikejablonski.org/2009/04/17/reading-shoutcast-metadata-from-a-stream/
Но все равно не получилось получить информацию о текущем проигрываемом треке, которую можно получить только в приложении SHOUTcast как
1-й Metadata = 'StreamTitle='
,
2nd metadata = ''
и bitrate = '128000'
(Так что я думаю, что мне нужно иметь дело с байтами из ответа http заголовков или что-то вроде этого? Но wtf, это метаданные shoutcast, но мой радиопоток - ледяной. Понятия не имею)
Буду благодарен за любую помощь!