【问题标题】:Thumbnail image of video视频的缩略图
【发布时间】:2023-04-05 19:10:01
【问题描述】:

我正在从库中选择视频剪辑。我想创建它的缩略图。我已经应用了这个代码。但图像出现旋转。我想要它的原始视图。

- (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;
}

【问题讨论】:

标签: iphone thumbnails


【解决方案1】:

尝试改用AVAssetImageGenerator。 Apple 讨论使用 AVAssetImageGenerator 创建缩略图here。这是示例代码,它获取单个缩略图。您将需要包含 AVFoundation 框架。并添加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];

另一种解决方案是

-(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];

}

或者

ALAsset
display image from URL retrieved from ALAsset in iPhone

【讨论】:

  • 只是一个提示。我需要非常精确地了解获取图像的时间。您可以将 requestedTimeToleranceAfter 和 requestedTimeToleranceBefore 设置为等于 kCMTimeZero。
  • 嘿伙计,这太棒了,代码正在获取图像,但我想做的是每秒 10 次获取视频的图像,我一直在玩时间变量和循环,但不能让它工作?如果你不介意看一下,我在这里有一个完整的问题。非常感谢stackoverflow.com/questions/29425455/…
  • gen.appliesPreferredTrackTransform = YES;为我工作。如果我不使用它,图像会旋转出来。
【解决方案2】:

斯威夫特 5:

func previewImageForLocalVideo(at url: URL) -> 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.copyCGImage(at: time, actualTime: nil)
        return UIImage(cgImage: imageRef)
    } catch let error as NSError {
        print("Image generation failed with error \(error)")
        return nil
    }
}

【讨论】:

  • 你确定 time.value 是帧数而不是秒数吗?
  • @Sam 是的,我是。检查developer.apple.com/library/mac/documentation/CoreMedia/…value/timescale = seconds.
  • 获得时间的更好方法是使用此处描述的操作 CMTime 的函数 developer.apple.com/library/prerelease/ios/documentation/… 将您的 time.value = min(time.value, 2) 替换为 time = CMTimeMultiplyByFloat(time, 0.5) 以获得更清晰、更准确的答案。
  • @TimBull 您的解决方案将在视频中间返回一个帧。在我的解决方案中,我想使用第一帧,但它有时不适用于某些设备上的某些视频(我不知道为什么)。所以我使用第二个框架,期望它与第一个框架相同(或几乎相同)。
【解决方案3】:

这将解决旋转问题

generate.appliesPreferredTrackTransform = YES

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2013-06-15
    • 2010-12-13
    • 2012-02-23
    • 2018-12-21
    • 2015-03-26
    • 2010-11-05
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多