美文网首页
视频裁剪

视频裁剪

作者: kenny肉桂 | 来源:发表于2016-07-15 16:18 被阅读122次

AVAsset

AVAsset是一个表现音视频媒体的抽象类.AVAsset对象给我们开发提供了媒体文件的访问接口.
这个 AVAsset 可以通过文件创建,也可以是来自用户相册目录的.如果获得了一个视频文件的 AVAsset,我们就可以从中获取静态图片,转换格式,或者是裁剪内容.

通过以下代码,获得特定位置的视频文件:

NSString * videoPath = @"a video file path";
AVAsset *anAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videoPath] options:nil];

其中 options 是一个字典,这个字典只有一个 key-value:
AVURLAssetPreferPreciseDurationAndTimingKey value 是 YES 或者 NO

这个是设置时间精确度的,如果设置为 YES, 那么会造成很大的开销,但是可以保证操作的精度,对于我的裁剪操作,不用设置.因为我的业务中,裁剪范围是用户滑块操作的,本来精度就要求不高.
传递 nil 和 传递 NO, 两者等效.
特别的,当进行视频合成操作的时候,需要设置这个字典,并将 value 设置为 YES,因为如果精度不够,可能造成音视频不同步等问题.

AVAssetExportSession

AVAssetExportSession 是一个控制 Asset 异步导出的对象.可以实现裁剪视频,转换格式等需求. 代码如下:

  exportSession_ = [[AVAssetExportSession alloc]
                              initWithAsset:anAsset presetName:AVAssetExportPreset960x540]

这个presetName 是系统提供的预设,有一些常用的视频分辨率和视频质量控制的选项.可以按住command自行查看.另外.如果预设的分辨率不能满足需求,我们还可以自定义任意分辨率,这个将在我以后的文章中进行说明.

然后就是配置AVAssetExportSession,下面分别配置了导出路径,导出文件格式,截取范围:

exportSession_.outputURL = tempVideoURL;
exportSession_.outputFileType = AVFileTypeMPEG4;
exportSession_.timeRange = [self videoTimeRange:anAsset];         

需要说明的是这个截取范围的实现:

-(CMTimeRange)videoTimeRange:(AVAsset*)anAsset{
    CMTime start = CMTimeMakeWithSeconds(self.videoRange.startTime, anAsset.duration.timescale);
    CMTime duration = CMTimeMakeWithSeconds(self.videoRange.duration, anAsset.duration.timescale);
    CMTimeRange range = CMTimeRangeMake(start, duration);
    return range;
}

CMTime 是一个结构体对象,常用的两个值是: valuetimescale. 两者的关系可以表示为: value/timescale=seconds.

在上面的方法中,我将来自滑块的值(秒为单位),转换成了CMTime然后构造了一个CMTimeRange 对象.

最后进行导出:

 [exportSession_ exportAsynchronouslyWithCompletionHandler:^{
                    switch (exportSession_.status) {
                    case AVAssetExportSessionStatusUnknown: {
                        
                        break;
                    }
                    case AVAssetExportSessionStatusWaiting: {
                        
                        break;
                    }
                    case AVAssetExportSessionStatusExporting: {
                        
                        break;
                    }
                    case AVAssetExportSessionStatusCompleted: {
                        
                        break;
                    }
                    case AVAssetExportSessionStatusFailed: {
                        
                        break;
                    }
                    case AVAssetExportSessionStatusCancelled: {
                        
                        break;
                    }
                }
            }];

可以对各种状态进行判断.进而采取不同的操作.通常关心的是FailedCompleted ,前者给用户提示,后者进行后续操作.

到此,就完成了一段视频的裁剪操作.

相关文章

  • 视频裁剪

    AVAsset AVAsset是一个表现音视频媒体的抽象类.AVAsset对象给我们开发提供了媒体文件的访问接口....

  • 短视频SDK如何做到视频原始比例裁剪?

    1.概述 目前阿里云短视频SDK裁剪视频提供了多种模式。填充模式和裁剪模式. 但是demo没有演示裁剪视频原始大小...

  • Android 视频裁剪 (含裁剪 View)

    AndroidVideoClip - Github Android 视频裁剪 - (含裁剪 View) 具体代码 ...

  • ffmpeg滤镜命令

    视频裁剪 -vf video filter 视频滤镜 crop 裁剪 -c:v 视频的编码器 libx264 -c...

  • 使用FFmpeg对视频进行精确裁剪

    一般剪辑软件只能将视频裁剪到关键帧处,无法对视频进行帧级别的裁剪。原因是这种裁剪方案不会对原视频进行重编码,必须依...

  • FFmpeg 参数

    转码以及裁剪视频 获取视频首帧图

  • wrs-imagepicker相册相机插件

    前言 相册相片选择、拍照、视频选择、录像 功能 图片单选、多选、拍照 视频选择、录像 裁剪、裁剪比例 wrs-im...

  • libyuv裁剪视频

    libyuv提供的ConvertToI420函数可实现裁剪、旋转和垂直翻转功能,结果为I420,即yuv420p,...

  • 视频旋转、裁剪

    iOS应用层的API无法对视频源数据进行直接操作,所以想要对视频进行修改,需要进行一次导出操作。可以使用AVAss...

  • ffmpeg裁剪与合并

    裁剪 -ss: 视频从什么时候开始裁剪 -t 10 裁剪多长时间 合并 -f concat 文件进行拼接 文件...

网友评论

      本文标题:视频裁剪

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