Diffusion video iOS et stockage sur l'appareil par la suite

Jusqu'à présent, je sais comment diffuser une video et comment la download et ensuite la diffuser, mais voici la partie délicate: la diffuser une fois, la stocker sur l'appareil et la lire à partir de l'appareil à l'avenir.

Est-ce possible?

Pas tout à fait sûr ici comment vous obtenez votre stream, mais regardez AVAssetWriter, AVAssetWriterInput et AVAssetWriterPixelBufferAdaptor et dès que vous recevez des données, vous devriez être en mesure d'append datatables à l'adaptateur de tampon de pixel en utilisant:

appendPixelBuffer:withPresentationTime: 

pas sûr que cela fonctionnera pour vous mais avec un peu de bidouillage, vous devriez être en mesure d'adapter votre input pour correspondre à cette méthode. Il y a beaucoup de code d'exemple pour configurer l'auteur

C'est assez facile de sauvegarder la video. Faites quelque chose de similaire à ceci:

 //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]; //Resortingeving 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 } 

La seule chose que vous devez vraiment changer est * MovieObject *, une fois dans chaque étape.

Je sais ce que vous voulez accomplir, j'ai seulement une solution de contournement. J'ai dû appliquer le même comportement et j'ai fini par diffuser la video depuis le server et la download à côté du streaming. La prochaine fois que l'user essaie de diffuser la video, déterminez s'il a été téléchargé sur le disque, sinon diffusez-le à nouveau. Dans un cas normal, la video a été téléchargée correctement et pourrait être revue hors ligne.

 BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath]; 

et

fileURLWithPath: isDirectory:

Initialise et renvoie un object NSURL nouvellement créé en tant qu'URL de file avec un path spécifié.

 + (id)fileURLWithPath:(NSSsortingng *)path isDirectory:(BOOL)isDir 

Paramètres

path

Le path que l'object NSURL représentera. path doit être un path système valide. Si path commence par un tilde, il doit d'abord être développé avec ssortingngByExpandingTildeInPath. Si path est un path relatif, il est considéré comme relatif au directory de travail courant. Passer nil pour ce paramètre produit une exception.

isDir

Valeur booleanne qui spécifie si le path est traité comme un path de directory lors de la résolution par rapport aux composants de path relatifs. Passez YES si le path indique un directory, NON sinon. Valeur de return Un object NSURL initialisé avec path.

Disponibilité

Disponible dans iOS 2.0 et versions ultérieures.

Vous ne pouvez pas le diffuser en continu et l'save en même time, en particulier avec les gros files video, car le document Apple indique que vous devez utiliser un stream de transport pour le streaming en direct HTTP.

ASIHttpRequest pourrait vous faciliter la vie.

 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDownloadDestinationPath:@"video.m4v"]; // use [NSBundle mainBundle] to find a better place 

De votre délégué, gérer ceci:

 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data; 

Faites en sorte que datatables transcodent avec les data fur data mesure que vous les obtenez et que vous les AVAssetWriter en time réel sur votre AVAssetWriter ou lecteur AVAssetWriter , peu importe ce que vous utilisez. Lorsque vous avez terminé, l'actif doit toujours être enregistré afin que vous puissiez l'get plus tard.