今天和大家一起分享关于音轨合成的坑(套路!全TM是套路!走一步套一路)

理论部分:

我们需要用到AVURLAsset来初始化文件,然后用AVMutableCompositionAVMutableCompositionTrack来插入音轨,最后用AVAssetExportSession来输出文件

先说音频和音频的合成

首先创建一个AVMutableComposition对象
AVMutableComposition *compostion = [AVMutableComposition composition];
然后通过下面的方法,得到一个AVMutableCompositionTrack对象
AVMutableCompositionTrack *video = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
这里的mediaType传入的是文件类型,因为我们即将插入的文件类型是音频,这里要选择AVMediaTypeAudio,支持的类型见下图

可选类型

接下里就是插入了,有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这个参数非常坑人,必须文件的后缀和这里设定的格式相互呼应才行,否则文件无法创建,格式也是五花板门,有兴趣的小伙伴可以自己试试~

各种输出格式

有一些设置需要给出,否者输出时程序会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];

这里的presetNameoutputFileType都要换成一个视频格式,注意不同的presetName会产生不同的outputFileType一定要填写相对应的支持类型,否则会直接crash!

必须是其中的类型

文章参考资料

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开发之音轨合成(音频与音频,音频与视频)相关推荐

  1. iOS开发—二维码扫描-郭宏志-专题视频课程

    iOS开发-二维码扫描-3869人已学习 课程介绍         本课程由扣丁学堂教学总监郭宏志老师讲授,主要讲解了iOS开发专题中的二维码扫描这一专题,内容包含了二维码扫描中的全部知识,让学员更多 ...

  2. iOS开发中的神兵利器 [实战系列]-李发展-专题视频课程

    iOS开发中的神兵利器 [实战系列]-11758人已学习 课程介绍         - 140节课程讲解GitHub中近百个过千star的iOS热门开源项目 - 市面上唯一大规模讲解热门的iOS开源项 ...

  3. ios开发闹钟源代码_开源源码让短视频的开发变得更加便捷

    对外开放源码(开源系统源代码)指的是该源代码的软件著作使用者将其所拥有的初始码公布,容许大家应用.改动发售的手机软件或设计方案体. 刚开始朋友会感觉"开源系统源代码"这一专有名词与 ...

  4. iOS开发-自定义相机(仿微信)拍照、视频录制

    网上有很多自定义相机的例子,这里只是我临时写的一个小demo,仅供参考: 用到了下面几个库: #import <AVFoundation/AVFoundation.h> #import & ...

  5. ios开发之音频视频开发

    一.音频播放方式 1.System Sound Services 2.AVAudioPlayer 3.Audio Queue Service 4.OpenAL 二.使用 1.System Sound ...

  6. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制(转)

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  7. IOS开发基础之音频工具类封装AVAudioPlayer

    IOS开发基础之音频工具类封装AVAudioPlayer 源码在我的主页下面 ,项目名称是AVAudioPlayer 关键性代码 工具类的封装 // // LJAudioTool.h // AVAud ...

  8. 牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  9. iOS开发拓展篇—音频处理(音乐播放器3)

    iOS开发拓展篇-音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...

最新文章

  1. pandas使用groupby函数进行分组聚合并使用agg函数将每个分组特定变量对应的多个内容组合到一起输出(merging content within a specific column of g
  2. fish shell 简要教程以及对bash的兼容性讨论。
  3. HTML5学习笔记简明版(9):变化的元素和属性
  4. Python 面向对象编程
  5. hive币2021年预计涨到多少_星时代云播|IPFS/Filecoin的价值被严重低估, FIL能不能涨到300美金?...
  6. 关于肺结节检测相关的FROC曲线和目标检测中Precision-Recall曲线,ROC曲线,mAP,AP,APs,APm,APl,AP0.5等的理解。
  7. php获取用户真实IP和防刷机制的实例代码
  8. python初学者教程下载_初学者Python教程
  9. 软考高级 真题 2011年上半年 信息系统项目管理师 案例分析
  10. controller实现
  11. P4745 B’s problem(b)
  12. 满屏飞舞的心HTML动画,CSS3制作蝴蝶飞舞动画
  13. 人机交互课堂分享 手势交互与体感交互
  14. 【论文相关】论文管理神器-zotero(最详细的使用说明)
  15. Flutter学习第十四天:Flutter类似于淘宝的首页照片墙功能,让你的界面更加美观灵活?
  16. 华东师大计算机系博士几年,2018华东师范大学就业结果公布!就业率超97%,博士生月薪1.1万!...
  17. c语言中int作用,c语言中int的用法(5页)-原创力文档
  18. windows 查看当前目录及文件
  19. JPEGLS图像压缩算法的FPGA实现(一)压缩算法
  20. Java 八大基本类型

热门文章

  1. Ubuntu 16.04 设置菜单栏位置
  2. 进去qq群的网站,点击加群组件
  3. java计算机毕业设计Web闲置服装交易平台源码+mysql数据库+系统+lw文档+部署
  4. Linux第六章:3.linux下创建文件夹(创建目录)、使用mkdir命令创建单级和多级目录、linux下删除文件夹(目录),rmdir命令、rm -rf、touch命令创建文件
  5. which,whereis 的区别(Linux )
  6. 我的计算机窗口打不开,我的电脑打不开,双击出现选择打开程序窗口
  7. 知识积累-KBOX2
  8. Linux RCU 机制详解
  9. http请求头相关解释
  10. Qt中Format_ARGB32和Format_ARGB32_Premultiplied的区别