iOS开发之音轨合成(音频与音频,音频与视频)
今天和大家一起分享关于音轨合成的坑(套路!全TM是套路!走一步套一路)
理论部分:
我们需要用到AVURLAsset
来初始化文件,然后用AVMutableComposition
和AVMutableCompositionTrack
来插入音轨,最后用AVAssetExportSession
来输出文件
先说音频和音频的合成
首先创建一个AVMutableComposition对象
AVMutableComposition *compostion = [AVMutableComposition composition];
然后通过下面的方法,得到一个AVMutableCompositionTrack对象
AVMutableCompositionTrack *video = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
这里的mediaType传入的是文件类型,因为我们即将插入的文件类型是音频,这里要选择AVMediaTypeAudio,支持的类型见下图
![](http://upload-images.jianshu.io/upload_images/1223913-a8f51733d54e1943.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接下里就是插入了,有insert和inserts两种插入方式,我们先选择第一种
[video insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[videoAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
同样的步骤,我们再次插入另一条音轨
AVMutableCompositionTrack *audio = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0]; [audio insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
这样我们就把两条音轨都混合到一起了,接下来就是把它输出成文件,这时候我们需要创建一个Session
AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:compostion presetName:AVAssetExportPresetAppleM4A];
其中 presetName
这个参数非常坑人,必须文件的后缀和这里设定的格式相互呼应才行,否则文件无法创建,格式也是五花板门,有兴趣的小伙伴可以自己试试~
![](http://upload-images.jianshu.io/upload_images/1223913-4822d5c1feaf170e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有一些设置需要给出,否者输出时程序会crash掉
1.首先是输出路径,切记切记这里的后缀一定要和上面选择的呼应,比如我写的格式为AVAssetExportPresetAppleM4A
那么我的文件后缀就需要为.m4a,如果用.MP3这种的话是无法正确生成出文件的,有可能会出现空文件的存在.一定要注意!!!
2.则是输出文件类型,这个更是个坑,一不留神就崩了,也是和上面的设置有关,需要给出一个输出类型,根据所选的不同,支持的类型也不同,可以通过[session supportedFileTypes]
查询,然后根据需要填写对应的类型.(这里一定要先查询,否则很容易因为不支持而crash掉)
3.是否优化,属于可选,但是一般都选择YES
session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
session.outputFileType = @"com.apple.m4a-audio";
session.shouldOptimizeForNetworkUse = YES;
设置完以上之后,我们只需要执行
"[session exportAsynchronouslyWithCompletionHandler:^{ if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath]) { // 调用播放方法 [self playAudio:[NSURL fileURLWithPath:outPutFilePath]]; } else { NSLog(@"输出错误"); } }];"
就可以输出了.个人推荐在里面做个判断,因为无论合成失败或者成功,都会调用block内的方法,但是如果失败则不会生成文件.可以通过这个来判是否合成成功.
插入多个
苹果还提供了一个inserts
的函数,我们来试试是否可以批量插入
CMTimeRange range = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
[video insertTimeRanges:@[[NSValue valueWithCMTimeRange:range],[NSValue valueWithCMTimeRange:range]] ofTracks:@[[videoAsset tracksWithMediaType:AVMediaTypeAudio].firstObject,[audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject] atTime:kCMTimeZero error:nil];
运行!结果是依然还是一条音轨,原来这是个批量添加到尾部音轨的函数,即当A音轨播放完后,B音轨接着A后面无缝添加,而不是同时添加音轨.
音频和视频
大体上和上面一样,我们只需要注意改几个参数就好了
AVMutableCompositionTrack *video = [compostion addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:0];
[video insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[videoAsset tracksWithMediaType:AVMediaTypeVideo].firstObject atTime:kCMTimeZero error:nil];
因为是视频,所以原来的Audio要全部改成Video
AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:compostion presetName:AVAssetExportPresetMediumQuality];
这里的presetName
和outputFileType
都要换成一个视频格式,注意不同的presetName
会产生不同的outputFileType
一定要填写相对应的支持类型,否则会直接crash!
![](http://upload-images.jianshu.io/upload_images/1223913-3d98889b3e16b3c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
文章参考资料
http://blog.csdn.net/linzhiji/article/details/6736704
http://www.jianshu.com/p/9f83af9dbbef
写在最后
如果有什么遗漏或者错误欢迎指正,共同进步!
附上Demo地址:https://github.com/WeiTChen/multitrackerDemo
原创作品,转载请注明出处
原文链接:http://www.jianshu.com/p/76e0c4e684db
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
iOS开发之音轨合成(音频与音频,音频与视频)相关推荐
- iOS开发—二维码扫描-郭宏志-专题视频课程
iOS开发-二维码扫描-3869人已学习 课程介绍 本课程由扣丁学堂教学总监郭宏志老师讲授,主要讲解了iOS开发专题中的二维码扫描这一专题,内容包含了二维码扫描中的全部知识,让学员更多 ...
- iOS开发中的神兵利器 [实战系列]-李发展-专题视频课程
iOS开发中的神兵利器 [实战系列]-11758人已学习 课程介绍 - 140节课程讲解GitHub中近百个过千star的iOS热门开源项目 - 市面上唯一大规模讲解热门的iOS开源项 ...
- ios开发闹钟源代码_开源源码让短视频的开发变得更加便捷
对外开放源码(开源系统源代码)指的是该源代码的软件著作使用者将其所拥有的初始码公布,容许大家应用.改动发售的手机软件或设计方案体. 刚开始朋友会感觉"开源系统源代码"这一专有名词与 ...
- iOS开发-自定义相机(仿微信)拍照、视频录制
网上有很多自定义相机的例子,这里只是我临时写的一个小demo,仅供参考: 用到了下面几个库: #import <AVFoundation/AVFoundation.h> #import & ...
- ios开发之音频视频开发
一.音频播放方式 1.System Sound Services 2.AVAudioPlayer 3.Audio Queue Service 4.OpenAL 二.使用 1.System Sound ...
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)
概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...
- IOS开发基础之音频工具类封装AVAudioPlayer
IOS开发基础之音频工具类封装AVAudioPlayer 源码在我的主页下面 ,项目名称是AVAudioPlayer 关键性代码 工具类的封装 // // LJAudioTool.h // AVAud ...
- 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...
- iOS开发拓展篇—音频处理(音乐播放器3)
iOS开发拓展篇-音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...
最新文章
- pandas使用groupby函数进行分组聚合并使用agg函数将每个分组特定变量对应的多个内容组合到一起输出(merging content within a specific column of g
- fish shell 简要教程以及对bash的兼容性讨论。
- HTML5学习笔记简明版(9):变化的元素和属性
- Python 面向对象编程
- hive币2021年预计涨到多少_星时代云播|IPFS/Filecoin的价值被严重低估, FIL能不能涨到300美金?...
- 关于肺结节检测相关的FROC曲线和目标检测中Precision-Recall曲线,ROC曲线,mAP,AP,APs,APm,APl,AP0.5等的理解。
- php获取用户真实IP和防刷机制的实例代码
- python初学者教程下载_初学者Python教程
- 软考高级 真题 2011年上半年 信息系统项目管理师 案例分析
- controller实现
- P4745 B’s problem(b)
- 满屏飞舞的心HTML动画,CSS3制作蝴蝶飞舞动画
- 人机交互课堂分享 手势交互与体感交互
- 【论文相关】论文管理神器-zotero(最详细的使用说明)
- Flutter学习第十四天:Flutter类似于淘宝的首页照片墙功能,让你的界面更加美观灵活?
- 华东师大计算机系博士几年,2018华东师范大学就业结果公布!就业率超97%,博士生月薪1.1万!...
- c语言中int作用,c语言中int的用法(5页)-原创力文档
- windows 查看当前目录及文件
- JPEGLS图像压缩算法的FPGA实现(一)压缩算法
- Java 八大基本类型
热门文章
- Ubuntu 16.04 设置菜单栏位置
- 进去qq群的网站,点击加群组件
- java计算机毕业设计Web闲置服装交易平台源码+mysql数据库+系统+lw文档+部署
- Linux第六章:3.linux下创建文件夹(创建目录)、使用mkdir命令创建单级和多级目录、linux下删除文件夹(目录),rmdir命令、rm -rf、touch命令创建文件
- which,whereis 的区别(Linux )
- 我的计算机窗口打不开,我的电脑打不开,双击出现选择打开程序窗口
- 知识积累-KBOX2
- Linux RCU 机制详解
- http请求头相关解释
- Qt中Format_ARGB32和Format_ARGB32_Premultiplied的区别