189 8069 5689

iOS的音频文件的格式转换示例-创新互联

背景

创新互联是专业的槐荫网站建设公司,槐荫接单;提供成都做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行槐荫网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

因为我的公司需要设计到app与硬件的通信,所以去年深入的研究了一下音频各种格式的转换,曾写过一篇简书,现在搬过来丰富下自己的blog。

首先介绍一下常用的音频文件格式

  • .amr:体积很小,1秒到约为1kb,所以音质缩水也很厉害,一般用于手机铃声或彩信
  • .mp3:比较流行的,有损音频,某些部分失真,,音质随码率的提高,越高越好
  • .wav:为无损音频
  • .pcm:无损的wav文件中音频数据的一种编码方式

由于App是通过AVAudioRecorder录制音频,默认格式为pcm,文件比较大,所以不适合用于聊天通信的文件格式,所以最优的选择是转换成amr格式

音频格式转换方式

.pcm-->.wav-->.amr

a)将pcm转成wav

什么是WAV和PCM?

WAV:wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。

PCM:PCM(Pulse Code Modulation----脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。

简单来说:wav是一种无损的音频文件格式,pcm是没有压缩的编码方式。

WAV和PCM的关系

WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。

简单来说:pcm是无损wav文件中音频数据的一种编码方式,但wav还可以用其它方式编码。

这里详细写了pcm和wav的区别,我简单概括成pcm少了一个wav头描述信息。为此我从讯飞语音的sdk中移植出填写wav头的函数并修改了一下

// 为pcm文件写入wav头
+ (NSData*) writeWavHead:(NSData *)audioData {
 long sampleRate = [[self GetAudioRecorderSettingDict][AVSampleRateKey] longValue];
 long numOfChannelsKey = [[self GetAudioRecorderSettingDict][AVNumberOfChannelsKey] longValue];
 Byte waveHead[44];
 waveHead[0] = 'R';
 waveHead[1] = 'I';
 waveHead[2] = 'F';
 waveHead[3] = 'F';
 
 long totalDatalength = [audioData length] + 44;
 waveHead[4] = (Byte)(totalDatalength & 0xff);
 waveHead[5] = (Byte)((totalDatalength >> 8) & 0xff);
 waveHead[6] = (Byte)((totalDatalength >> 16) & 0xff);
 waveHead[7] = (Byte)((totalDatalength >> 24) & 0xff);
 
 waveHead[8] = 'W';
 waveHead[9] = 'A';
 waveHead[10] = 'V';
 waveHead[11] = 'E';
 
 waveHead[12] = 'f';
 waveHead[13] = 'm';
 waveHead[14] = 't';
 waveHead[15] = ' ';
 
 waveHead[16] = 16; //size of 'fmt '
 waveHead[17] = 0;
 waveHead[18] = 0;
 waveHead[19] = 0;
 
 waveHead[20] = 1; //format
 waveHead[21] = 0;
 
 waveHead[22] = numOfChannelsKey; //chanel
 waveHead[23] = 0;
 
 waveHead[24] = (Byte)(sampleRate & 0xff);
 waveHead[25] = (Byte)((sampleRate >> 8) & 0xff);
 waveHead[26] = (Byte)((sampleRate >> 16) & 0xff);
 waveHead[27] = (Byte)((sampleRate >> 24) & 0xff);
 
 long byteRate = sampleRate * 2 * (16 >> 3);;
 waveHead[28] = (Byte)(byteRate & 0xff);
 waveHead[29] = (Byte)((byteRate >> 8) & 0xff);
 waveHead[30] = (Byte)((byteRate >> 16) & 0xff);
 waveHead[31] = (Byte)((byteRate >> 24) & 0xff);
 
 waveHead[32] = 2*(16 >> 3);
 waveHead[33] = 0;
 
 waveHead[34] = 16;
 waveHead[35] = 0;
 
 waveHead[36] = 'd';
 waveHead[37] = 'a';
 waveHead[38] = 't';
 waveHead[39] = 'a';
 
 long totalAudiolength = [audioData length];
 
 waveHead[40] = (Byte)(totalAudiolength & 0xff);
 waveHead[41] = (Byte)((totalAudiolength >> 8) & 0xff);
 waveHead[42] = (Byte)((totalAudiolength >> 16) & 0xff);
 waveHead[43] = (Byte)((totalAudiolength >> 24) & 0xff);
 
 NSMutableData *pcmData = [[NSMutableData alloc]initWithBytes:&waveHead length:sizeof(waveHead)];
 [pcmData appendData:audioData];
 
 
 return pcmData;
 // [pcmData writeToFile:kVoiceWav atomically:true];
 
}

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:iOS的音频文件的格式转换示例-创新互联
本文链接:http://cdxtjz.cn/article/hhhgc.html

其他资讯