2012-01-18 49 views
14

Tôi đang chọn video clip từ thư viện. Và tôi muốn tạo ra hình ảnh thu nhỏ của nó. Tôi đã áp dụng mã này. Nhưng hình ảnh xuất hiện xoay. Tôi muốn xem ban đầu của nó.Hình thu nhỏ của video

- (UIImage*)testGenerateThumbNailDataWithVideo { 

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:appDelegate.videoURL options:nil]; 
    AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    NSError *err = NULL; 
    CMTime time = CMTimeMake(1, 60); 
    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err]; 
    [generate release]; 
    NSLog(@"err==%@, imageRef==%@", err, imgRef); 
    UIImage *currentImg = [[[UIImage alloc] initWithCGImage:imgRef] autorelease]; 
    static BOOL flag = YES; 
    if (flag) { 
     NSData *tmpData = UIImageJPEGRepresentation(currentImg, 0.8); 
     NSString *path = [NSString stringWithFormat:@"%@thumbNail.png", NSTemporaryDirectory()]; 
     BOOL ret = [tmpData writeToFile:path atomically:YES]; 
     NSLog(@"write to path=%@, flag=%d", path, ret); 
     flag = NO; 
    } 
    return currentImg; 
} 
+0

thể trùng lặp của [Bắt thumbnail từ một url video hoặc dữ liệu trong IPhone SDK] (http://stackoverflow.com/questions/1347562/getting-thumbnail-from- a-video-url-hoặc-data-in-iphone-sdk) – Avt

Trả lời

37

Hãy thử sử dụng AVAssetImageGenerator để thay thế. Apple thảo luận bằng cách sử dụng AVAssetImageGenerator để tạo hình thu nhỏ here. Đây là mã mẫu, lấy một hình ảnh thu nhỏ duy nhất. Bạn sẽ cần phải bao gồm khuôn khổ AVFoundation. Và cũng có thể thêm khung CoreMedia

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidPath 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); 
[gen release]; 

Thêm một giải pháp là

-(void)generateImage 
{ 
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:self.url options:nil]; 
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    generator.appliesPreferredTrackTransform=TRUE; 
    [asset release]; 
    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); 
     } 
     [button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal]; 
     thumbImg=[[UIImage imageWithCGImage:im] retain]; 
     [generator release]; 
    }; 

    CGSize maxSize = CGSizeMake(320, 180); 
    generator.maximumSize = maxSize; 
    [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler]; 

} 

Hoặc

ALAsset
display image from URL retrieved from ALAsset in iPhone

+0

Chỉ cần một gợi ý. Tôi cần phải rất chính xác về thời gian để có được hình ảnh. Bạn có thể đặt requestTimeToleranceAfter và requestedTimeToleranceBefore bằng kCMTimeZero. – SlowTree

+0

Hey người đàn ông này rất tuyệt, đoạn mã đang lấy hình ảnh, nhưng những gì tôi đang cố gắng làm là lấy hình ảnh của video 10 lần mỗi giây, và tôi đã chơi xung quanh với biến thời gian và vòng lặp nhưng không thể nó hoạt động? Tôi có câu hỏi đầy đủ ở đây với tiền thưởng về nó nếu bạn không phiền khi xem xét. Cảm ơn rất nhiều http://stackoverflow.com/questions/29425455/ios-take-multiple-screen-shots – iqueqiorio

+0

gen.appliesPreferredTrackTransform = YES; đã làm cho tôi. Nếu tôi không sử dụng điều này, hình ảnh xuất hiện luân phiên. – Nil

2

Swift 2:

func previewImageForLocalVideo(url:NSURL) -> UIImage? 
{ 
    let asset = AVAsset(URL: url) 
    let imageGenerator = AVAssetImageGenerator(asset: asset) 
    imageGenerator.appliesPreferredTrackTransform = true 

    var time = asset.duration 
    //If possible - take not the first frame (it could be completely black or white on camara's videos) 
    time.value = min(time.value, 2) 

    do { 
     let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil) 
     return UIImage(CGImage: imageRef) 
    } 
    catch let error as NSError 
    { 
     print("Image generation failed with error \(error)") 
     return nil 
    } 
} 
.210
+0

bạn có chắc chắn time.value là số khung chứ không phải giây? – Sam

+0

@Sam Có, tôi. Kiểm tra https://developer.apple.com/library/mac/documentation/CoreMedia/Reference/CMTime/index.html#//apple_ref/swift/struct/c:@[email protected] 'value/timescale = seconds.' – Avt

+0

Cách tốt hơn để lấy thời gian là sử dụng các hàm để thao tác CMTime được mô tả tại đây https://developer.apple.com/library/prerelease/ios/documentation/CoreMedia/Reference/CMTime /index.html#//apple_ref/c/func/CMTimeMultiplyByFloat64 thay 'time.value = min của bạn (time.value, 2) ' với ' time = CMTimeMultiplyByFloat (thời gian, 0,5)' để có câu trả lời rõ ràng hơn, chính xác hơn. –

0

này sẽ giải quyết vấn đề xoay

generate.appliesPreferredTrackTransform = YES 
Các vấn đề liên quan