iOS 视频合成相关

    xiaoxiao2021-04-15  29

    裁剪视频是很久之前所做的项目中用到的,现在又看到了,整理一下。 与之相关的这些类有些抽象,所以我这里重点将它们具体化。用代码将视频合成其实与绘声绘影/vegas等软件将视频合成的过程类似,首先了解下这类软件一些相关知识:一个工程文件中有很多轨道,如音频轨道1,音频轨道2,音频轨道3,视频轨道1,视频轨道2等等,每个轨道里有许多素材,对于每个视频素材,它可以进行缩放、旋转等操作,素材库中的视频拖到轨道中会分为视频轨和音频轨两个轨道。这里用这些软件里的一些术语类来比这些类: AVAsset:素材库里的素材; AVAssetTrack:素材的轨道; AVMutableComposition :一个用来合成视频的工程文件; AVMutableCompositionTrack :工程文件中的轨道,有音频轨、视频轨等,里面可以插入各种对应的素材; AVMutableVideoComposition:用来生成video的组合指令,包含多段instruction。可以决定最终视频的尺寸,裁剪需要在这里进行; AVMutableVideoCompositionInstruction:一个指令,决定一个timeRange内每个轨道的状态,包含多个layerInstruction; AVMutableVideoCompositionLayerInstruction:在一个指令的时间范围内,某个轨道的状态; AVAssetExportSession:配置渲染参数并渲染。 接下来就用这种类比的方式裁剪一个视频: 1.将素材拖入到素材库中

    AVAsset *asset = [AVAsset assetWithURL:outputFileURL]; AVAssetTrack *videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0];//素材的视频轨 AVAssetTrack *audioAssertTrack = [[asset tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0];//素材的音频轨

    2.将素材的视频插入视频轨,音频插入音频轨

    AVMutableComposition *composition = [AVMutableComposition composition];//这是工程文件 AVMutableCompositionTrack *videoCompositionTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];//视频轨道 [videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration) ofTrack:videoAssetTrack atTime:kCMTimeZero error:nil];//在视频轨道插入一个时间段的视频 AVMutableCompositionTrack *audioCompositionTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];//音频轨道 [audioCompositionTrack insertTimeRange: CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration) ofTrack:audioAssertTrack atTime:kCMTimeZero error:nil];//插入音频数据,否则没有声音

    3.裁剪视频,就是要将所有视频轨进行裁剪,就需要得到所有的视频轨,而得到一个视频轨就需要得到它上面所有的视频素材

    AVMutableVideoCompositionLayerInstruction *videoCompositionLayerIns = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack]; [videoCompositionLayerIns setTransform:videoAssetTrack.preferredTransform atTime:kCMTimeZero];//得到视频素材(这个例子中只有一个视频) AVMutableVideoCompositionInstruction *videoCompositionIns = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; [videoCompositionIns setTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration)];//得到视频轨道(这个例子中只有一个轨道) AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; videoComposition.instructions = @[videoCompositionIns]; videoComposition.renderSize = CGSizeMake(...);//裁剪出对应的大小 videoComposition.frameDuration = CMTimeMake(1, 30);

    4.导出

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality]; exporter.videoComposition = videoComposition; exporter.outputURL = [NSURL fileURLWithPath:_outputFilePath isDirectory:YES]; exporter.outputFileType = AVFileTypeMPEG4; exporter.shouldOptimizeForNetworkUse = YES; [exporter exportAsynchronouslyWithCompletionHandler:^{ if (exporter.error) { //... }else{ //... } }];

    以上文章转载自:http://blog.csdn.net/xiaolinyeyi/article/details/50878996

    转载请注明原文地址: https://ju.6miu.com/read-671470.html

    最新回复(0)