Потоковое аудио с сервера на iPhone - PullRequest
17 голосов
/ 21 декабря 2008

Я хочу передать некоторые аудиофайлы, которые хранятся на моем сервере, в приложение для iPhone-клиента, которое я пишу. Некоторые аудиофайлы могут быть довольно большими по размеру даже после сжатия. Мой вопрос заключается в том, существует ли инфраструктура Какао, которая помогает мне буферизовать звук, чтобы он стал доступен пользователю, в то время как все остальное выводится из строя? Если нет, то может ли кто-нибудь указать мне правильное направление, чтобы узнать больше о технологиях, необходимых для того, чтобы подобное происходило с использованием Objective-C / Cocoa?

Идеальный ресурс для буферизации и сжатия аудио из серверной <-> клиентской инфраструктуры был бы идеальным.

Ответы [ 5 ]

24 голосов
/ 22 декабря 2008

Брэд упомянул пост, который я написал для потоковой передачи аудио через HTTP. Вот что было: Потоковое воспроизведение и воспроизведение MP3 . Я не хочу быть человеком, который ссылается на его собственный блог, но он как бы отвечает на ваш вопрос.

Что касается сложности решения проблемы, вы заметите, что я сделал 4 обновления для этого поста (намного больше, чем для всего остального), исправляя ошибки потоков, утечки памяти и проблемы сетевой буферизации. , Есть много, чтобы получить точно правильно.

5 голосов
/ 07 января 2012

MPMoviePlayerController может воспроизводить аудиофайлы. Если вы инициализируете объект с помощью URL-адреса содержимого (например, это может быть файл Mp3 на сервере), он будет воспроизводить файл и воспроизводить его.

Инициализация выглядит так:

NSURL *theURL = [NSURL urlWithString:@"http://yourdomain.com/yourmediafile.mp3"];

MPMoviePlayerController* yourPlayerController = [[MPMoviePlayerController alloc] initWithContentURL:theURL];

Оттуда вы можете открыть окно воспроизведения, в котором будет отображаться ползунок для очистки содержимого и заполнить ползунок в качестве буфера содержимого.

[yourPlayerController shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight];
[self presentMoviePlayerViewControllerAnimated:yourPlayerController];

Или вы можете просто заставить его играть и создать свой собственный интерфейс:

[yourPlayerController.moviePlayer play];

Этот метод воспроизведения отключит звук при блокировке экрана, если вы не скажете приложению запускаться в фоновом режиме в файле info.plist.

2 голосов
/ 08 ноября 2012

Теперь я знаю, что вы, надеюсь, решили свою проблему. Но только в случае. Если вам нужно простое решение, вы всегда можете получить встроенный код или любую другую ссылку и сделать из него html-файл. Как

<html>
<body>
<script type="text/javascript">
  var embedBaseUrl = 'http://www.tv.net/';
  var embedChannelId = 13;
  var embedSize = [300,250];
  var embedAutoplay = true;
</script>
<script type="text/javascript"src="http://www.tv.net/assets/js/embed.js"></script>
</body>
</HTML>

ViewController.h

@interface ViewController : UIViewController {

NSString *videoURL;

}

@property (nonatomic, strong) NSString *videoURL;

    (IBAction) tv;

А в ViewController.m

@synthesize videoURL;

    (IBAction) tv {

    self.videoURL = @"http://dl.dropbox.com/x/xxxxxxxx/HTML/tv.html";

    VideoViewController *videoViewController = [[VideoViewController alloc] initWithNibName:nil bundle:nil];

    videoViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; videoViewController.videoURL = self.videoURL;

    [self presentViewController:videoViewController animated:YES completion:nil]; }

А потом в VideoViewController.h

IBOutlet UIWebView *videoView;

NSString *videoURL; NSString *videoHTML;

}

@property(nonatomic, retain) IBOutlet UIWebView *videoView; @property(nonatomic, retain) NSString *videoURL; @property(nonatomic, retain) NSString *videoHTML;

    (void) embedTV;

VideoViewController.m

@synthesize videoView, videoURL, videoHTML;

    (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; }

    (void)embedTV {

    videoHTML = [NSString stringWithFormat:@"\ \ \ \ iframe {position:absolute; top:50%%; margin-top:-130px;}\ body {background-color:#000; margin:0;}\ \ \ \ \ \ ", videoURL];

    [videoView loadHTMLString:videoHTML baseURL:nil]; }
        (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib.

    videoView.backgroundColor = [UIColor blackColor]; videoView.opaque = NO;

    [self embedTV]; }

Теперь в моем примере я ссылался на видеопоток, но вы понимаете, вы можете транслировать или воспроизводить то, что хотите. Просто используйте UIWebView.

2 голосов
/ 22 декабря 2008

К сожалению, перед вами будет немного работы. Я должен был сделать это для проекта iPhone этим летом. Большая часть того, что вам нужно, находится в Audio Queue Services во фреймворке AudioToolbox.

Работать со службами аудио-очереди довольно сложно, вам придется реализовать несколько обратных вызовов, чтобы сообщить, как обрабатывать ваши пакеты после их выхода из сети.

Кто-то, я думаю, что Мэтт Галлагар, имел некоторый пример кода в блоге, который был в порядке, и есть куча материала в Core Audio Mailing List.

Я обнаружил, что в итоге мне не нужно было ретранслировать соединение NSURL для выполнения сетевой части, потому что мой метод делегата didrecieveataata запускался недостаточно часто.

Извините, я не мог просто добавить несколько строк кода в качестве примера, но класс, который я написал для этого, занял около 400 строк.

1 голос
/ 21 декабря 2011

Вы можете использовать класс AVPlayer из инфраструктуры AVFoundation для потоковой передачи аудио из локальных файлов или с удаленного сервера. Класс AVPlayer уведомит вас о готовности к игре или о необходимости буферизовать больше данных.

Однако, если вы хотите больше контроля, вам определенно следует воспользоваться услугами Audio Queue . Использовать сервисы Audio Queue немного сложнее, но как только вы освоите его, вы сможете точно настроить процесс воспроизведения аудио так, как вам хочется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...