Подтвердить что ты не робот

Потоковое mp3-аудио с AVPlayer

Я слышал некоторые противоречивые сообщения об этом. То, что я пытаюсь сделать, - это поток mp3 файла с URL-адреса. Я провел много исследований, но я не могу найти никаких хороших руководств о том, как это сделать, или даже того, какой аудиоплеер я должен использовать.

Некоторые друзья говорят мне, что AVPlayer может проигрывать mp3, но документация Apple говорит, что это невозможно. Я вылил аудио стример Мэтта Галлахера (http://www.cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html), но этот код был сделан очень давно, и Я достаточно доволен этим, что трудно работать через автореализаторы и сохраняет и все такое.

Звук, который я пытаюсь передать, - довольно большой mp3 файл с сервера libsyn с URL-адресом формата.

http://traffic.libsyn.com/podcastname/episode.mp3

Все, что мне нужно сделать, это захватить его и начать играть, с возможностью паузы и очистки. Итак, первое, во-первых, CAN AVPlayer stream mp3? И если да, есть ли у кого-нибудь какие-нибудь руководства или код, на которые они могут указать? И если нет, есть ли какой-либо класс аудиопроигрывателя, который может передавать аудио?

Я попытался создать AVPlayerItem, инициализированный URL-адресом, а затем добавив его в AVPlayer, но я получаю тонну Error Loading... и Symbol Not Found... ошибок. Я был бы признателен за любую информацию об этом, спасибо!

4b9b3361

Ответ 1

попробуйте это

 -(void)playselectedsong{

        AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
        self.songPlayer = player;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[songPlayer currentItem]];
        [self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];



    }
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

        if (object == songPlayer && [keyPath isEqualToString:@"status"]) {
            if (songPlayer.status == AVPlayerStatusFailed) {
                NSLog(@"AVPlayer Failed");

            } else if (songPlayer.status == AVPlayerStatusReadyToPlay) {
                NSLog(@"AVPlayerStatusReadyToPlay");
                [self.songPlayer play];


            } else if (songPlayer.status == AVPlayerItemStatusUnknown) {
                NSLog(@"AVPlayer Unknown");

            }
        }
    }

    - (void)playerItemDidReachEnd:(NSNotification *)notification {

     //  code here to play next sound file

    }

Ответ 2

Вы также можете попробовать мою библиотеку Audjustable с открытым исходным кодом, которая поддерживает потоковое HTTP-потоки. Он основан на Matt AudioStreamer, но был оптимизирован и оптимизирован для поддержки нескольких источников данных (без HTTP) и безщелезного воспроизведения.

https://github.com/tumtumtum/audjustable.

Ответ 3

В дополнение к ответу Sumit Mundra, который мне очень помог, я обнаружил, что этот метод фактически не передает файлы MP3 с удаленного сервера. Когда я это осуществил, файл загружался синхронно, блокируя мой интерфейс, прежде чем играть. Способ правильного потока MP3, который я нашел, работал очень хорошо, это указать на файл M3U. Это всего лишь текстовый файл с расширением .m3u, который содержит ссылку на оригинальный MP3. Вместо этого укажите код Sumit в этом файле, и у вас есть поток, который сразу начнет воспроизводиться.

Это место, где я нашел эту информацию: http://www.soundabout.net/streammp3.htm

Ответ 4

Matt Gallagher AudioStreamer обновлен 2 месяца назад https://github.com/mattgallagher/AudioStreamer/commits/master

Но за то, что вы ищете, посмотрите пример кода StichedStreamPlayer http://developer.apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010092

Он использует объект AVPlayer, и если вы посмотрите на метод - (IBAction) loadMovieButtonPressed: (id) отправитель, вы сможете следить за тем, как он устанавливает объект AVPlayer.

Ответ 5

Аарон пост об использовании файла m3u вместо mp3 работал для меня. Я также обнаружил, что AVPlayer требователен к синтаксису m3u. Например, когда я попробовал следующее, мне не удалось получить действительную продолжительность (она всегда была неопределенной), и относительные пути не работали:

#EXTM3U
#EXTINF:71
https://test-domain.com/90c9a240-51b3-11e9-bb69-c1300ce2348f.mp3

Однако после обновления файла m3u до следующего, обе проблемы были решены:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:70
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:70.000,
8577d650-51b3-11e9-8e69-4f2b085e94aa.mp3
#EXT-X-ENDLIST