由于AVAudioRecorder不能录制编码为MP3,所以就需要我们将录音后的音频文件格式进行转换(注意:AV Foundation和Core Audio提供对MP3数据解码的支持,但是不提供对其进行编码。所以我们要借助第三方库进行MP3编码)。如何转换?lame无疑是一个很好的选择,lame是一个开源音频压缩软件,目前是公认有损质量MP3中压缩效果最好的编码器。接下来直奔主题,介绍一下如何使用lame将音频转为MP3格式。
一、使用lame的准备工作
首先去官网下载lame库(下载地址),下载后需要将lame库进行编译(编译脚本下载地址)。编译步骤如下:
1、
在桌面上新建一个文件夹,然后将下载后的lame库文件解压命名为lame和编译脚本文件一同放到当前文件中,像这样:
2、
打开终端,cd到lame-3.99.5目录中,运行脚本,开始编译。编译时间稍微有点长,编译成功后文件内容如下所示:
新增加的这几个文件夹分别包含了不同的cpu架构,这里就不详细介绍。如果要支持所有的cpu架构(包括真机和模拟器),只需要将fat-lame文件中的内容拖到项目中即可(lame.h和libmp3lame.a)。至此,准备工作完毕。
二、lame的使用
//录音文件转码
- (void)audio_PCMtoMP3
{
NSString *recorderSavePath = [self.savedRecordPath absoluteString];
NSString *audioTemporarySavePath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
NSString *mp3FileName = [self.savedRecordPath lastPathComponent];
mp3FileName = [mp3FileName stringByAppendingString:@".mp3"];
NSString *mp3FilePath = [audioTemporarySavePath stringByAppendingPathComponent:mp3FileName];
@try {
int read, write;
FILE *pcm = fopen([recorderSavePath cStringUsingEncoding:1], "rb"); //source 被转换的音频文件位置
fseek(pcm, 4*1024, SEEK_CUR); //skip file header
FILE *mp3 = fopen([mp3FilePath cStringUsingEncoding:1], "wb"); //output 输出生成的Mp3文件位置
const int PCM_SIZE = 8192;
const int MP3_SIZE = 8192;
short int pcm_buffer[PCM_SIZE*2];
unsigned char mp3_buffer[MP3_SIZE];
lame_t lame = lame_init();
lame_set_in_samplerate(lame, 11025.0);
lame_set_VBR(lame, vbr_default);
lame_init_params(lame);
do {
read = (int)fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
if (read == 0)
write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
else
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
fwrite(mp3_buffer, write, 1, mp3);
} while (read != 0);
lame_close(lame);
fclose(mp3);
fclose(pcm);
}
@catch (NSException *exception) {
NSLog(@"%@",[exception description]);
}
@finally {
NSLog(@"MP3生成成功: %@",mp3FilePath);
self.savedRecordPath = mp3FilePath.tzl_URL;
}
}
文章浏览阅读1.4k次。Tcp三次握手与四次挥手,自己的见解_tcp的3次握手和4次挥手
文章浏览阅读467次。全国第十六届计算语言学会议(CCL 2017)及第五届基于自然标注大数据的自然语言处理国际学术研讨会(NLP-NABD 2017)联合征稿启事2017-03-20“第十六届全国计算语言学学术会议”(The Sixteenth China National Conference on Computational Linguistics, CCL 2017)将于2017年10月13日—15日在南京师范..._ccl是中文核心吗
文章浏览阅读3k次。参考这里------不换行的策略:不换行原理:ul 和 li 默认都是 display:block; 的标签,可以通过2种方式实现 li 的 不换行显示:* 将 li 设为 display:inline; ,然后通过 marging 和 padding 设置 li 的间距,* 将 li 设为 float:left; ,然后通过 ( margin & padding ) 设置 li 的间距,...
文章浏览阅读37次。2.抽象类和接口的区别。
文章浏览阅读1.5k次。loopback mac 激活版是mac上一款强大的虚拟音频器,可以帮助您创建聚合来自多个源(如麦克风或各种应用程序)的输入的虚拟设备,然后可以将其设置为其他应用程序中的默认输入设备。每个设备都可以配置为从任何应用程序或输入源绘制音频,甚至可以实时监视输出。而且通道映射是自动执行的,但您也可以通过将项目从音频源表拖动到通道映射表来手动配置虚拟设备。原文链接:https://mac.orsoon.com/Mac/164753.html(附安装下载教程)适用于MAC的无线音频路由突然间,在Mac上的应_音频虚拟器作用
文章浏览阅读5.7k次,点赞2次,收藏37次。1.1 vi的三种模式命令模式、插入模式/编辑模式、末行模式三种模式的用法:命令模式:进入vi编辑器之后就是命令模式,命令模式不可编辑,只可以执行命令。插入模式/编辑模式:在命令模式中,按i进入插入模式/编辑模式末行模式:编辑完成后,按ESC返回命令模式,在命令模式中,按:进入末行模式,在末行模式中wq保存并退出vi模式,按q!不保存并退出。1.2 如何进入vi编辑模式① vi 新文件 ---创建新文件并打开vi命令模式。 例:vi a.txt ---创建新文..._linux如何进入vi编辑模式
文章浏览阅读502次。—————–纯粹图片的轮播图——————–导包 //banner广告轮播图 compile 'com.youth.banner:banner:1.4.9'布局中使用
文章浏览阅读185次。今天下午预约的面试,如期到来,回顾一下面试的过程.1.简单的自我介绍2.开始面试(看简历问),一面一般是压力面试,我简历上写的可以开发手机游戏(Cocos2d-x),他就问知道Dijkstra算法吗,面试时面试官说他电话有问题(确实信号不信),但面试官很nice,我一时没听清,就说不知道,以前写过单源最短路径的题。3.看了我研究过安全与劫持,他就问内核态和用户态的转化过程,感觉答的不是..._北京口袋时尚科技有限公司的微店
文章浏览阅读815次。Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择。学安卓从事移动互联方向开发,学Java从事软件、网站开发。而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好。言简意赅的说说“转”前的准备:其实Java程序员要自学安卓开发的基础知识还是没有什么难度的,毕竟语言相通,特性相似, 阅读安卓源代码的门槛以比较低一些,作为能够考虑“转”的合格的程序员的你,自学能力和相关的基础知识应该不是问题,学习安卓也相对比较轻松._软件开发转移动端开发需要学什么
文章浏览阅读8.2k次,点赞8次,收藏32次。Stm32CubeIDE设置补全快捷键和主题stm32CubeIde的设置,省的自己忘记了。一、主题设置提示:这里可以添加要学的内容例如:1、 help->Eclipse Market->输入"Devstyle"查找主题插件->install安装2、窗口->首选项 找到主题3、按照如下设置完成后会提示重启,重启后效果如下所示二、补全设置用于设置代码的自动补全搜索: key->content assist默认的补全快捷键时alt+/,这里我改成双击两次_cubeide快捷键设置
文章浏览阅读142次。(题目链接:https://www.luogu.com.cn/problem/P2525)#include<bits/stdc++.h>using namespace std;int main(){ int tmp,pos,s,n,number,symbol=1,input[10],data[10],memory[10]; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&input[i]);
文章浏览阅读241次,点赞3次,收藏7次。text-overflow:ellipsis(省略号);(如果用clip(裁剪),就没有三个点)nowrap 文本不换行,直到遇到标签【最常用】pre 预格式化文本-保留空格,tab,回车。pre-line 显示回车,不显示换行,空格。做出多的文本省略、显示三个点的效果——容器宽度:width:200px;White-space空余空间。pre-wrap 自然换行。