2014-02-12 19 views
5

Ich arbeite an einem Projekt, bei dem ich ein großes Video auf einen Server hochladen muss. Ich habe versucht, das Video in einer Variablen zu halten. Ich mache es gerade mit dem folgenden Code.Wie lade ich ein großes Video in iOS hoch?

NSData *data=[NSData dataWithContentsOfFile:self.path]; 

Es funktioniert auf kleinen Video. Aber meine App stürzt ab, wenn das Video die Größe 200-500 MB überschreitet. Ich habe Video in einer Variablen gehalten, um Upload-Funktionalität zu verschiedenen Social-Networking-Sites und Dropbox bereitzustellen.

Die Nachricht, die ich bekomme, ist wegen Speicherfehler beendet.

Bitte um Rat. Wie kann ich das erreichen?

Herausgegeben

ich ein Video in NSData zu halten, weil ich das Video in verschiedenen Social-Networking-Sites wie Facebook, Dropbox, Google Drive usw. durch dort API hochladen müssen. Dort verwendet APIs NSData zum Speichern der Binärdaten des Videos. Also glaube ich, dass ich AFNetworking, NSInput Stream oder irgendeinen anderen Mechanismus hier nicht verwenden kann.

+0

diesen Link einmal beziehen. es kann hilfreich sein .. http://stackoverflow.com/questions/18348863/ios-how-to-upload-a-large-asset-file-into-sever-by-streaming – gajchtr

Antwort

0

Sie können und wollen nicht Hunderte von MBs im Speicher halten. Dies ist nicht die Art, ein Video hochzuladen. Als erstes empfehle ich Ihnen, die Videoaufzeichnungsparameter so zu konfigurieren, dass die resultierende Datei kleiner ist, selbst wenn die Qualität des Videos niedriger ist. Ihre Benutzer möchten keine 2-500 MB hochladen. Aber selbst dann wird die resultierende Datei zu groß sein, um sie "aus dem Speicher" zu laden. Sie sollten stattdessen einen Bruchteil davon lesen, sagen Sie 100kByte, laden Sie es auf den Server, lesen Sie das nächste Teil, laden Sie es, etc.

Glücklicherweise gibt es fertige Lösungen dafür. Wenn Sie nur iOS 7 unterstützen müssen, überprüfen Sie NSURLSessionUploadTask. Wenn Sie auch ältere Versionen unterstützen müssen, ist der einfachste Weg, AFNetworking zu verwenden. Check out „Multi-Part Request“ auf dieser Seite: http://cocoadocs.org/docsets/AFNetworking/2.1.0/

2

Werfen Sie einen Blick auf NSInputStream und stellen Sie die HTTPBodyStream ein NSMutableURLRequest zu dem Eingangsstrom des Videos - dies wird greifen, welche Daten von der Festplatte benötigt und laden Sie sie .

z.B. Wenn Sie haben AFNetworking könnten Sie etwas Ähnliches wie die folgenden tun:

NSMutableURLRequest *request = [afNetworkingHTTPClient requestWithMethod:@"POST" path:@"endpoint/path" parameters:nil]; 
request.HTTPBodyStream = [[NSInputStream alloc] initWithFileAtPath:@"path/to/your/file"]; 

//... Configure your request here 

AFHTTPRequestOperation *HTTPOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 


//... Set the success/failure blocks on the operation to check its state 

[afNetworkingHTTPClient enqueueHTTPRequestOperation:HTTPOperation]; 

Verbindungen

Verwandte Themen