Потоковое 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... ошибок. Я был бы признателен за любую информацию об этом, спасибо!
Ответы
Ответ 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