Phasset + AfNetworking Hochladen mehrerer Videos

8

Momentan verwende ich den folgenden Code zum Hochladen von Videos:

%Vor%

GetAssetData-Methode

%Vor%

Das Problem bei diesem Ansatz besteht darin, dass eine App beim Laden großer / mehrerer Videodateien einfach keinen Speicherplatz mehr hat. Ich nehme an, es liegt an der NSDATA (aka filedata ) für das Hochladen einer Datei (siehe oben). Ich habe versucht, den Dateipfad mit Methode anzufordern appendPartWithFileURL intead von appendPartWithFileData Es funktioniert auf einem Emulator. und schlägt auf einem echten Gerät mit einem Fehler fehl, dass die Datei nicht nach dem angegebenen Pfad gelesen werden kann. Ich habe dieses Problem hier beschrieben PHAsset + AFNetworking. Es ist nicht möglich, Dateien auf einem echten Gerät auf den Server hochzuladen

========================================

Update: Ich habe meinen Code geändert, um den Ansatz des Hochladens von Dateien mit dem lokalen Pfad auf einem neuen iPhone 6s + wie folgt zu testen:

%Vor%

Das Testen auf dem iPhone 6s + gibt eine klarere Protokollwarnung Es tritt als Ergebnis der Aufrufmethode appendPartWithFileURL

auf %Vor%

Hier ist der Code zum Abrufen des lokalen Dateipfads von PHAsset

%Vor%

Das Problem bleibt also gleich - Dateien, die auf den Server hochgeladen werden, sind leer

    
ProblemSlover 22.10.2015, 10:11
quelle

3 Antworten

10

Die oben vorgeschlagene Lösung ist nur teilweise korrekt (und wurde von mir selbst früher gefunden). Da das System das Lesen von Dateien außerhalb der Sandbox nicht zulässt, können die Dateien nicht über den Dateipfad angesprochen (gelesen / geschrieben) und nur kopiert werden. In der Version iOS 9 und höher stellt Photos Framework eine API bereit (die nicht über den NSFileManager, sondern nur mit Photos Framework API) ausgeführt werden kann, um die Datei in das Sandbox-Verzeichnis Ihrer App zu kopieren. Hier ist der Code, den ich nach dem Graben in Dokumenten und Dateien verwendet habe.

Kopieren Sie zunächst eine Datei in das App-Sandbox-Verzeichnis.

%Vor%

Aufgabe selbst hochladen

%Vor%

Diese Upload-Methode hat einen erheblichen Nachteil .. Sie sind geschraubt, wenn das Gerät in den "Schlafmodus" geht. Daher ist der empfohlene Upload-Ansatz hier die Methode. uploadTaskWithRequest:fromFile:progress:completionHandler in AFURLSessionManager.

Für Versionen unter iOS 9 .. Bei Bildern Sie können NSDATA von PHAsset holen, wie im Code meiner Frage gezeigt .. und hochladen. oder schreiben Sie sie zuerst in Ihren App-Sandbox-Speicher, bevor Sie sie hochladen. Dieser Ansatz ist im Falle von großen Dateien nicht verwendbar. Alternativ können Sie die Bild- / Videoauswahl-Exportdateien als ALAsset verwenden. ALAsset stellt eine API zur Verfügung, mit der Sie Dateien aus dem Speicher lesen können. Sie müssen sie jedoch vor dem Hochladen in den Sandbox-Speicher schreiben.

    
ProblemSlover 06.11.2015, 02:12
quelle
6

Das Erstellen von NSData für jedes Video ist möglicherweise schlecht, da Videos (oder andere Dateien) viel größer sein können als das RAM des Geräts. Ich würde vorschlagen, als "Datei" und nicht als "Daten" zu laden, wenn Sie Datei anhängen, wird es die Daten von der Festplatte Chunk-by-Chunk senden und nicht versuchen, ganze Datei auf einmal zu lesen, versuchen Sie es mit

%Vor%

sehen Sie sich auch Ссылка

an

In Ihrem Fall verwenden Sie es mit diesem

%Vor%     
ogres 27.10.2015 16:22
quelle
2

Sehen Sie meine Antwort hier zu Ihrer anderen Frage. Scheint hier relevant, da das Thema verlinkt ist.

In dieser Antwort beschreibe ich, dass Apple nach unserer Erfahrung keinen direkten Zugriff auf Videoquelldateien gewährt, die mit einem PHAsset verbunden sind. Oder ein ALAsset für diese Angelegenheit.

Um auf die Videodateien zugreifen und sie hochladen zu können, müssen Sie zuerst eine Kopie erstellen, indem Sie eine AVAssetExportSession . Oder die iOS9 + PHAssetResourceManager API verwenden.

Sie sollten keine Methoden verwenden, die Daten in den Speicher laden, da Sie schnell mit OOM-Ausnahmen konfrontiert werden. Und es ist wahrscheinlich keine gute Idee, die Methode requestAVAssetForVideo(_:options:resultHandler:) wie oben erwähnt zu verwenden, da Sie im Gegensatz zu einem AVAsset manchmal eine AVComposition erhalten (und Sie können NSURL nicht direkt von einer AVComposition beziehen).

Wahrscheinlich möchten Sie auch keine Upload-Methode verwenden, die AFHTTPRequestOperation oder verwandte APIs nutzt, da sie auf der veralteten API NSURLConnection basieren, im Gegensatz zu der moderneren Version NSURLSession APIs. NSURLSession ermöglicht es Ihnen, lange laufende Video-Uploads in einem Hintergrundprozess durchzuführen, so dass Ihre Nutzer Ihre App verlassen können und sicher sein können, dass der Upload unabhängig abgeschlossen wird.

In meiner ursprünglichen Antwort erwähne ich VimeoUpload . Es ist eine Bibliothek, die Videodatei-Uploads zu Vimeo verarbeitet, aber ihr Kern kann für die gleichzeitige Übertragung von Hintergrund-Videodateien an beliebige Ziele verwendet werden. Vollständige Offenlegung: Ich bin einer der Autoren der Bibliothek.

    
Alfie Hanssen 16.03.2016 19:47
quelle