iOS之AVFoundation 音视频编辑(一)

e

iOS的音视频编辑主要的有AVFoundation 和 FFmpeg,在这里主要的是介绍如何使用AVFoundation进行音视频编辑。

一、主要的一些类

@property (nonatomic,strong) AVMutableComposition *mixComposition ;

//一个用来合成视频的工程文件,基本的类,上面可承载各种轨道

@property (nonatomic,strong) AVMutableCompositionTrack *audioTrack;

@property (nonatomic,strong) AVMutableCompositionTrack *videoTrack;

//视频的轨道,一个视频可以允许拥有多条轨道

@property (nonatomic, retain) AVAssetExportSession *exporter;

//用于视频的最终导出

二、使用

1、视频轨道等init

_mixComposition = [AVMutableComposition composition];

// 给工程 添加视频轨道

_videoTrack = [_mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

//视频轨道

_audioTrack = [_mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]

//音频轨道

2、获取视频的Asset 数据

AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:filePath]];

//提取视频的视频轨道

AVAssetTrack *assetVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo]firstObject];

//提取视频的音频轨道

AVAssetTrack *assetAudioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] firstObject];

3、从原视频中提取元素写入轨道

//给视频轨道写入

 NSError *errorVideo = nil;

[_videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:assetVideoTrack atTime:kCMTimeZero error:&errorVideo];

//给音频轨道写入

NSError *errorVideo = nil;

[_audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:assetAudioTrack atTime:kCMTimeZero error:&erroraudio];

此处简单介绍下CMTimeRange 属性

CMTimeRangeMake(CMTime start, CMTime duration)

start:开始时间 ,duration:持续时间

insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack*)track atTime:(CMTime)startTime

所以这个方法是 把track的 从start 秒开始 持续时间为duration,加入到audioTrack的第startTime秒中。

三、视频的导出

 self.exporter = [[AVAssetExportSession alloc] initWithAsset:self.mixComposition  presetName:AVAssetExportPresetHighestQuality];

//输出URL

self.exporter.outputURL = [NSURL fileURLWithPath:path];

//优化网络

self.exporter.shouldOptimizeForNetworkUse = true;

//转换后的格式

self.exporter.outputFileType = AVFileTypeMPEG4;

[self.exporter exportAsynchronouslyWithCompletionHandler:^{

        if( self.exporter.status == AVAssetExportSessionStatusCompleted ){

        //导出成功

        }else{

        //导出失败

        }

}];

注:有些视频没办法以 AVAssetExportPresetHighestQuality 模式导出,这个时候就需要使用AVAssetExportPresetPassthrough 格式,通常添加顺序是先添加视频轨道再添加音频轨道。

关于视频导出进度的监听 需要创建一个NSTimer

dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC);

 dispatch_source_set_event_handler(self.timer, ^{

     if (self.exporter.status == AVAssetExportSessionStatusExporting) {

        float progress = [self.exporter progress];//导出的进度

    }else if (self.exporter.status == AVAssetExportSessionStatusCompleted) {

        dispatch_suspend(self.timer);                        NSLog(@"完成导出!");

    }

dispatch_resume(_timer);

你可能感兴趣的:(iOS之AVFoundation 音视频编辑(一))