lanzamiento - ios 12 iphone 7
TransmisiĆ³n de audio desde el servidor al iPhone (5)
Estoy buscando transmitir algunos archivos de audio que tengo en mi servidor a una aplicación cliente de iPhone que estoy escribiendo. Algunos de los archivos de audio pueden ser bastante grandes, incluso después de la compresión. Mi pregunta es, ¿existe un marco Cocoa que me ayude a almacenar el audio de modo que esté disponible para el usuario mientras el resto se baja por las tuberías? Si no es así, ¿alguien puede orientarme en la dirección correcta para obtener más información sobre las tecnologías necesarias para que esto suceda con Objective-C / Cocoa?
Un recurso definitivo sobre el almacenamiento en búfer y la compresión de audio desde una infraestructura de cliente del servidor <-> sería ideal.
Brad mencionó una publicación que escribí para transmitir audio a través de HTTP. Ese fue este: Transmitir y reproducir un MP3 . No me refiero a ser la persona que se vincula a su propio blog, pero sí trata su pregunta.
Con respecto a lo difícil que es resolver el problema, notarás que he hecho 4 actualizaciones a esa publicación (mucho más de lo que he hecho para cualquier otra cosa), solucionando errores de subprocesos, pérdidas de memoria y problemas de búfer de red. Hay mucho para ser exactamente correcto.
Desafortunadamente, vas a tener un poco de trabajo frente a ti. Tuve que hacer esto para un proyecto de iPhone este verano pasado. La mayoría de lo que necesita es en Audio Queue Services en el framwork de AudioToolbox.
Trabajar con los servicios de cola de audio es un poco complicado, tendrás que implementar una serie de devoluciones de llamadas para indicarle cómo procesar tus paquetes después de que salgan de la red.
Alguien, creo que Matt Gallagar, tenía un código de muestra en un blog que estaba bien, y hay un montón de cosas en la lista de correo de Core Audio de Apple.
Descubrí que terminé necesitando no retransmitir en NSURL Connection para hacer la parte de la red, porque mi método delegado didrecievedata no se activaba con la frecuencia suficiente.
Lamento no poder incluir unas pocas líneas de código como ejemplo aquí, pero la clase que escribí para hacer esto entró en alrededor de 400 líneas.
Puede usar la clase AVPlayer desde el marco AVFoundation para transmitir audio desde archivos locales o desde un servidor remoto. La clase AVPlayer le notificará sobre la preparación para jugar o sobre la necesidad de almacenar más datos.
Sin embargo, si desea más control, definitivamente debe usar los servicios de Audio Queue . El uso de los servicios de Audio Queue es un poco más difícil, pero una vez que lo domine, podrá ajustar el proceso de reproducción de audio de la manera que desee.
MPMoviePlayerController puede reproducir archivos de audio. Si inicializas el objeto con una URL de contenido (esto puede ser un archivo Mp3 en un servidor, por ejemplo) se transmitirá el archivo y lo reproducirá.
La inicialización se ve así:
NSURL *theURL = [NSURL urlWithString:@"http://yourdomain.com/yourmediafile.mp3"];
MPMoviePlayerController* yourPlayerController = [[MPMoviePlayerController alloc] initWithContentURL:theURL];
Desde allí, puede abrir una vista de reproducción que mostrará un control deslizante para recorrer el contenido y rellenará la barra deslizadora a medida que el contenido se almacena en el búfer.
[yourPlayerController shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight];
[self presentMoviePlayerViewControllerAnimated:yourPlayerController];
O simplemente puedes hacerlo jugar y crear tu propia IU:
[yourPlayerController.moviePlayer play];
Este método de reproducción cortará el audio cuando la pantalla se bloquee a menos que le indique a la aplicación que se ejecute en segundo plano en el archivo info.plist.
Ahora sé que espero haber resuelto su problema. Pero solo por si acaso. Si desea una solución directa, siempre puede obtener el código embebido o cualquier otro enlace y crear un archivo html. Me gusta
<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;
Y en 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]; }
Y luego en 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]; }
Ahora, en mi ejemplo, me referí a la transmisión de video, pero entiendes el punto, puedes transmitir o reproducir lo que quieras. Simplemente usa UIWebView
.