`
jsntghf
  • 浏览: 2532516 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

视频的合成

    博客分类:
  • iOS
阅读更多

这里只列出视频合成的核心代码,具体的请参考附件。

 

- (IBAction)MergeAndSave:(id)sender {
    if(firstAsset != nil && secondAsset != nil){
        [ActivityView startAnimating];
        AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
        AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
       
        AVMutableCompositionTrack *secondTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        [secondTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:firstAsset.duration error:nil];
        
        if(audioAsset != nil){
            AVMutableCompositionTrack *AudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
            [AudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, secondAsset.duration)) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];
        } 
        
        AVMutableVideoCompositionInstruction *MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
        MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, secondAsset.duration));
        
        AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];
        AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        UIImageOrientation FirstAssetOrientation_ = UIImageOrientationUp;
        BOOL isFirstAssetPortrait_ = NO;
        CGAffineTransform firstTransform = FirstAssetTrack.preferredTransform;
        if(firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0) {FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES;}
        if(firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0) {FirstAssetOrientation_ =  UIImageOrientationLeft; isFirstAssetPortrait_ = YES;}
        if(firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0)  {FirstAssetOrientation_ =  UIImageOrientationUp;}
        if(firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0) {FirstAssetOrientation_ = UIImageOrientationDown;}
        CGFloat FirstAssetScaleToFitRatio = 320.0 / FirstAssetTrack.naturalSize.width;
        if(isFirstAssetPortrait_) {
            FirstAssetScaleToFitRatio = 320.0 / FirstAssetTrack.naturalSize.height;
            CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);
            [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero];
        } else {
            CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);
            [FirstlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:kCMTimeZero];
        }
        [FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];
        
        AVMutableVideoCompositionLayerInstruction *SecondlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:secondTrack];
        AVAssetTrack *SecondAssetTrack = [[secondAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        UIImageOrientation SecondAssetOrientation_ = UIImageOrientationUp;
        BOOL isSecondAssetPortrait_ = NO;
        CGAffineTransform secondTransform = SecondAssetTrack.preferredTransform;
        if(secondTransform.a == 0 && secondTransform.b == 1.0 && secondTransform.c == -1.0 && secondTransform.d == 0) {SecondAssetOrientation_= UIImageOrientationRight; isSecondAssetPortrait_ = YES;}
        if(secondTransform.a == 0 && secondTransform.b == -1.0 && secondTransform.c == 1.0 && secondTransform.d == 0) {SecondAssetOrientation_ =  UIImageOrientationLeft; isSecondAssetPortrait_ = YES;}
        if(secondTransform.a == 1.0 && secondTransform.b == 0 && secondTransform.c == 0 && secondTransform.d == 1.0) {SecondAssetOrientation_ =  UIImageOrientationUp;}
        if(secondTransform.a == -1.0 && secondTransform.b == 0 && secondTransform.c == 0 && secondTransform.d == -1.0) {SecondAssetOrientation_ = UIImageOrientationDown;}
        CGFloat SecondAssetScaleToFitRatio = 320.0 / SecondAssetTrack.naturalSize.width;
        if(isSecondAssetPortrait_) {
            SecondAssetScaleToFitRatio = 320.0 / SecondAssetTrack.naturalSize.height;
            CGAffineTransform SecondAssetScaleFactor = CGAffineTransformMakeScale(SecondAssetScaleToFitRatio,SecondAssetScaleToFitRatio);
            [SecondlayerInstruction setTransform:CGAffineTransformConcat(SecondAssetTrack.preferredTransform, SecondAssetScaleFactor) atTime:firstAsset.duration];
        } else {
            ;
            CGAffineTransform SecondAssetScaleFactor = CGAffineTransformMakeScale(SecondAssetScaleToFitRatio,SecondAssetScaleToFitRatio);
            [SecondlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(SecondAssetTrack.preferredTransform, SecondAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:firstAsset.duration];
        }
       
        MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,SecondlayerInstruction, nil];;
        
        AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];
        MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction];
        MainCompositionInst.frameDuration = CMTimeMake(1, 30);
        MainCompositionInst.renderSize = CGSizeMake(320.0, 480.0);
        
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];	
        NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];
        
        NSURL *url = [NSURL fileURLWithPath:myPathDocs];
        
        AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
        exporter.outputURL = url;
        exporter.outputFileType = AVFileTypeQuickTimeMovie;
        exporter.videoComposition = MainCompositionInst;
        exporter.shouldOptimizeForNetworkUse = YES;
        [exporter exportAsynchronouslyWithCompletionHandler:^
         {
             dispatch_async(dispatch_get_main_queue(), ^{
                 [self exportDidFinish:exporter];
             });
         }];
    }
}
分享到:
评论

相关推荐

    QT+ffmpeg 将多路视频合成一个视频存储并播放

    QT+ffmpeg将多路视频合成一个视频存储并播放是一个常见的多媒体处理任务,涉及到的主要知识点包括QT框架、FFmpeg库以及视频编码与解码原理。QT是一个跨平台的应用程序开发框架,广泛用于创建图形用户界面和其他应用...

    FLASH制作视频合成播放

    在IT领域,Flash是一款曾广泛应用于网页动画制作、交互设计以及视频合成的软件。本话题主要探讨的是如何使用Flash来制作视频合成并实现播放。在 Flash 中,视频合成与播放涉及多个关键步骤和技术,包括导入视频、...

    IOS开发 视频合成

    在iOS开发中,视频合成是一项重要的技术,它允许开发者将多个视频片段合并成一个单一的视频文件,同时可能还需要处理如叠加图像、文字等元素。本教程将详细讲解如何在iOS应用中实现视频合成,主要关注苹果的...

    视频合成工具

    视频合成工具是数字媒体制作领域中的重要软件,主要用于将多个视频源、图像、音频以及其他多媒体元素结合在一起,创建出全新的视觉效果。这类工具在视频编码过程中尤其关键,尤其是在处理多视角合成时,能够帮助用户...

    ios视频合成

    在iOS平台上,视频合成是一项常见的任务,特别是在开发多媒体应用程序时。SDK(Software Development Kit)提供了必要的工具和技术,使得开发者能够方便地处理视频内容,包括将两个视频前后整合在一起,并添加音频。...

    音频、视频合成

    本项目“音频、视频合成”旨在教你如何在iOS平台上实现这一功能,特别是取消原视频音轨并添加新的音频轨道,从而创建一个新的视听作品。 在iOS中,苹果提供了AVFoundation框架,这是一个强大的多媒体处理库,用于...

    cpp-Natron免费开源的视频合成软件

    Natron是一款免费且开源的视频合成软件,专为那些寻求类似Adobe After Effects和The Foundry的Nuke体验但不希望支付高昂费用的用户设计。它基于Node-graph技术,这意味着用户可以通过构建连接各个处理节点的图形工作...

    微信小程序多个视频合成一个播放。一个播放完自动在播放另一个。自定义视频进度组件

    微信小程序多个视频合成一个播放。一个播放完自动在播放另一个。给用户一种只播放了一个视频的错觉。 我们有多个视频但是后端合成一个视频的成本比较高希望前端合并。所以只能一个video标签通过显示不通的src来一个...

    ffmpeg完成音视频合成

    1. **音频分离与视频分离**:在进行音视频合成之前,可能需要先对源文件进行音视频分离,即将一个包含音频和视频的文件分解为单独的音频和视频流。 2. **音频处理**:可能需要对音频进行剪辑、调整音量、混音等...

    QT+FFmpeg多路视频合成

    【QT+FFmpeg多路视频合成】是一种技术,它结合了QT框架和FFmpeg库的能力,使得在QT环境中可以处理和合并多个视频流。QT是一个跨平台的应用程序开发框架,广泛用于创建图形用户界面和各种应用程序。而FFmpeg则是一个...

    将多路视频合成并放大某一个

    本程序实现了在QT平台上用ffmpeg将多路视频合成一起播放 合成视频的代码在combine文件中 注意:本代码运行后需将ffmpeg文件夹内bin文件夹里的.dll文件都复制在.exe文件的文件夹中程序才能正确运行 添加了可以将某个...

    GPUimageDemo分段录制,及视频合成

    在这个"GPUimageDemo分段录制,及视频合成"项目中,我们将探讨如何利用GPUImage来实现视频的分段录制以及最终的视频合成。 首先,我们要了解GPUImage的基本概念。GPUImage是由Brad Larson创建的一个开源库,它提供...

    VirtualDJ语音合成 音视频合成

    这款软件的亮点在于它的语音合成和音视频合成功能,极大地扩展了创作可能性。 语音合成技术在VirtualDJ中扮演着重要角色,它允许用户将文字转化为自然流畅的语音输出。这项技术基于先进的自然语言处理算法,能够将...

    WriteVideo_swamda9_writevideo_视频水印_视频分帧、添加水印、视频合成_图片合成视频_

    3. **视频合成**:视频合成是将多个视频片段或图片帧组合成一个新的视频文件的过程。这需要对时间轴进行管理,确保帧的顺序正确,同时处理可能存在的分辨率、帧率、编码格式不一致等问题。视频合成可以用于创建电影...

    iOS音视频合成

    在iOS开发中,音视频合成是一项常见的任务,它涉及到多媒体处理和播放技术。这个主题主要集中在如何将一个视频文件和一个音频文件合并成一个新的多媒体文件。以下是对这一知识点的详细阐述: 1. **多媒体框架介绍**...

    swift-XZAVMixObject音视频合成的一个小框架

    Swift-XZAVMixObject是一个专为音视频合成设计的小型框架,主要针对Swift开发者,尤其在音频处理领域。这个框架的出现,旨在简化音视频混合的复杂性,提供一个高效且易于使用的工具集,帮助开发者在iOS、macOS或其他...

    音视频合成.zip

    本主题聚焦于“音视频合成”这一过程,通过一个名为"音视频合成.zip"的压缩包,我们可以探讨其中涉及的关键知识点。 首先,我们要了解什么是音视频合成。音视频合成是指将音频轨道与视频轨道结合,生成一个新的...

    ios 屏幕录制及音视频合成

    音视频合成则是将音频流与视频流合并成一个完整的多媒体文件,常用于制作多媒体内容或者教育视频。在本话题中,我们将深入探讨如何在iOS上实现这些功能,以及如何保持低内存消耗。 首先,我们来讨论iOS的屏幕录制。...

    ios-视频合成录像.zip

    在iOS平台上进行视频合成录像是一项复杂而有趣的技术挑战,它涉及到多媒体处理、帧同步、音频编码等多个领域的知识。本文将深入探讨如何在iOS应用中实现这一功能,主要围绕以下几个核心知识点展开: 1. **多媒体...

Global site tag (gtag.js) - Google Analytics