Вопросы о потоковой передаче онлайн-радио на iOS

Мне нужно создать приложение, обеспечивающее потоковую передачу онлайн-радио (icecast), желательно в формате .ogg. Итак, у меня есть следующие вопросы:

  1. Как я могу воспроизвести аудиопоток формата .ogg? Есть ли поддерживаемые классы? Потому что я не могу найти, поэтому я думаю, что это невозможно без множества побитовых операций с использованием CFNetwork, CoreAudio, AudioToolboxи т.д. (на cocos2d не смотрю, ибо смешно) Я ошибся?
  2. Сейчас я проигрываю поток 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 appas

1stMetadata = 'StreamTitle=',

2ndmetadata = ''and bitrate = '128000'
(Так Я думаю, что мне нужно иметь дело с байтами из ответа заголовков httpили что-то в этом роде?, но wtf, это метаданные Shoutcast, но мой радиопоток - icecast. Понятия не имею)
Буду признателен за любую помощь!

11
задан The iOSDev 25 July 2012 в 09:27
поделиться