iOS开发--AVFoundation视频合成(添加背景音乐)

音视频编辑合成,配音合成视频。 最近接触英语学习类app,根据视频跟读句子,完成配音作业,然后将自己的多个录音和原视频合成为一个新的视频。 之前看过几篇类似的博客,都是写一个视频和一个音频合成,要么是一个视频去掉音频,提取音频之类的。但是都没有多个音频根据时间节点拼接到原有的视频中去,或者理解为替换该节点的音频。 ⚠️⚠️最近发现一个问题,iphoneXR/iphoneXS音频和视频合并会失败,主要错在于输出... 阅读详情

前言

当下音视频处理的技术的重要性不言而喻, FFmpeg的强大不可撼动, 但是, 确实难啃. 由简递难, 我们来看看苹果原生的API如何做到对视频素材进行处理的.

AVFoundation既可以对视频进行播放, 同时也可以对视频素材进行处理, 此类合成共分为两章:

  1. 简单视频合成
  2. 视频与音频的合成

正文

知识点
  1. AVMutableComposition 合成工具
  2. AVMutableCompositionTrack 合成工具中的轨道
  3. AVAsset 视频素材的载体
  4. AVAssetTrack 素材轨道
  5. AVAssetExportSession 输出工具
过程简述

过程简单而言, 就是将素材中的素材轨道, 按照自定义顺序或者形式, 放到合成工具的对应的轨道, 最后, 设定好参数, 通过输出工具将合成工具中的内容一键合成并且输出.

代码

下面是核心代码, 详细的请参考 Demo_AVFoundationCompound

	// 这里将video的内容倒叙操作,为了后面将视频  逐个插入0的位置
    videoPaths = [[videoPaths reverseObjectEnumerator] allObjects];
    // 合成工具
    AVMutableComposition *composition = [AVMutableComposition composition];
    
    // 创建获取素材参数, 这个可以直接为nil, 下方的参数含义是获取素材参数的时间为非精准, 默认为精准
    NSDictionary *optDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                                                        forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
    // 合成工具的视频轨道
    __block AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    // 合成工具的音频轨道
    __block AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

    // 遍历视频资源
    [videoPaths enumerateObjectsUsingBlock:^(NSURL *videoPath, NSUInteger idx, BOOL * _Nonnull stop) {
        // 素材
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoPath options:optDict];
        // 获取素材中的轨道_视频
        NSArray<AVAssetTrack *> *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
        if (videoTracks <= 0) {
            *stop = YES;
            completedBlock(NO, @"合成失败");
            return;
        }
        // 获取当前视频的时间长度
        CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
        // 素材的视频轨道
        AVAssetTrack *videoCompositionTrack = videoTracks.firstObject;
        // 设置合成工具的preferredTransform
        [compositionVideoTrack setPreferredTransform:videoCompositionTrack.preferredTransform];
        // 将素材的视频轨道添加到合成工具的视频轨道
        [compositionVideoTrack insertTimeRange:timeRange
                                       ofTrack:videoTracks.firstObject
                                        atTime:kCMTimeZero
                                         error:nil];

        // 下面是处理原视频中的音频, 静音的话, 可以不处理
        NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
        if (audioTracks.count > 0) {
            // 将素材的音频轨道添加到合成工具的音频轨道
            [compositionAudioTrack insertTimeRange:timeRange
                                           ofTrack:audioTracks.firstObject
                                            atTime:kCMTimeZero
                                             error:nil];
        }
    }];
    
    // 存在旧数据, 删除旧数据
    if ([[NSFileManager defaultManager] fileExistsAtPath:compoundVideoPath]) {
        NSError *error;
        [[NSFileManager defaultManager] removeItemAtPath:compoundVideoPath error:&error];
    }
    
    NSURL *outUrl = [NSURL fileURLWithPath:compoundVideoPath];
    // 输出工具
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality];
    // 输出类型
    exporter.outputFileType = AVFileTypeMPEG4;
    // 输出路径
    exporter.outputURL = outUrl;
    // 优化
    exporter.shouldOptimizeForNetworkUse = YES;
    [exporter exportAsynchronouslyWithCompletionHandler:^{
        BOOL isSuccess = NO;
        NSString *msg = @"合并完成";
        switch (exporter.status) {
            case AVAssetExportSessionStatusFailed:
                NSLog(@"MediaManager -> combinationVidesError: %@", exporter.error.localizedDescription);
                NSLog(@"%@", exporter.error);
                msg = @"合并失败";
                break;
            case AVAssetExportSessionStatusUnknown:
            case AVAssetExportSessionStatusCancelled:
                break;
            case AVAssetExportSessionStatusWaiting:
                break;
            case AVAssetExportSessionStatusExporting:
                break;
            case AVAssetExportSessionStatusCompleted:
                isSuccess = YES;
                break;
        }
        if (completedBlock) {
            completedBlock(isSuccess, msg);
        }
    }];

添加背景音乐

添加背景音乐, 其实就是再添加一条音轨.

	// 背景音乐 合成轨道
	AVMutableCompositionTrack *compositionBGMAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

	// 背景音乐
	AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:audioPath options:optDict];
	CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, allTime);
	NSArray *bgmTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
	[compositionBGMAudioTrack insertTimeRange:timeRange
                                      ofTrack:bgmTracks.firstObject
                                       atTime:kCMTimeZero
                                        error:nil];
使用AVFoundation在iOS应用程序中实现视频播放和音频功能 接着,我们添加了控制视频播放的按钮,并实现了相应的播放和暂停操作。在上面的代码中,我们添加了一个名为"playButton"的UIButton,并为其添加了一个点击事件。在上面的代码中,我们创建了一个名为"AudioPlayer"的类,并在其中定义了一个playAudio()方法。在上面的代码中,我们创建了一个AVPlayer对象,并使用AVPlayerItem加载视频的URL。请注意,上述代码示例中的视频和音频文件的URL都是示例URL,你需要将其替换为你自己的URL或本地文件路径。 阅读详情

相关推荐

Unity3D高清视频播放解决方案:AVPro Video插件实战指南

本文还有配套的精品资源,点击获取 简介:AVPro Video是一个专业的Unity3D游戏引擎高清视频播放插件,提供广泛的视频格式支持、硬件加速、多声道音频处理、实时视频裁剪缩放功能和网络流媒体支持。它具备完善的API接口,让开发者可以轻松实现视频播放控制和交互,如自定义播放操作和360度全景视频播放。此插件还优化了移动设备的视频播放性能,并支持动态加载机制。AVPro ...

weixin_42551310的博客 2万+

解决取出音轨[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 报错的问题

今天合成视频的时候遇到了这个问题,报错的内容是 -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array 出错的代码是 [AudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, item.asset.duration) ofTrack:[[item.a

woshiwls的专栏 5449

在iOS中实现背景音乐及声效的高级播放技术

本文还有配套的精品资源,点击获取 简介:在iOS开发中,通过AVFoundation框架,开发者可以使用AVAudioPlayer播放背景音乐,以及利用AVAudioEngine处理复杂的音频混合和声效。本源码提供了一种可以独立控制背景音乐和声效音量的解决方案,旨在提升用户体验,并详细讲解了AVAudioPlayer、AVAudioEngine、音频节点、编程接口、线程管理...

weixin_26850469的博客 1830

探索iOS之AVFoundation框架

AVFoundation框架的业务层主要是AVKit和UIKit,内核层包括CoreVideo、CoreAudio、CoreMedia、VideoToolBox等。AVFoundation作为iOS的音视频框架,提供音视频播放、录制、编辑、编解码、音效设置等。

徐福记456 2425

Java网页访问报错?手把手教你解决JRE插件缺失和浏览器拦截问题(附详细截图)

本文针对Java网页访问时常见的JRE插件缺失和浏览器拦截问题,提供了详细的诊断与解决方案。文章首先解释了问题根源在于现代浏览器出于安全考虑停止了对Java插件的支持,然后手把手指导用户确认Java安装、在控制面板配置安全站点列表,并针对Chrome、Edge、Firefox等主流浏览器的不同拦截机制给出了具体的应对策略,最后提供了系统性的故障排查清单,帮助用户彻底解决访问障碍。

weixin_29233857的博客 223

如何使用Ray和PyTorch训练模型

用户编写训练函数 → 定义单机训练逻辑。通过扩缩容配置 → 指定需要多少资源(Worker 数量、CPU/GPU)。训练器整合训练函数和配置 → 自动将训练函数分发到多个 Worker 上并行执行。Worker 运行训练函数 → 在分布式环境中完成模型训练。通过这种模式,Ray Train 实现了对分布式训练的抽象,用户只需关注单机训练逻辑,无需手动管理分布式通信和资源分配。

m0_62464865的博客 1922

干货 | 移动端使用OpenGL转场特效的音视频合成应用

作者简介jzg,携程资深前端开发工程师,专注Android开发;zx,携程高级前端开发工程师,专注iOS开发;zcc,携程资深前端开发工程师,专注iOS开发。前言近年来短视频的火爆,让内容创作类的APP获得了巨大的流量。用户通过这类工具编辑自己的短视频,添加各式各样的炫酷特效,从而呈现出更加丰富多彩的视频内容。本文将会介绍如何使用移动端原生API,将图片添加转场特效并且最终合成为视频的基本流程。一...

携程技术 2881

YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3

目录YALMIP简介怎么在Matlab中加YALMIP?1. 创建决策变量:2. 添加约束:3. 参数配置4. 求解怎么在MatlabR2019a中加YALMIP?1.下载工具包2.放置工具包3.添加路径4.测试安装结果怎么在MatlabR2019a中加SDPT3? YALMIP简介 怎么在Matlab中加YALMIP? yalmip是一位“集大成者”,它不仅自己包含基本的线性规划求解算法,比如linprog(线性规划)、bintprog(二值线性规划)、bnb(分支界定算法)等,他还提供了对cpl

m0_51431440的博客 2万+

iOS视频裁剪、拼接、添加水印、添加背景音乐

利用GPUImage,实现视频的操作,GPUImage下载地址:点击打开链接 方法声明: ///使用AVfoundation添加水印 - (void)AVsaveVideoPath:(NSURL*)videoPath WithWaterImg:(UIImage*)img WithInfoDic:(NSDictionary*)infoDic WithFileName:(NSString*)fileName completion:(void(^)(NSURL*outputURL,BOOLisSuccess

翻肚鱼儿的博客 916

基于STM32的坐姿矫正与久坐提醒系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配MPU6050六轴姿态传感器、HC-SR04超声波测距模块,完整实现了坐姿矫正与久坐提醒系统的全流程开发,从多传感器数据采集、数字滤波、姿态解算、坐姿判断到多模式提醒,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 438

STM32 USB2.0 转 Type-C 接口设计与实现

本文详细介绍了STM32 USB2.0转Type-C接口的设计与实现方案,涵盖硬件电路设计、软件配置及调试技巧。重点解析Type-C接口的CC引脚配置和电源管理,提供设备模式、主机模式及双角色模式的实现方法,帮助开发者解决实际应用中的连接稳定性和ESD防护等问题,提升产品可靠性和兼容性。

blockchain9miner的博客 1020

ios AVFoundation框架给视频添加背景音乐的方法

/// 视频添加背景音乐 /// - Parameters: /// - videoURL: 视频文件URL /// - audioURL: 音频文件URL /// - startTime: 音频开始时间 /// - endTime: 音频结束时间 /// - isOriginal: 是否保留视频原音 /// - oriVolume: 视频原音音量 /// - newVolume: 新增背景音乐音量 ///

babylv1的博客 520

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6435

AVFoundation视频添加背景音乐(六)

前言 从本文开始逐渐学习iOS自带的多媒体处理框架,例如AVFoundation,VideoToolbox,CoreMedia,CoreVideo实现多媒体的处理,并且将实现方式以及效果和ffmpeg的方式做对比 给一个视频添加音乐,将多段音视频文件合并为一个文件是很常见的需求,AVFoundation就提供了这样的接口。 本文的目的: 为一段视频添加背景音乐 音视频合并相关流程 image.png 上图介绍了AVFoundation框架中关于合并音视频文件的相关的对象关系图,可以看到使用A

翻肚鱼儿的博客 741

S7-200 SMART PLC 数字量阀门控制功能块(FB)汇总

S7-200 SMART PLC功能块的各种写法可以查看专栏的其它文章,链接地址如下:S7-200 SMART PLC 子程序功能块(阀门控制)_RXXW_Dor的博客-优快云博客_plc控制阀门开关程序由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 4001

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2842

iOS视频添加背景音乐同时保留原音

IOS视频添加背景音乐同时保留原音//抽取原视频的音频与需要的音乐混合

BearsG 1975

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

iOS上视频剪辑片段和添加背景音乐

最近在研究剪辑视频,目前知道了怎么剪辑视频片段和添加背景音乐,不多说了,代码写的很清楚,如下:

jueyi1127的博客 7801

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

AVFoundation学习记录

AVFoundation学习记录

weixin_43648435的博客 719

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SwiftVideoGenerator 视频配乐指南:mergeVideoWithAudio 为视频替换背景音乐的完整方法

想把视频里枯燥的原始音轨换成动听的背景音乐?SwiftVideoGenerator 正是解决这个问题的开源神器。作为一款专为 iOS 打造的 Swift 视频处理库,SwiftVideoGenerator 提供了简单到极致的 `mergeVideoWithAudio` 方法,只需传入视频和音频两个 URL,就能一键完成视频背景音乐替换。本指南将带你从零开始,掌握用 mergeVideoWithAu

gitblog_00425的博客 258

php上传音乐 ios,iOS视频添加音乐 去除原声

如果是预览视频,添加音乐这个很简单,使用AVAudioPlayer来播放音乐,目前我所做的是播放导入在工程本地的音乐文件,在线网络音乐添加尚未涉及。视频播放使用AVplayer。 下面是切换背景音乐的方法:-(void)anotherMusic:(NSURL*)urlwithVolume:(CGFloat)volume{_usingMusic=YES;_musicUrl=url;_mu...

weixin_39636707的博客 261

视频编辑工具:添加水印、特效、音乐、导出视频、视频转gif

githud传送门:NHAVEditor 基于 AVFoundation 框架封装的 iOS视频编辑工具,支持给视频添加水印、特效、音乐、导出视频、视频转gif iOS: >= 9.0 使用方法: 导入头文件: #import "NHAVEditor.h" #import "NHAVEditorHeader.h" #import "NHGifWriter.h" #import "N...

nenhall的博客 1162

iOS视频处理之--视频截取及添加背景音乐

http://www.jianshu.com/p/aefacc2cf039 这段时间由于工作需要,了解了一些关于iOS中视频处理功能,发现AVFoundation功能强大,今天聊一聊视频截取和添加背景音乐的一些功能,这里面涉及到得一些类类名和方法都比较长,但是用法还是相对简单,主要是能理解多媒体的一些概念,先来介绍一下常用到的几个AVFoundation下得类: AVURLAsse

jeffasd的专栏 1857

AVFoundation之视频

视频合并//本地视频-(void)mergeAsset:(AVAsset *)firstAsset WithAsset:(AVAsset *)secondAsset{ if (firstAsset !=nil && secondAsset!=nil) { //1.创建一个AVMutableComposition实例,它将持有AVMutableCompositionTrack实例

yanyanforest的专栏 4万+

iOS 视频剪辑 (添加水印,裁剪,合并视频,添加背景音乐)

转自:https://www.jianshu.com/p/16cb14f53933iOS 视频剪辑 (添加水印,裁剪,合并视频,添加背景音乐)最近突发奇想想要了解点视频处理的东西,通过 google,github 等资源自给整理了这些资料,网上资源很多,代码部分很多也都是复制粘贴别人的东西,加上一点自己的注释。废话不多说,直接上代码吧,希望能帮到一些 people~添加水印p.p1 {margin...

zhanglizhi111的博客 3160
上一篇: iOS开发--AVFoundation进行视频合成, 导出结果旋转90度问题
下一篇: iOS开发--摄像头捕获数据处理卡顿的处理
单细胞的逻辑
博客等级 码龄10年 19粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值