2009-06-30 2 views
7

Можно ли загружать видео на сервер? Я знаю, что изображения возможны. Если кто-то может просто указать мне в правильном направлении, это было бы потрясающе.Загрузка видео с iPhone

Благодаря

+0

вы хотите UPLO рекламное видео, сделанное новым iPhone 3GS или видео, хранящимся локально на устройстве? Помните, что нет способа получить доступ к глобальной файловой системе iPhone, поэтому последний вариант невозможен. – zpesk

ответ

2

Посмотрите на UIImagePickerController. Начиная с версии 3.0 вы можете разрешить съемку видео или выбрать существующее видео. Согласно документации вы ограничены 10мин максимум на фильм, хотя:

http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html

+0

Прохладный! спасибо alot – 2009-07-16 15:44:55

17

Edited Августом 2015

Этот ответ в настоящее время серьезно устарели. На момент написания статьи было не так много вариантов, и видео были относительно небольшими по размеру. Если вы сейчас это делаете, я бы использовал AFNetworking, что делает это намного проще. Он будет передавать загрузку из файла, а не содержать все в памяти, а также поддерживает новую задачу загрузки Apple.

Docs здесь: https://github.com/AFNetworking/AFNetworking#creating-an-upload-task

-

Да, это возможно, и это, как я пошел об этом.

Внедрите следующую функцию, которая запускается при завершении сборки носителя.

- (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]; 

    } 

для функции пост я имел что-то вроде этого, которое я получил откуда-то еще (извините я не знаю, где я его нашел):

- (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"); 
    } 

} 

выше фрагмент кода создает запрос HTTP POST и передает Это. Вам нужно будет изменить его, если вы хотите порядочную обработку ошибок, и подумайте о том, чтобы использовать библиотеку, которая позволяет загружать async (theres one on github)

Также обратите внимание на порт: 3000 на URL-адресе сервера, я нашел его легким для тестирования ошибок чтобы запустить сервер рельсов на его умолчанию порта 3000 в режиме разработки, так что я мог видеть параметры запроса для отладки

Надеется, что это помогает

+0

Прохладный, я попробую это из-за чувака – 2009-08-10 04:36:30

+0

Нет Probs. Следует отметить, что текущий SDK, похоже, не дает вам доступ к полноразмерному видео, поскольку он будет синхронизироваться с iTunes. Мои тесты показали максимальный размер видеоизображения 480x360. Если вы можете найти работу, пожалуйста, сообщите нам об этом. спасибо – ADAM

+0

Не хватает ли мусора? – jocull

0
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]); 
+1

Вы можете отправить видеофайл, захваченный контроллером uiimagepicker, используя этот код. И вы должны захватить платформу assihttprequest из github – chinni

3

с iOS8 нет необходимости использовать 3-библиотеки и вы может потоковое видео непосредственно из файла, который решает c rucial OUT OF MEMORY ERROR при попытке загрузить больше видео при загрузке их из файла:

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

iOS7 также предлагает большой NSURLSeession/NSURLSessionUploadTask комбо решение, которое позволит не только нам, Вы поток непосредственно из файла, но также может делегировать задачу процессу iOS, что позволит завершить загрузку, даже когда ваше приложение закрыто. Это требует немного больше кодирования, и у меня нет времени писать все здесь (вы можете его использовать в Google).

Вот наиболее важные части:

  1. Confugure аудио сессии в фоновом режиме поддержки:

    - (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; 
    

    }

  2. Загрузить метод задачи:

    - (NSURLSessionUploadTask *) uploadTaskForFilePath: (NSString *) Filepath сессия: (NSURLSession *) сессия {

    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; 
    

    }

  3. Загрузить функции:

    [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]; 
         } 
    
    }]; 
    
  4. Фоновая сессия требует UIApplecation делегат (AppDelegate обратного вызова внедрено:

    • (аннулируются) применение: (UIApplication *) применение handleEventsForBackgroundURLSession: (NSString *) Идентификатор completionHandler: (аннулируются (^)()) completionHandler {

      NSLog(@"Background URL session needs events handled: %@", identifier); 
      completionHandler(); 
      

      }

Смежные вопросы