Unter Miniaturansicht von video-gibt immer null
Ich versuche, die erste Miniatur aus einem video.
Ich habe versucht, die folgenden:
EINE
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_moviePath] options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;
CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *thumb = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
NSLog(@"the error is %@: image is %@: url is %@: ",error,_mainThumbnail,[NSURL fileURLWithPath:_moviePath] );
Aber mein log ist:
the error is (null): image is (null):
url is file:///private/var/mobile/Applications/D1293BDC-EA7E-4AC7-AD3C-1BA3548F37D6/tmp/trim.6F0C4631-E5E8-43CD-BF32-9B8F09D4ACF1.MOV:
ZWEI
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:_moviePath] options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
CMTime thumbTime = CMTimeMakeWithSeconds(0,30);
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
if (result != AVAssetImageGeneratorSucceeded) {
NSLog(@"couldn't generate thumbnail, error:%@", error);
}
_mainThumbnail.image = [UIImage imageWithCGImage:im];
NSLog(@"thumbnails %@ ",_mainThumbnail.image);
};
CGSize maxSize = CGSizeMake(320, 180);
generator.maximumSize = maxSize;
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
Log thumnails null.
Warum ist das Bild null? Ich sah in anderen Foren, und Sie schlug vor, mit fileURLWithPath -das habe ich bereits in Verwendung.
Ich bin mit ios7
- Was ist
_mainThumbnail
? Sind Sie sicher, dass nichtnil
(denn es scheint so zu sein)? Warum nicht Sie versuchen, sichthumb
direkt (im 1. Beispiel)? - In der ersten sieht es für mich wie _mainThumbnail niemals gesetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, diese Methode. Es wird der erste frame des Videos unter der angegebenen URL und gibt Sie als
UIImage
.Ist die Methode nicht auf Fehler überprüfen, da mein code mit ist es OK mit nur
nil
zurückgegeben, wenn alles andere fehlschlägt.Edit: Klarstellung
CMTime
WerteCMTime
hattimescale
- denken Sie sich dies als FPS (frames pro Sekunde) des Videos (25 Bilder /s -> 1s der video-25 video-frames)value
- Identifizierung von konkreten Rahmen. In dem obigen code, dieser sagt dem frame, den Sie möchten, nehmen Sie die Miniaturansicht.Für die Berechnung der frame-genaue Zeit, die Sie haben, um diese Berechnung:
entspricht
Wenn Sie möchten, nehmen Sie zum Beispiel den 1. frame des 2. Sekunde des Videos, das Sie wollen in der Tat zu überspringen 1. Sekunde des Videos. So verwenden Sie:
Einen Blick: Sie möchten skip first 1s der video-und als ein Daumennagel. I. e. auf 25 FPS, die Sie überspringen möchten, 25 frames. So
CMTime.value = 25
springen (25 frames).CMTime
docs sagt, "Wert/Zeitskala = Sekunden" ... also wenn IhrthumbnailTime.value = thumbnailTime.timescale * 1
(wobei 1 Anzahl s video Sie möchten, um zu nehmen Miniaturansicht), Sie sollte ungefähr die Zeit von 1. frame des 2. Sekunde des Videos (mal 00h00m01s)CMTime thumbnailTime = [asset duration]
gibt die Dauer des Videos alsCMTime
. Es heißt, Sie bekommen FPS und total frames count (Dauer) des Videos. Dann haben Sie gerade den resetvalue
zu Ihrer Zeit, halten Sie die gleichentimescale
(FPS)Nur falls jemand den gleichen Fehler gemacht haben wie ich:
Prüfen Sie, ob das
URL
generiert wird, geeignet. Sie sollten nicht counfused für lokale und web -URL
s der Datei.Im Falle eines lokalen video-Datei, verwenden Sie folgenden code:
Im Falle von video-Datei aus dem internet, verwenden Sie folgenden code:
Habe ich erfolgreich die Einsatz dieses snippet, um einen screenshot von einem video:
Aber in meinem Fall - ich mache es zwei Sekunden nach dem video erfolgreich importiert wurde, in Anwendung. ( Es hatte Probleme mit der Bild-Ausrichtung, mal wieder keine Bild-oder halbe Bild, wenn ich es einmal Tat, video importiert wurde).
Swift version der akzeptierten Antworten @Lukas Kukacka Antwort:
Bonus
Unter
let imageGenerator = AVAssetImageGenerator(asset: asset
) ich fügte hinzu:Ich hatte ein problem, wo ich aufzeichnen würde, die in portrait, erhalten das Vorschau-Bild und Sie würde sich wieder in die Landschaft. Diese Antwort , dass problem gelöst.