2012-03-22 1 views
10

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

  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]; 
} 

обр и it_meta подсчитывать всегда , ни песня \ группа \ любые метаданные.
То же самое для 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 проекта для пренадлежат и Icecast - http://www.mikejablonski.org/2009/04/17/reading-shoutcast-metadata-from-a-stream/

Но все-таки не везет, чтобы получить текущую информацию воспроизведения трека, который получен только в SHOUTcast app, как

первыйMetadata = 'StreamTitle=',

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

+2

и да, я видел какао с потоком сообщений «потоковое воспроизведение mp3» и HTTP Live Streaming Обзор – Aft3rmath

+0

О метаданных ... На этот вопрос был дан ответ не реже одного раза в неделю. Поиск. Icecast построен для совместимости с SHOUTcast и возвращает метаданные таким же образом. – Brad

+0

О, спасибо, я постараюсь его найти. – Aft3rmath

ответ

4

Icecast и Shoutcast совместимы друг с другом. Разница заключается в том, как они отвечают на запрос HTTP GET. Когда вы отправляете HTTP-запрос GET на сервер Icecast, он отвечает ответом HTTP 200 OK.Заголовки ответов будут содержать значения для ледяных букв, ледяных метатетов, лексических имен, ледяных жанров и лексико-ключей.

Когда вы отправляете HTTP-запрос GET на сервер Shoutcast, он ответит ответом ICY 200 OK. В этом случае вам придется анализировать данные ответа, потому что метаданные не будут доступны в заголовках ответов.

Наиболее важным ключом метаданных является клавиша ледяной метки. Это значение покажет вам, как часто метаданные отправляются в потоке. Дополнительные сведения о разборе этих метаданных см. На этом сайте: Shoutcast Metadata Protocol

Чтобы играть в потоки ogg, вам нужно использовать библиотеку FFmpeg с открытым исходным кодом. Эта библиотека может быть скомпилирована для платформы iOS и используется для подключения и декодирования потоков ogg.

+0

спасибо за ответ, я попробую с разбором в ближайшее время – Aft3rmath

3

Чтобы воспроизвести звуковой поток, отформатированный в формате ogg, вам необходимо установить кодек. IOS не имеет встроенной поддержки формата Ogg

+0

Я получил его ~ 3 месяца назад;] – Aft3rmath

2

Я думаю, что первое, что нужно сделать, это «порядок» мета-данные, установив заголовок запроса:

CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Icy-MetaData"), CFSTR("1")); 

В моем случае я добавил эту строку Аудиокассеты Мэтта Галагерса. В результате я смог услышать метаданные, когда поток играл, потому что он содержался в данных потока. Следующим шагом было отфильтровать метаданные и интерпретировать их. Для этого уже упоминается вся необходимая информация.

Удачи вам!