Ich muss das AVAsset-Objekt verwenden, um es mit AVPlayer und AVPlayerLayer abzuspielen. Ich habe begonnen, das Photos-Framework zu verwenden, seit AssetsLibrary veraltet ist. Jetzt bin ich an den Punkt gekommen, an dem ich ein Array von PHAsset-Objekten habe, und ich muss sie in AVAsset konvertieren. Ich habe versucht, durch das PHFetchResult aufzuzählen und einen neuen AVAsset mit der lokalisierten Beschreibung des PHAsset zuzuweisen, aber es scheint kein Video zu zeigen, wenn ich es spiele.
%Vor%Ich nehme an, dass die lokalisierte Beschreibung nicht die absolute URL des Videos ist.
Ich bin auch auf den PHImageManager und den requestAVAssetForVideo gestoßen, allerdings hat der Optionsparameter, wenn es um Videos geht, keine isSynchrounous -Eigenschaft, was beim image options -Parameter der Fall ist.
%Vor%Gibt es einen synchronen Weg, dies zu tun?
Danke.
Nein, ist es nicht. Aber Sie können eine synchrone Version erstellen:
%Vor% Wenn Sie dies jedoch im Hauptthread tun und requestAVAssetForVideo:
zu lange dauert, besteht die Gefahr, dass Sie Ihre Benutzeroberfläche sperren oder sogar von iOS-Wachhund .
Es ist wahrscheinlich sicherer, Ihre App so zu überarbeiten, dass sie mit der asynchronen Callback-Version funktioniert. Etwas wie das:
%Vor% Für Swift 2 können Sie das Video mit PHAsset
mit dieser Methode unter
Sie können diesen Trick versuchen, aber es ist praktisch, wenn Sie 3,4 oder vielleicht 5 Phassets haben, die Sie in AVAsset konvertieren möchten:
%Vor%Sie können diese Methode also grundsätzlich erneut aufrufen, wenn Sie 1 Phassatz in AVAsset konvertiert haben. Ich weiß, dass dies kein effizienter Code ist, aber er sollte nicht für wenig Zwecke verboten werden.
Das Folgende ist eine Swift 4-Implementierung, die auf einem Semaphor beruht, um die Anfrage synchron zu machen.
Der Code ist kommentiert, um die verschiedenen Schritte zu erklären.
%Vor%Tags und Links ios video photosframework avasset