2015-07-07 8 views
5

Desidero ottenere le immagini di anteprima di ogni fotogramma dal video e quindi salvare queste immagini in Matrice di immagini mutevole.Come ottenere l'immagine di anteprima del video da ALAsset in iOS?

Desidero utilizzare queste immagini per riprodurre come animazione.

NSURL* assetURL = [self.asset valueForProperty:ALAssetPropertyAssetURL]; 
NSDictionary* assetOptions = nil; 

AVAsset* myAsset = [[AVURLAsset alloc] initWithURL:assetURL options:assetOptions]; 

self.imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:myAsset]; 


int duration = CMTimeGetSeconds([myAsset duration]); 

for(int i = 0; i<duration; i++) 
{ 
    CGImageRef imgRef = [self.imageGenerator copyCGImageAtTime:CMTimeMake(i, duration) actualTime:NULL error:nil]; 
    UIImage* thumbnail = [[UIImage alloc] initWithCGImage:imgRef scale:UIViewContentModeScaleAspectFit orientation:UIImageOrientationUp]; 
    [thumbnailImages addObject:thumbnail]; 
} 

Sto usando sopra il codice per ottenere le immagini in miniatura, ma il problema è che se c'è un video di 2 secondi sto ottenendo soltanto 2 miniature ma voglio 20 miniature (10 miniature per secondo).

Così, come utilizzare CMTimeMake per ottenere le miniature per ogni secondo

risposta

6

Codice sito di riferimento forma: Thumbnail image from Video

Obiettivo - C

-(UIImage *)generateThumbImage : (NSString *)filepath 
{ 
    NSURL *url = [NSURL fileURLWithPath:filepath]; 

    AVAsset *asset = [AVAsset assetWithURL:url]; 
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; 
self.imageGenerator.appliesPreferredTrackTransform = YES; 
     CMTime time = [asset duration]; 
     time.value = 0; 
     Float duration = CMTimeGetSeconds([myAsset duration]); 
    for(Float i = 0.0; i<duration; i=i+0.1) 
    { 
    CGImageRef imgRef = [self.imageGenerator copyCGImageAtTime:CMTimeMake(i, duration) actualTime:NULL error:nil]; 
    UIImage* thumbnail = [[UIImage alloc] initWithCGImage:imgRef scale:UIViewContentModeScaleAspectFit orientation:UIImageOrientationUp]; 
    [thumbnailImages addObject:thumbnail]; 
    } 
} 

Swift

func generateThumbImage(url : NSURL) -> UIImage{ 
     var asset : AVAsset = AVAsset.assetWithURL(url) as! AVAsset 
     var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 
     assetImgGenerate.appliesPreferredTrackTransform = true 
     var error  : NSError? = nil 
     var time  : CMTime = CMTimeMake(1, 30) 
     var img   : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error) 
     var frameImg : UIImage = UIImage(CGImage: img)! 

     return frameImg 
    } 
+0

Ehi, il tuo codice restituisce solo un'immagine. Voglio una matrice di tutte le immagini in miniatura. Grazie –

+1

Quindi la sua immagine non chiamata Thumb. –

+0

come se avessi generato un'immagine in un dato momento, voglio più immagini da diff. tempo e mostra come animazione –

0

seguito il codice .1 per l'ottenere l'immagine del pollice dal video a 0.41

NSString *str = [[self.videoArray objectAtIndex:i] valueForKey:@"vName"]; 
NSURL *videoURL = [NSURL URLWithString:str] ; 
MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease]; 
UIImage *thumbnail = [player thumbnailImageAtTime:0.41 timeOption:MPMovieTimeOptionNearestKeyFrame]; 
player = nil; 
+0

voglio tutte le immagini in miniatura di attività (che è il tipo di video), non è sola immagine. –

+0

è necessario modificare il valore di 'thumbnailImageAtTime: 0.41' –

+0

Sto provando anche il codice. Ma sto usando ALAsset. Quindi, puoi modificare la tua risposta rispetto a ALAsset –

1

soluzione @Kirit Modi a Swift 3 con alcune piccole modifiche:

func generateThumbImage(url : URL) -> UIImage?{ 

    let asset = AVAsset(url: url) 
    let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 
assetImgGenerate.appliesPreferredTrackTransform = true 
    let time = CMTimeMake(1, 30) 
    let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) 

    guard let cgImage = img else { return nil } 

    let frameImg = UIImage(cgImage: cgImage) 
    return frameImg 
} 
Problemi correlati