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

Потоковое аудио с сервера на iPhone

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

Идеальный ресурс по буферизации и сжатию звука из клиентской инфраструктуры сервера ↔ идеален.

4b9b3361

Ответ 1

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

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

Ответ 2

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.

Ответ 3

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

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

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

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

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

Ответ 4

Я уже знаю, что вы, надеюсь, решили вашу проблему. Но просто расстройтесь. Если вы хотите прямое решение, вы всегда можете получить внедренный код или любую другую ссылку и сделать из него 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.

Ответ 5

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

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