iphone - lleno - Transmisión y almacenamiento de video en iOS luego del dispositivo
itunes (5)
Hasta ahora, sé cómo transmitir un video y cómo descargarlo y luego transmitirlo, pero aquí está el truco: transmitirlo una vez, almacenarlo en el dispositivo y en el futuro reproducirlo desde el dispositivo.
¿Es eso posible?
Es bastante fácil guardar el video. Haz algo similar a esto:
//Saving Movie
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:*MovieObject* forKey:@"MovieObjectDataKey"];
[archiver finishEncoding];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"MovieObjectDefaultsDataKey"];
[archiver release];
[data release];
//Retrieving movie
NSData *savedMovieData = [[NSUserDefaults standardUserDefaults] objectForKey:@"MovieObjectDefaultsDataKey"];
if (savedMovieData != nil) {
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:savedMovieData];
*MovieObject* = [[unarchiver decodeObjectForKey:@"MovieObjectDataKey"] retain];
[unarchiver finishDecoding];
[savedMovieData release];
[unarchiver release];
} else {
//Download Stream of Your Movie
}
Lo único que realmente tienes que cambiar es * MovieObject *, una vez en cada paso.
No estoy seguro de cómo obtener su transmisión, pero busque en AVAssetWriter, AVAssetWriterInput y AVAssetWriterPixelBufferAdaptor y, tan pronto como reciba los datos, podrá adjuntar los datos al adaptador de almacenamiento de píxeles utilizando:
appendPixelBuffer:withPresentationTime:
No estoy seguro de que funcionará para ti, pero con algunos problemas deberías poder adaptar tu entrada para que coincida con este método. Hay un montón de código de ejemplo para configurar el escritor
Sé lo que quieres lograr, solo tengo una solución. Tuve que implementar el mismo comportamiento y terminé transmitiendo el video desde el servidor y descargándolo junto a la transmisión. La próxima vez que el usuario intente transmitir el video, determine si se descargó en el disco; de lo contrario, vuelva a transmitirlo. En un caso normal, el video se descargó correctamente y se pudo revisar sin conexión.
ASIHttpRequest puede hacer tu vida más fácil.
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"video.m4v"]; // use [NSBundle mainBundle] to find a better place
Desde tu delegado, maneja esto:
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
Realice cualquier transcodificación de data
con los data
medida que los obtiene y empújelos a su AVAssetWriter
o reproductor de películas en tiempo real, sin importar lo que esté usando. Cuando haya terminado, el activo aún debe guardarse para que pueda obtenerlo más tarde.
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];
y
fileURLWithPath: isDirectory:
Inicializa y devuelve un objeto NSURL recién creado como una URL de archivo con una ruta especificada.
+ (id)fileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
Parámetros
camino
La ruta que representará el objeto NSURL. La ruta debe ser una ruta válida del sistema. Si la ruta comienza con una tilde, primero debe expandirse con stringByExpandingTildeInPath. Si la ruta es una ruta relativa, se trata como relativa al directorio de trabajo actual. Pasar nil para este parámetro produce una excepción.
isDir
Un valor booleano que especifica si la ruta se trata como una ruta de directorio cuando se resuelve con componentes de ruta relativa. Pase SÍ si la ruta indica un directorio, NO de lo contrario. Valor de retorno Un objeto NSURL inicializado con ruta.
Disponibilidad
Disponible en iOS 2.0 y versiones posteriores.
No puede transmitirlo y guardarlo al mismo tiempo, especialmente con archivos de video grandes, ya que el documento de Apple dice que debe usar un flujo de transporte para transmisión HTTP en vivo.