Est-il possible de télécharger de la vidéo sur un serveur? Je sais que les images sont possibles. Si quelqu'un peut simplement me diriger dans la bonne direction, ce serait génial.Téléchargement de vidéo avec l'iPhone
Merci
Est-il possible de télécharger de la vidéo sur un serveur? Je sais que les images sont possibles. Si quelqu'un peut simplement me diriger dans la bonne direction, ce serait génial.Téléchargement de vidéo avec l'iPhone
Merci
Jetez un oeil à la UIImagePickerController. À partir de la version 3.0, vous pouvez choisir de filmer une vidéo ou de choisir une vidéo existante. D'après les documents que vous êtes limité à 10 minutes maximum sur le film si:
Cool! merci beaucoup –
Modifié août 2015
Cette réponse est maintenant sérieusement à jour. Au moment de la rédaction, il n'y avait pas beaucoup d'options et les vidéos étaient relativement petites. Si vous envisagez de le faire maintenant, j'utiliserais AFNetworking
ce qui rend ceci beaucoup plus simple. Il va diffuser le téléchargement à partir du fichier plutôt que de le garder tout en mémoire, et prend également en charge la nouvelle tâche de téléchargement d'arrière-plan Apple.
Docs ici: https://github.com/AFNetworking/AFNetworking#creating-an-upload-task
-
Oui cela est possible et voici comment je suis allé à ce sujet.
Exécutez la fonction suivante qui s'exécute lorsque le sélecteur de support est terminé.
- (NSData *)generatePostDataForData:(NSData *)uploadData
{
// Generate the post header:
NSString *post = [NSString stringWithCString:"--AaB03x\r\nContent-Disposition: form-data; name=\"upload[file]\"; filename=\"somefile\"\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n\r\n" encoding:NSASCIIStringEncoding];
// Get the post header int ASCII format:
NSData *postHeaderData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
// Generate the mutable data variable:
NSMutableData *postData = [[NSMutableData alloc] initWithLength:[postHeaderData length] ];
[postData setData:postHeaderData];
// Add the image:
[postData appendData: uploadData];
// Add the closing boundry:
[postData appendData: [@"\r\n--AaB03x--" dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]];
// Return the post data:
return postData;
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//assign the mediatype to a string
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
//check the media type string so we can determine if its a video
if ([mediaType isEqualToString:@"public.movie"]){
NSLog(@"got a movie");
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
NSData *webData = [NSData dataWithContentsOfURL:videoURL];
[self post:webData];
[webData release];
}
pour la fonction post-je eu quelque chose comme ça que je me suis d'ailleurs (désolé, je ne sais pas où je l'ai trouvé):
- (void)post:(NSData *)fileData
{
NSLog(@"POSTING");
// Generate the postdata:
NSData *postData = [self generatePostDataForData: fileData];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
// Setup the request:
NSMutableURLRequest *uploadRequest = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.example.com:3000/"] cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 30 ] autorelease];
[uploadRequest setHTTPMethod:@"POST"];
[uploadRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
[uploadRequest setValue:@"multipart/form-data; boundary=AaB03x" forHTTPHeaderField:@"Content-Type"];
[uploadRequest setHTTPBody:postData];
// Execute the reqest:
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:uploadRequest delegate:self];
if (conn)
{
// Connection succeeded (even if a 404 or other non-200 range was returned).
NSLog(@"sucess");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Got Server Response" message:@"Success" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
}
else
{
// Connection failed (cannot reach server).
NSLog(@"fail");
}
}
L'extrait ci-dessus construit la demande post http et soumet il. Vous devrez le modifier si vous voulez une gestion correcte des erreurs et envisager d'utiliser une bibliothèque qui permet le téléchargement asynchrone (il y en a un sur github)
Notez également le port: 3000 sur l'url du serveur ci-dessus, j'ai trouvé facile de tester les bogues pour démarrer un serveur de rails sur son port par défaut 3000 en mode développement afin que je puisse voir les paramètres de la requête aux fins de débogage
Hope this helps
Cool, je vais essayer cela merci mec –
No Probs. Une chose à noter est le SDK actuel ne semble pas vous donner accès à la vidéo pleine résolution car il serait synchronisé avec iTunes. Mes tests ont montré une taille de vidéo maximale de 480x360. Si vous pouvez trouver un travail s'il vous plaît laissez-nous savoir. merci – ADAM
Est-ce raté garbage collection? – jocull
NSURL *urlvideo = [info objectForKey:UIImagePickerControllerMediaURL];
NSString *urlString=[urlvideo path];
NSLog(@"urlString=%@",urlString);
NSString *str = [NSString stringWithFormat:@"you url of server"];
NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setFile:urlString forKey:@"key foruploadingFile"];
[request setRequestMethod:@"POST"];
[request setDelegate:self];
[request startSynchronous];
NSLog(@"responseStatusCode %i",[request responseStatusCode]);
NSLog(@"responseStatusCode %@",[request responseString]);
Vous pouvez envoyer un fichier vidéo capturé par le contrôleur uiimagepicker en utilisant ce code.et vous devez saisir le cadre assihttprequest de github – chinni
Depuis iOS8 il n'y a pas besoin d'utiliser les bibliothèques 3ème partie et vous peut flux vidéo directement à partir du fichier qui résout c rucial DE ERREUR MEMOIRE lorsque vous essayez de télécharger plus grandes vidéos tout en les chargeant à partir du fichier:
// If video was returned by UIImagePicker ...
NSURL *videoUrl = [_videoDictionary objectForKey:UIImagePickerControllerMediaURL];
NSMutableURLRequest *request =[[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:VIDEO_UPLOAD_LINK]];
[request addValue:@"video" forHTTPHeaderField: @"Content-Type"];
[request setHTTPMethod:@"POST"];
NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:[videoUrl path]];
[request setHTTPBodyStream:inputStream];
self.uploadConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
iOS 7 offre également une grande NSURLSeession/NSURLSessionUploadTask solution combo qui laisse non seulement de vous diffusez directement à partir du fichier, mais peut également déléguer une tâche au processus iOS, ce qui permettra au téléchargement de se terminer même lorsque votre application est fermée. Il nécessite un peu plus de codage et je n'ai pas le temps de tout écrire ici (vous pouvez le google).
Voici les parties les plus importantes:
Confugure session audio à l'appui de fond:
- (NSURLSession *) urlSession {
if (!_urlSession) {
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
NSString *bundleId = infoDict[@"CFBundleIdentifier"];
NSString *label = [NSString stringWithFormat:@"ATLoggerUploadManager_%@", bundleId];
NSURLSessionConfiguration *conf = (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) ? [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:label] : [NSURLSessionConfiguration backgroundSessionConfiguration:label];
conf.allowsCellularAccess = NO;
_urlSession = [NSURLSession sessionWithConfiguration:conf delegate:self delegateQueue:self.urlSessionQueue];
_urlSession.sessionDescription = @"Upload log files";
}
return _urlSession;
}
Télécharger méthode de tâche:
- (NSURLSessionUploadTask *) uploadTaskForFilePath: (NSString *) Séance de filePath: (NSURLSession *) Séance {
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
// Consruct request:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"POST"];
NSString *finalUrlString = [self.uploadURL absoluteString];
if (self.uploadUserId) {
[request setValue:self.uploadUserId forHTTPHeaderField:@"X-User-Id"];
finalUrlString = [finalUrlString stringByAppendingFormat:@"?id=%@", self.uploadUserId];
}
[request setURL:[NSURL URLWithString:finalUrlString]];
/*
It looks like this (it only works if you quote the filename):
Content-Disposition: attachment; filename="fname.ext"
*/
NSString *cdh = [NSString stringWithFormat:@"attachment; filename=\"%@\"", [filePath lastPathComponent]];
[request setValue:cdh forHTTPHeaderField:@"Content-Disposition"];
error = nil;
unsigned long fileSize = [[fm attributesOfItemAtPath:filePath error:&error] fileSize];
if (!error) {
NSString *sizeInBytesAsString = [NSString stringWithFormat:@"%lu", fileSize];
[request setValue:sizeInBytesAsString forHTTPHeaderField:@"X-Content-Length"];
}
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:fileUrl];
uploadTask.taskDescription = filePath;
return uploadTask;
}
Fonction de téléchargement:
[self.urlSession getTasksWithCompletionHandler:^(NSArray * dataTasks, NSArray * uploadTasks, NSArray * downloadTasks) {
NSMutableDictionary *tasks = [NSMutableDictionary new];
int resumed_running_count = 0;
int resumed_not_running_count = 0;
int new_count = 0;
// 1/2. Resume scheduled tasks:
for(NSURLSessionUploadTask *task in uploadTasks) {
//MILogInfo(@"Restored upload task %zu for %@", (unsigned long)task.taskIdentifier, task.originalRequest.URL);
if (task.taskDescription) {
[tasks setObject:task forKey:task.taskDescription];
}
BOOL isRunning = (task.state == NSURLSessionTaskStateRunning);
if (!isRunning) {
resumed_not_running_count++;
}else{
resumed_running_count++;
}
[task resume];
}
// 2/2. Add tasks/files not scheduled yet:
NSString *uploadFilePath = nil;
// already uploading:
if (![tasks valueForKey:uploadFilePath]) {
NSURLSessionUploadTask *uploadTask = [self uploadTaskForFilePath:uploadFilePath session:_urlSession];
new_count++;
[uploadTask resume];
}
}];
session de fond exige délégué UIApplecation (rappel AppDelegate mis en œuvre:
(void) demande: (UIApplication *) Application handleEventsForBackgroundURLSession: (NSString *) Identifiant completionHandler: (void (^)()) completionHandler {
NSLog(@"Background URL session needs events handled: %@", identifier);
completionHandler();
}
vous souhaitez Uplo Annonce vidéo prise par le nouvel iPhone 3GS ou vidéo stockée localement sur l'appareil ?? Rappelez-vous qu'il n'y a aucun moyen d'accéder au système de fichiers global de l'iPhone, donc la dernière option n'est pas réalisable. – zpesk