AVFoundation - 音视频组合编辑

这篇具有很好参考价值的文章主要介绍了AVFoundation - 音视频组合编辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、简要说明

相关类

  • AVMutableComposition
  • AVMutableCompositionTrack

二、使用

1、音频和视频合成

- (void)testCom1{
  
    AVMutableComposition *mutableComposition = [AVMutableComposition composition];
     
    AVMutableCompositionTrack *compositionVideoTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                                       preferredTrackID:kCMPersistentTrackID_Invalid];
  
    AVMutableCompositionTrack *compositionAudioTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                                       preferredTrackID:kCMPersistentTrackID_Invalid];
    
  // 获取资源
    AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:self.movieFile1 options:nil];
    AVURLAsset *asset2 = [[AVURLAsset alloc] initWithURL:self.musicFile1 options:nil];
 
    AVAssetTrack *videoAssetTrack  = [asset1 tracksWithMediaType:AVMediaTypeVideo][0];
    AVAssetTrack *audioAssetTrack  = [asset2 tracksWithMediaType:AVMediaTypeAudio][0];
     
     
    // 指定位置放入 视频和 音频
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration)
                                   ofTrack:videoAssetTrack
                                    atTime:kCMTimeZero
                                     error:nil];
 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration)
                                   ofTrack:audioAssetTrack
                                    atTime:kCMTimeZero
                                     error:nil]; 
  
  
    AVAssetExportSession *assetExportSession = [[AVAssetExportSession alloc] initWithAsset:mutableComposition
                                                                                presetName:AVAssetExportPreset1280x720]; 
    NSTimeInterval timestamp = [NSDate timeIntervalSinceReferenceDate];
    NSString *filename = [NSString stringWithFormat:@"%f.m4a", timestamp];
    NSString *docsDir = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES).firstObject;
    NSString *destPath = [docsDir stringByAppendingPathComponent:filename];
    NSString *composedMoviePath = [NSURL fileURLWithPath:destPath];
    
    
    // 导出
    NSURL *composedMovieUrl = [NSURL fileURLWithPath:composedMoviePath];
    assetExportSession.outputFileType              = AVFileTypeQuickTimeMovie;
    assetExportSession.outputURL                   = composedMovieUrl;
    assetExportSession.shouldOptimizeForNetworkUse = YES;
    
    NSLog(@"composedMovieUrl : %@",composedMovieUrl);
    
  
    [assetExportSession exportAsynchronouslyWithCompletionHandler:^{
        switch (assetExportSession.status) {
            case AVAssetExportSessionStatusFailed: {
                NSLog(@"生成失敗");
                break;
            }
            case AVAssetExportSessionStatusCancelled: {
                NSLog(@"生成会话被取消");
                break;
            }
            default: {
                NSLog(@"生成完了");
                [[NSWorkspace sharedWorkspace] selectFile:composedMovieUrl.path inFileViewerRootedAtPath:nil];
                break;
            }
        }
    }];
}


2、视频的拼接

#pragma mark - 视频的拼接
- (void)testCom2
{
    AVMutableComposition *mutableComposition = [AVMutableComposition composition];
     
    AVURLAsset *videoAsset1 = [[AVURLAsset alloc] initWithURL:self.movieFile1 options:nil];  // URLHookmark
    AVURLAsset *videoAsset2 = [[AVURLAsset alloc] initWithURL:self.movieFile2 options:nil];  // FurShader 无声
     
    AVAssetTrack *videoAssetTrack1 = [videoAsset1 tracksWithMediaType:AVMediaTypeVideo][0];
    AVAssetTrack *audioAssetTrack1 = [videoAsset1 tracksWithMediaType:AVMediaTypeAudio][0];
    
    AVAssetTrack *videoAssetTrack2 = [videoAsset2 tracksWithMediaType:AVMediaTypeVideo][0];
    AVAssetTrack *audioAssetTrack2 = [videoAsset2 tracksWithMediaType:AVMediaTypeAudio][0];
     
    AVMutableCompositionTrack *compositionVideoTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                                       preferredTrackID:kCMPersistentTrackID_Invalid];
    // 音声合成用の`AVMutableCompositionTrack`を生成
    AVMutableCompositionTrack *compositionAudioTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                                       preferredTrackID:kCMPersistentTrackID_Invalid];
     
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack1.timeRange.duration)
                                   ofTrack:videoAssetTrack1
                                    atTime:kCMTimeZero
                                     error:nil];
 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack1.timeRange.duration)
                                   ofTrack:audioAssetTrack1
                                    atTime:kCMTimeZero
                                     error:nil];
    
    // 追加
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAssetTrack2.timeRange.duration)
                                   ofTrack:videoAssetTrack2
                                    atTime:videoAssetTrack1.timeRange.duration
                                     error:nil];
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack2.timeRange.duration)
                                   ofTrack:audioAssetTrack2
                                    atTime:audioAssetTrack1.timeRange.duration
                                     error:nil];
   
  
    AVAssetExportSession *assetExportSession = [[AVAssetExportSession alloc] initWithAsset:mutableComposition
                                                                                presetName:AVAssetExportPreset1280x720];
 
    
    // エクスポートファイルの設定
    NSString *composedMovieDirectory = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString *composedMoviePath      = [NSString stringWithFormat:@"%@/%@", composedMovieDirectory, @"test.mp4"];
    
    // すでに合成動画が存在していたら消す
    NSFileManager *fileManager = NSFileManager.defaultManager;
    if ([fileManager fileExistsAtPath:composedMoviePath]) {
        [fileManager removeItemAtPath:composedMoviePath error:nil];
    }
    
    // 保存設定
    NSURL *composedMovieUrl = [NSURL fileURLWithPath:composedMoviePath];
    assetExportSession.outputFileType              = AVFileTypeQuickTimeMovie;
    assetExportSession.outputURL                   = composedMovieUrl;
    assetExportSession.shouldOptimizeForNetworkUse = YES;
    
    NSLog(@"composedMovieUrl : %@",composedMovieUrl);
    
    // 動画をExport
    [assetExportSession exportAsynchronouslyWithCompletionHandler:^{
        
                switch (assetExportSession.status) {
                    case AVAssetExportSessionStatusFailed: {
                        NSLog(@"生成失敗");
                        break;
                    }
                    case AVAssetExportSessionStatusCancelled: {
                        NSLog(@"生成会话被取消");
                        break;
                    }
                    default: {
                        NSLog(@"生成完了");
        //                if (self.handler) {
        //                    self.handler(composedMovieUrl);
        //                }
                        [[NSWorkspace sharedWorkspace] selectFile:composedMovieUrl.path inFileViewerRootedAtPath:nil];
                        break;
                    }
                }
    }];
}

伊织 2020-03-02文章来源地址https://www.toymoban.com/news/detail-609298.html

到了这里,关于AVFoundation - 音视频组合编辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FFmpeg 音视频开发工具

    目录 FFmpeg 下载与安装 ffmpeg 使用快速入门 ffplay 使用快速入门 1、FFmpeg 是处理音频、视频、字幕和相关元数据等多媒体内容的库和工具的集合。一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。 官网:https://www.ffmpeg.org/ 源码:https://github.com/FFmpeg/FFmpeg。

    2024年02月15日
    浏览(57)
  • 音视频技术开发周刊 | 305

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 大神回归学界:何恺明宣布加入 MIT 「作为一位 FAIR 研究科学家,我将于 2024 年加入麻省理工学院(MIT)电气工程与计算机科学系 EECS 担任教职。」 AI 领域的著名学者,ResNet 发明人何恺明,最近在

    2024年02月14日
    浏览(52)
  • 音视频技术开发周刊 | 285

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 GPT-4 Office全家桶发布 谷歌前脚刚宣布AI工具整合进Workspace,微软后脚就急匆匆召开了发布会,人狠话不多地祭出了办公软件王炸——Microsoft 365 Copilot,再次闪瞎全世界。从此,不管是Word、PPT、Exce

    2024年02月02日
    浏览(67)
  • 音视频技术开发周刊 | 297

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 Geenee AR为品牌商和零售商提供虚拟试穿应用 这意味着Geenee AR的虚拟试穿解决方案能够与品牌商现有的销售渠道无缝集成。 谁说苹果掉队了?WWDC上只字未提AI,却已低调入场大模型 尽管苹果没有在

    2024年02月08日
    浏览(51)
  • 音视频技术开发周刊 | 298

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 AI艺术在北京798,展望人工智能与环境的未来 本文很有意思的提出了个假设,通过人工智能和艺术家协作与实践产生环绕地球的叙事,去开启置身于AI时代与生态之中的想象。在这种协作中,如何重

    2024年02月09日
    浏览(50)
  • 音视频技术开发周刊 | 284

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 Google联合多加巨头推出ML基础设施:OpenXLA 阿里巴巴,AWS,AMD,Apple,Arm,NVIDIA都在其中。 https://opensource.googleblog.com/2023/03/openxla-is-ready-to-accelerate-and-simplify-ml-development.html 万字长文,探讨关于ChatGP

    2023年04月09日
    浏览(69)
  • 音视频技术开发周刊 | 306

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 人工智能研究人员声称,通过Zoom音频检测击键的准确率为93% 通过记录按键并训练深度学习模型,三位研究人员声称,基于单个按键的声音特征,他们在解释远程按键方面的准确率达到了90%以上。

    2024年02月12日
    浏览(60)
  • 音视频技术开发周刊 | 302

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 ChatGPT神器Code Interpreter终于开放,到底怎么用?这里有一份保姆级教程 Code Interpreter 已经正式开放。 上海世界AI大会:MidJourney名字的来源是庄子? MidjourneyCEO大卫·霍尔兹在2023世界人工智能大会上发

    2024年02月16日
    浏览(43)
  • 音视频技术开发周刊 | 317

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 MIT惊人再证大语言模型是世界模型!LLM能分清真理和谎言,还能被人类洗脑 MIT等学者的「世界模型」第二弹来了!这次,他们证明了LLM能够分清真话和假话,而通过「脑神经手术」,人类甚至还能

    2024年02月07日
    浏览(50)
  • 音视频技术开发周刊 | 273

    每周一期,纵览音视频技术领域的干货。 新闻投稿:contribute@livevideostack.com。 「紧急通知」LiveVideoStackCon 2022 音视频技术大会北京站改期 各位LVSer们: 因疫情影响,北京近期不再允许举办大型线下活动,我们无奈且抱歉的通知大家LiveVideoStackCon 2022音视频技术大会北京站大会

    2023年04月22日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包