iOS-截取视频当前时间的一帧图片

作者: 半缘魔君 | 来源:发表于2017-05-19 10:33 被阅读904次

    最近某视频观看软件新增了几个新的功能---截取视频当前时间的一帧图片进行分享,截取一段视频生成gif图片进行分享,截取一段视频进行分享.

    我们的应用也想要做这几个功能
    本文重点介绍截取视频当前时间的一帧图片.
    阅读本文,我假设你对AVPlayer的使用有一定的了解,如果有疑问可以参考此文章

    截取视频当前时间的一帧图片:需要进行以下2步:

    1 给需要截图的视频对应的AVPlayerItem绑定一个AVPlayerItemVideoOutput

    //生成playerItem
    playerItem  = [[AVPlayerItem alloc]initWithURL:url];
    //准备参数字典
    NSDictionary *settings = @{(id)kCVPixelBufferPixelFormatTypeKey: 
                                   [NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
                               };
    //创建AVPlayerItemVideoOutput
    videoOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:settings];
    //向playerItem添加AVPlayerItemVideoOutput
    [playerItem addOutput:videoOutput];
    
    注:videoOutput是一个强指针的属性,截图的时候需要用到它
    

    2 截图

     if(player.currentItem.status == AVPlayerStatusReadyToPlay){
          //获取player的当前播放时间
          CMTime currentTime = player.currentItem.currentTime;
          //获取对应时间的缓存上下文
          CVPixelBufferRef buffer = [videoOutput copyPixelBufferForItemTime:currentTime itemTimeForDisplay:nil];
          //生成CIImage
          CIImage *ciImage = [CIImage imageWithCVPixelBuffer:buffer];
          //生成CGImage
          CIContext *temporaryContext = [CIContext contextWithOptions:nil];
          CGImageRef videoImage = [temporaryContext createCGImage:ciImage fromRect:CGRectMake(0, 0, CVPixelBufferGetWidth(buffer), CVPixelBufferGetHeight(buffer))];
          //转化成UIImage
          UIImage *image = [UIImage imageWithCGImage:videoImage];
          //将图片添加到数组(为后续生成GIF图做准备)
           [self.thumbnailArray addObject:image];
     }
    

    如有疑问可以留言交流,也可以到这里下载Demo工程
    友情提示:
    1 通过AVAssetImageGenerator截取视频的当前时间的图片,只能对本地视频生效(经过本人实际测试说明);
    2 本文说的截图方式适用于AVPlayer的所有视频播放,包括直播视频流/点播视频流/本地视频流/

    相关文章

      网友评论

        本文标题:iOS-截取视频当前时间的一帧图片

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