J'utilise les codes suivants pour download la video sur le server, ce qui me request de convertir la video du format video en NSData
. Cependant, lorsque la video est volumineuse (par exemple video de 10 minutes), l'application se bloque en raison de la pression de la memory. Comment puis-je résoudre ça?
- (void)uploadVideo { NSDictionary *params = nil; NSSsortingng *NSURLSessionIdentifier = [NSSsortingng ssortingngWithFormat:@"%@%@",@"my.bundle.identifier.",[self getTimeSsortingng]]; NSURLSessionConfiguration *sessionConfig; // SessionConfiguration With iOS Version if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:NSURLSessionIdentifier]; } else { sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:NSURLSessionIdentifier]; } sessionConfig.HTTPMaximumConnectionsPerHost = 1; NSURLSession *uploadSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue new]]; OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new]; NSSsortingng *url = @"SOME_UPLOAD_URL"; // ========= PROBLEMATIC LINE below ========= self.video_data = [NSData dataWithContentsOfURL:self.video_url]; // ========= PROBLEMATIC LINE above ========= [multipartFormData addFile:self.video_data parameterName:@"file" filename:@"file.mp4" contentType:@"video/mp4"]; NSURLRequest *rq = [OMGHTTPURLRQ POST:url:multipartFormData]; id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] ssortingngByAppendingPathComponent:@"upload.NSData"]; [rq.HTTPBody writeToFile:path atomically:YES]; [[uploadSession uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume]; }
ps self.video_url
est une URL de file donnée par UIImagePickerController
qui filter uniquement la video à choisir. Je choisis ensuite une video de 10 minutes.
ps J'ai AFNetworking
dans la même application aussi, peut-il aider avec le transfert de fond?
Vous devriez être capable de cela en utilisant un NSMutableURLRequest et en utilisant son setter setHTTPBodyStream .
Ce qui suit sont des extraits adaptés de mon code. Il a bien géré la video pendant plus de 10 minutes. principalement de grandes videos de 60 à 90 minutes.
NSData *movieData = [NSData dataWithContentsOfFile:theMovieSourceSsortingng]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"video/quicktime" forHTTPHeaderField:@"Content-Type"]; [request setValue:[NSSsortingng ssortingngWithFormat:@"attachment; filename=\"%@\"",yourMovieSourceSsortingng] forHTTPHeaderField:@"Content-Disposition"]; [request setValue:[NSSsortingng ssortingngWithFormat:@"%ld",(unsigned long)[movieData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBodyStream:[NSInputStream inputStreamWithFileAtPath:yourMovieSourceSsortingng]];
Vous pouvez maintenant utiliser cette requête avec votre NSURLConnection
NSURLConnection *connection =[[NSURLConnection alloc] initWithRequest:request delegate:self];
Problème est évident – 10 min file video est trop grand pour être stocké dans une memory
self.video_data = [NSData dataWithContentsOfURL:self.video_url];
Est-ce que.
La solution n'est pas de stocker tout le corps de la requête dans une memory. Le moyen le plus simple consiste à utiliser la propriété HTTPBodyStream de NSURLRequest . Vous pouvez créer vous-même NSInputStream, mais puisque vous avez déjà AFNetworking, il est beaucoup plus facile de l'utiliser. Dans mon projet, je le fais de cette façon:
// data.fields is a dictionary with params NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLSsortingng:[url absoluteSsortingng] parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [data.fields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [formData appendPartWithFormData:[obj dataUsingEncoding:NSUTF8SsortingngEncoding] name:key]; }]; [formData appendPartWithFileURL:fileURL name:@"file_0" error:&error2]; } error:&error];