当前位置: 首页 > news >正文

IOS开发 铃声制作(库乐队)

IOS开发,实现铃声制作功能。
在IOS端,要设置铃声都是通过库乐队来制作的。

先看一下库乐队中铃声的文件结构。下面是弄的一个实例的文件,文件信息如下:
1521b6b120ba488f9cde1df0a33b6f64.png

 我们右击文件,点击显示包内容如下:
能看到一个aiff格式的音频。思考一下,当我们需要将需要制作成铃声的音频文件如果是mp3或者是其他格式的音频是不是发现,当隔空想要分享到库乐队是并没有库乐队选项。那是因为库乐队需要识别的是.band文件。

要是我们将音频转为aiff文件,然后塞入到这个band文件里面的Media。然后将这个band文件分享给库乐队就可以了呢。答案是:是的。下面我们开始操作!
f7d0ad8557f9454bb61eb3917c5a1fb3.png

一、实现流程

1、将没有音频文件的band文件导入项目中。也就是删掉aiff音频,剩下保存下来。 如下:
1259cf7822214755a9efe4418c7def4d.png

我把删掉音频后的band文件改了名字而已。 

700f20a67bed4685b51d568946cd2312.png

2、将bandfolder.band文件复制一份到沙盒中

NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *dir = [array objectAtIndex:0];
NSString *cacheDirectory = dir;NSString* bandfolder = [cacheDirectory stringByAppendingPathComponent:@"bandFolder"];
if(![[NSFileManager defaultManager] fileExistsAtPath:bandfolder]) {BOOL success = [[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"bandfolder.band" ofType:nil] toPath:bandfolder error:NULL];
}

3、 创建一个分享的存放文件的文件夹

NSString* bandfolderDirectory = [cacheDirectory stringByAppendingPathComponent:@"bandfolderDirectory"];BOOL isDirectory = FALSE;
NSFileManager* fileMgr = [NSFileManager defaultManager];
if (![fileMgr fileExistsAtPath:bandfolderDirectory isDirectory:&isDirectory]){[fileMgr createDirectoryAtPath:bandfolderDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}

4、拷贝一份bandFolder, 将第二步中沙盒的band文件拷贝多一份。然后把你自己的音频转码为aiff

//先拷贝一个bandFolder
NSURL *fileURL = @"换成你的音频URL";
NSString *fileName=[[filePath lastPathComponent] stringByDeletingPathExtension];NSString *copyAtPath = bandfolder;
NSString *copyToPath = [bandfolderDirectorystringByAppendingPathComponent:[NSString stringWithFormat:@"%@.band",fileName]];
[[NSFileManager defaultManager] copyItemAtPath:copyAtPath toPath:copyToPath error:NULL];//然后要把你自己的音频转码为aiff
ExtAudioConverter* converter = [[ExtAudioConverter alloc] init];
converter.inputFile = filePath;
converter.outputFile = [NSString stringWithFormat:@"%@/Media/ringtone.aiff",copyToPath];
converter.outputFileType = kAudioFileAIFFType;
[converter convert];

ExtAudioConverter类github上面搜一下有,附一个别的大佬的链接 

GitHub - Agisight/ExtAudioConverter: iso + simulator

5、最后一步:将band文件分享给库乐队就行了

 //弹出分享框并进行分享
NSArray *items = [NSArray arrayWithObjects:[NSURL fileURLWithPath:copyToPath],nil];
UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeAirDrop];// 分享之后的回调
activityViewController.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {if (completed) {} else  if(activityError){}
};
[self presentViewController:activityViewController animated:YES completion:^{}];

 二、完整代码

//1.将项目中的bandFolder.band复制一份到沙盒
NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *dir = [array objectAtIndex:0];
NSString *cacheDirectory = dir;NSString* bandfolder = [cacheDirectory stringByAppendingPathComponent:@"bandFolder"];
if(![[NSFileManager defaultManager] fileExistsAtPath:bandfolder]) {BOOL success = [[NSFileManager defaultManager] copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"bandfolder.band" ofType:nil] toPath:bandfolder error:NULL];
}//2.创建一个后续分享band文件存放其的文件夹
NSString* bandfolderDirectory = [cacheDirectory stringByAppendingPathComponent:@"bandfolderDirectory"];BOOL isDirectory = FALSE;
NSFileManager* fileMgr = [NSFileManager defaultManager];
if (![fileMgr fileExistsAtPath:bandfolderDirectory isDirectory:&isDirectory]){[fileMgr createDirectoryAtPath:bandfolderDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}//3.拷贝一份band文件,变将你的音频转换为aiff格式。注意:转换的输出路径对应band文件里面的音频路径
//3.1先拷贝一个bandFolder
NSURL *fileURL = @"换成你的音频URL";
NSString *fileName=[[filePath lastPathComponent] stringByDeletingPathExtension];NSString *copyAtPath = bandfolder;
NSString *copyToPath = [bandfolderDirectorystringByAppendingPathComponent:[NSString stringWithFormat:@"%@.band",fileName]];
[[NSFileManager defaultManager] copyItemAtPath:copyAtPath toPath:copyToPath error:NULL];//3.2然后要把你自己的音频转码为aiff
ExtAudioConverter* converter = [[ExtAudioConverter alloc] init];
converter.inputFile = filePath;
converter.outputFile = [NSString stringWithFormat:@"%@/Media/ringtone.aiff",copyToPath];
converter.outputFileType = kAudioFileAIFFType;
[converter convert];//4.最后一步,分享到库乐队
NSArray *items = [NSArray arrayWithObjects:[NSURL fileURLWithPath:copyToPath],nil];
UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeAirDrop];// 分享之后的回调
activityViewController.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {if (completed) {} else  if(activityError){}
};
[self presentViewController:activityViewController animated:YES completion:^{}];

注意点:就是苹果设置铃声最长只能30s,如果你的音频超过30s,在被自动截取为前30s的音频.建议是先自行裁剪为30s,再将其转为aiff格式,塞入到.band包,再传给库乐队

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java笔试面试题AI答之线程(21)
  • Android - 自定义view
  • OpenCV几何图像变换(5)旋转和缩放计算函数getRotationMatrix2D()的使用
  • Linux安装Miniconda3
  • 数学理论在编程中的核心应用与实践(上)
  • EmguCV学习笔记 VB.Net 6.3 轮廓外接多边形
  • C#(asp.net)乡镇中学宿舍管理系统---附源码 97861
  • OSPF路由原理详解与关键点
  • 20L水箱植保无人机技术详解
  • NVM安装管理node.js版本(简单易懂)
  • 微信左滑删除聊天记录怎么恢复?记录找回秘籍,第一种更有效!
  • 基于java图书销售管理系统设计与实现
  • Aurora IP核 —— NFC功能
  • Unity3D 屏幕空间阴影的简单优化详解
  • 【MySQL数据库管理问答题】第6章 管理 MySQL 用户
  • [译] 怎样写一个基础的编译器
  • [译]Python中的类属性与实例属性的区别
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【技术性】Search知识
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Date型的使用
  • Facebook AccountKit 接入的坑点
  • Joomla 2.x, 3.x useful code cheatsheet
  • MobX
  • Mysql数据库的条件查询语句
  • Terraform入门 - 1. 安装Terraform
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue 配置sass、scss全局变量
  • VuePress 静态网站生成
  • Yeoman_Bower_Grunt
  • 阿里云购买磁盘后挂载
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从PHP迁移至Golang - 基础篇
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 来,膜拜下android roadmap,强大的执行力
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 用Python写一份独特的元宵节祝福
  • 优秀架构师必须掌握的架构思维
  • ionic入门之数据绑定显示-1
  • python最赚钱的4个方向,你最心动的是哪个?
  • 昨天1024程序员节,我故意写了个死循环~
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # 安徽锐锋科技IDMS系统简介
  • # 数仓建模:如何构建主题宽表模型?
  • ###STL(标准模板库)
  • #预处理和函数的对比以及条件编译
  • (AngularJS)Angular 控制器之间通信初探
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)elasticsearch 源码之启动流程分析
  • (四)js前端开发中设计模式之工厂方法模式
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...