• iOS-----AVFoundation框架的功能详解


    使用AVFoundation拍照和录制视频

    需要开发自定义的拍照和录制视频功能,可借助于AVFoundation框架来实现,该框架提供了大量的类来完成拍照和录制视频.主要使用如下类:

      AVCaptureDevice:该对象代表物理输入设备,包括摄像头和麦克风.开发者可通过该对象来配置底层物理设备的属性.需要指出的是,

    我们不能直接创建该类的实例,只能通过该类的devices、defaultDeviceWithMediaType:(NSString *)mediaType、

    devicesWithMediaType:(NSString *)mediaType方法来获取对应的输入设备数组,接下来即可获取前置摄像头、后置摄像头或麦克风,

    程序就可设置该对象的对焦模式、闪光灯模式、曝光补偿、白平衡等各种拍照相关属性。

    注意:

    在配置摄像头的相关属性之前,必须先调用lockForConfiguration:方法执行锁定,配置完成后调用unlockForConfiguration方法解锁。

      AVCaptureSession:该对象负责把AVCaptureDevice捕捉得到的视频或声音数据输出到输出设备中.不管执行实时的还是离线的录制,开发者都必须创建AVCaptureSession对象,并为该对象添加输入设备(负责捕捉数据)和输出端(负责接收数据).例如如下代码片段

     

      AVCaptureDeviceInput[BL2] :它是AVCaptureInput的子类,使用该对象从AVCaptureDevice设备获取数据,该对象将会被添加给AVCaptureSession管理.

      AVCaptureScreenInput[BL3] :它是AVCaptureInput的子类,使用该对象从屏幕获取数据(用于录制屏幕动作).该对象将会被添加给AVCaptureSeesion管理

      AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput[BL4] 、AVCaptureStillImageOutput、AVCaptureVideoDataOutput:它们都是AVCaptureOutput的子类,用于接收各种数据.该对象也会被添加给AVCaptureSession管理.其中AVCaptureFileOutput依然代表输出到文件的输出端,

      AVCaptureAudioFileOutput[BL5] 、AVCaptureMovieFileOutput[BL6] :它们都是AVCaptureFileOutput的子类,分别代表输出到音频文件、电影文件的输出端。

      AVCaptureVideoPreviewLayer:该对象是CALayer的子类,开发者只要创建它的实例,并为它设置AVCaptureSession,就可以非常方便地用它来实现拍摄预览.

     

    使用AVFoundation实现拍照和录制视频的大致步骤如下

    1

    使用AVCaptureDevice的静态方法获取设备,包括摄像头和麦克风都可通过这种方式来获取

    2

    利用AVCaptureDevice初始化AVCaptureDeviceInput对象,无论摄像头还是麦克风都可通过这种方式转换为AVCaptureInput对象

    3

    初始化输出端.如果只是拍照,则初始化AVCaptureStillImageOutput输出端即可;如果要捕捉视频,则初始化AVCaptureMovieFileOutput输出端.

    4

    创建AVCaptureSession对象,使用该对象来添加输入设备和输出端.调用AVCaptureSession的startRunning方法开始捕捉画面或声音数据.

    5

    将捕捉的数据(照片、视频数据)输出到指定文件。

    框架

    AVFoundation.framework框架,AssetsLibrary.framework,CoreMedia.framework框架

    使用AVFoundation生成视频缩略图

    AVFoundation可用来生成视频缩略图.

    AVFoundation生成视频缩略图主要靠如下两个类.

    AVURLAsset

    该类是AVAsset的子类,AVAsset类专门用于获取多媒体的相关信息,包括获取多媒体的画面、声音等信息。而AVURLAsset子类的作用则是根据NSURL来初始化AVAsset对象。

    AVAssetImageGenerator[BL7] 

    该类专门用于截取视频指定帧的画面。

    使用AVFoundation生成视频缩略图的步骤如下:

    1

    根据视频的NSURL创建AVURLAsset对象

    2

    根据AVURLAsset对象创建AVAssetImageGenerator对象

    3

    调用AVAssetImageGenerator对象的copyCGImageAtTime:actualTime:error:方法来获取该视频指定时间点的视频截图.该方法的第一个CMTime参数用于指定获取哪个时间点的视频截图,第2个CMTime参数用于获取实际截图 位于哪个时间点.

    其中CMTime是专门用于标识电影时间的结构体,通常用如下两个函数来创建CMTime.

      CMTimeMake(int64_t  value, int_32  timescale): 第1个参数代表获取第几帧的截图,第2个参数代表每秒的帧数.因此实际截取的时间点是value/timescale.

      CMTimeMakeWithSeconds(Float64  seconds, int32_t  preferredTimeScale): 第1个参数代表获取第几秒的截图,第2个参数则代表每秒的帧数.

    代码片段

    // 为增加UIImage增加一个类别,通过在该类别中为UIImage增加一个imageWithVideo:方法来获取视频的缩略图 
    
    // UIImage + Video.m
    
    @implementation UIImage (Video)
    
    + (UIImage *)imageWithVideo:(NSURL *)vidoURL
    
    {
    
      // 根据视频的URL创建AVURLAsset
    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
    
    // 根据AVURLAsset创建AVAssetImageGenerator对象
    
     AVAssetImageGenerator* gen = [[AVAssetImageGenerator alloc] initWithAsset: asset];
    
     gen.appliesPreferredTrackTransform = YES;
    
     // 定义获取0帧处的视频截图
    
    CMTime time = CMTimeMake(0, 10);
    
     NSError *error = nil;
    
    CMTime actualTime;
    
    // 获取time处的视频截图
    
    CGImageRef  image = [gen  copyCGImageAtTime: time actualTime: &actualTime error:&error];
    
    // 将CGImageRef转换为UIImage
    
    UIImage *thumb = [[UIImage alloc] initWithCGImage: image];
    
    CGImageRelease(image);
    
    return  thumb;
    
    }
    
    @end
    
     
    
    ViewController.m
    
    @interface ViewController: UIViewController
    
    @property (nonatomic, strong) UIImageView *iv;
    
    @end
    
     
    
    @implementation ViewController
    
    - (void)viewDidLoad
    
    {
    
       [super viewDidLoad];
    
      // 获取URL
    
       NSURL *videoUrl = [[NSBundle mainBundle]
    
    URLForResource:@”movie” withExtension:@”mp4”];
    
       // 生成视频的缩略图
    
       UIImage *image = [UIImage imageWithVideo:videoUrl];
    
       self.iv.image = image;
    
    }
    
    @end

     [BL1]Session: 会议

     [BL2]设备获取数据

     [BL3]用于录制屏幕动作

     [BL4]代表输出到文件的输出端

     [BL5]输出到音频文件的输出端

     [BL6]输出到电影文件的输出端

     

  • 相关阅读:
    js 获取浏览器版本号
    怎样写具体设计文档
    android PreferenceScreen使用笔记
    支持向量机通俗导论(理解SVM的三层境地)
    算法导论 第6章 堆排序(简单选择排序、堆排序)
    人脸识别算法初次了解
    循环队列
    ubuntu 下操作文件夹,出现Permission denied的解决的方法
    JFreeChart的使用
    隐藏Activity标题栏
  • 原文地址:https://www.cnblogs.com/congli0220/p/4953077.html
Copyright © 2020-2023  润新知