iOS онлайн радио потоковые вопросы - PullRequest
10 голосов
/ 23 марта 2012

Мне нужно создать приложение, которое обеспечивает потоковое радио онлайн (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 как

1-й Metadata = 'StreamTitle=',

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

Ответы [ 3 ]

4 голосов
/ 10 апреля 2012

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

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

Наиболее важным ключом метаданных является ключ icy-metaint.Это значение скажет вам, как часто метаданные отправляются в потоке.Для получения дополнительной информации о синтаксическом анализе этих метаданных посетите этот веб-сайт: Протокол метаданных Shoutcast

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

3 голосов
/ 11 июля 2012

Для воспроизведения аудиопотока в формате ogg вам потребуется кодек. iOS не имеет встроенной поддержки формата ogg

2 голосов
/ 15 марта 2013

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

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

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

Удачи!

...