iOS的音频文件的格式转换
背景
因為我的公司需要設計到app與硬件的通信,所以去年深入的研究了一下音頻各種格式的轉換,曾寫過一篇簡書(https://www.jianshu.com/p/2937ab95c0f2),現在搬過來豐富下自己的blog。
首先介紹一下常用的音頻文件格式
.amr:體積很小,1秒到約為1kb,所以音質縮水也很厲害,一般用于手機鈴聲或彩信
.mp3:比較流行的,有損音頻,某些部分失真,,音質隨碼率的提高,越高越好
.wav:為無損音頻
.pcm:無損的wav文件中音頻數據的一種編碼方式
由于App是通過AVAudioRecorder錄制音頻,默認格式為pcm,文件比較大,所以不適合用于聊天通信的文件格式,所以最優的選擇是轉換成amr格式
音頻格式轉換方式
.pcm-->.wav-->.amr
????a)將pcm轉成wav
????????http://www.jianshu.com/p/1d1f893e53e9這里詳細寫了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; //formatwaveHead[21] = 0;waveHead[22] = numOfChannelsKey; //chanelwaveHead[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];}????????同時還需把關鍵的屬性抽取出來(如:采樣率,通道數…)
????b)將wav轉成amr
????????使用VoiceConvert(by:Tang Xiaoping)庫能將wav轉成amr,后來發現環信的EaseUI框架中也使用了這個
????????反過來轉換也是差不多的
pcm<--->mp3
????這個就很簡單了,用lame的框架進行轉換,這個框架網上資料一大堆
本人為此花了不少時間整理了一下這些文件格式的轉換方法
/*** 轉換wav到amr** @param wavPath wav文件路徑* @param isDelete 轉換成功后是否刪除源文件** @return NO 失敗 YES成功*/ + (BOOL) wav2Amr:(NSString *)wavPath isDeleteSourchFile:(BOOL)isDelete;/*** 轉換amr到wav** @param amrPath amr文件路徑* @param isDelete 轉換成功后是否刪除源文件** @return NO 失敗 YES成功*/ + (BOOL) amr2Wav:(NSString *)amrPath isDeleteSourchFile:(BOOL)isDelete;/*** 轉換pcm到mp3** @param pcmPath pcm文件路徑* @param isDelete 轉換成功后是否刪除源文件** @return NO 失敗 YES成功*/ + (BOOL) pcm2Mp3: (NSString *)pcmPath isDeleteSourchFile:(BOOL)isDelete; /*** 轉換pcm到wav** @param pcmPath pcm文件路徑* @param isDelete 轉換成功后是否刪除源文件** @return NO 失敗 YES成功*/ + (BOOL) pcm2Wav: (NSString *)pcmPath isDeleteSourchFile:(BOOL)isDelete;/*** 轉換pcm到amr** @param pcmPath pcm文件路徑* @param isDelete 轉換成功后是否刪除源文件** @return NO 失敗 YES成功*/ + (BOOL) pcm2Amr:(NSString *)pcmPath isDeleteSourchFile:(BOOL)isDelete;/*** 為pcm文件寫入wav頭 */ + (NSData*) writeWavHead:(NSData *)audioData; void conventToMp3(NSString *pcmFile,NSString *mp3File);/**錄音格式設置,轉換的時候需要獲取.(如:采樣率、采樣位數、通道的數目)建議使用此設置,如有修改,則轉換amr時也要對應修改參數,比較麻煩@returns 錄音設置*/ + (NSDictionary*)GetAudioRecorderSettingDict;demo的下載地址https://github.com/qq631192328/PFAudio.git,如果覺得好麻煩點下星,如果有什么問題歡迎指正
總結
以上是生活随笔為你收集整理的iOS的音频文件的格式转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(16):巩固练习
- 下一篇: java学习(20):巩固练习