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);