iphone - 将 UIView 层转换为 UIImage

标签 iphone ios objective-c ipad

我正在 View 中使用 AVPlayerLayer 播放视频。我需要将 View 转换为图像,我试过了

[myview.layer renderInContext:context];

但这只给出黑色图像。我当时想将该 View 转换为带有视频的图像。这种转换将同时发生 0.05s。

我尝试使用 AVAssetImageGenerator。这给了我使用 Asset 的正确图像。但这只花费了更多时间,这对我的应用程序造成了一些性能问题。任何人都可以帮助我如何减少特定 CMTime 将视频转换为图像的过程。

下面是我的代码。

- (UIImage *)currentItemScreenShot
{
    AVPlayer *abovePlayer = [objVC player];
    if(imageGenerator == nil)
    {
        AVAsset *asset = [[[objVC player] currentItem] asset];
        imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    }

    CMTime time = [[abovePlayer currentItem] currentTime];
    if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) {
        [imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero];
        [imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero];
    }

    CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time
                                               actualTime:NULL
                                                    error:NULL];
    if (imgRef == nil) {
        if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) {
            [imageGenerator setRequestedTimeToleranceBefore:kCMTimePositiveInfinity];
            [imageGenerator setRequestedTimeToleranceAfter:kCMTimePositiveInfinity];
        }
        imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    }
    UIImage *image = [UIImage imageWithCGImage:imgRef];
    CGImageRelease(imgRef);

    image = [self reverseImageByScalingToSize:image.size :image];
    return image;
}

最佳答案

MPMoviePlayerController 可以很容易地从电影中的某个点获取图像。

    - (UIImage*)imageFromVideoAtPath:(NSString *)path atTime:(NSTimeInterval)time {
    NSURL *videoURL = [NSURL fileURLWithPath:path];
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
    [moviePlayer prepareToPlay];
    UIImage *thumbnail = [moviePlayer thumbnailImageAtTime:time timeOption:MPMovieTimeOptionNearestKeyFrame];
    [moviePlayer stop];
    return thumbnail;
}

用视频的路径调用这个就行了,在你想获取图片的时候。

关于iphone - 将 UIView 层转换为 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14275859/

相关文章:

ios - 在 Swift 中单击按钮而不释放触摸

ios - 所有资源的正常大小和@2x 大小?

objective-c - 什么在子类化 UIViewController 时调用 viewDidLoad?

objective-c - NSDate 将秒数归零而不四舍五入

iphone - 如何在iphone sdk中合并直播视频和音频

ios - UICollectionView 的清除标题和白色背景

iphone - Cocos2d/Cocos2d-x 视网膜问题

ios - MPMoviePlayerController:在控制元素后面添加 subview

iphone - 从 iPhone 5 中的 SQLite 删除数据时应用程序崩溃

iphone - 如何从 View Controller 引用应用程序委托(delegate)中的 ManagedObjectContext?