美文网首页iOS开发笔记
copyCGImageAtTime 获取视频第一帧错误

copyCGImageAtTime 获取视频第一帧错误

作者: 炒鸡范 | 来源:发表于2017-10-16 15:16 被阅读197次
+ (UIImage*)getVideoPreViewImage:(AVAsset *)asset atTimeSec:(double)timeSec
{
    if (!asset) {
        return nil;
    }
    
    //获取视频图像实际开始时间 部分视频并非一开始就是有图像的 因此要获取视频的实际开始片段
    AVAssetTrack *videoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
    NSArray<AVAssetTrackSegment *> *segs = videoTrack.segments;
    if (!segs.count) {
        return nil;
    }
    CMTime currentStartTime = kCMTimeZero;
    for (NSInteger i = 0; i < segs.count; i ++) {
        if (!segs[i].isEmpty) {
            currentStartTime = segs[i].timeMapping.target.start;
            break;
        }
    }
    
    CMTime coverAtTimeSec = CMTimeMakeWithSeconds(timeSec, asset.duration.timescale);
    //如果想要获取的视频时间大于视频总时长 或者小于视频实际开始时间 则设置获取视频实际开始时间
    if (CMTimeCompare(coverAtTimeSec, asset.duration) == 1 || CMTimeCompare(coverAtTimeSec, currentStartTime) == -1) {
        coverAtTimeSec = currentStartTime;
    }
    
    AVAssetImageGenerator *assetGen = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
    assetGen.requestedTimeToleranceBefore = kCMTimeZero;
    assetGen.requestedTimeToleranceAfter = kCMTimeZero;
    assetGen.appliesPreferredTrackTransform = YES;
    
    //CMTime coverTime = CMTimeMakeWithSeconds(coverAtTimeSec, asset.duration.timescale);
    NSError *error = nil;
    CGImageRef image = [assetGen copyCGImageAtTime:coverAtTimeSec actualTime:NULL error:&error];
    if (error) {
        return nil;
    }
    UIImage *videoImage = [UIImage imageWithCGImage:image];
    CGImageRelease(image);
    return videoImage;
}

相关文章

网友评论

    本文标题:copyCGImageAtTime 获取视频第一帧错误

    本文链接:https://www.haomeiwen.com/subject/efnkuxtx.html