日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS的音频文件的格式转换

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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];}

????????同時還需把關鍵的屬性抽取出來(如:采樣率,通道數…)

//錄音格式的設置 + (NSDictionary*)GetAudioRecorderSettingDict{NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithFloat: 8000],AVSampleRateKey, //采樣率[NSNumber numberWithInt: kAudioFormatLinearPCM],AVFormatIDKey,[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,//采樣位數 默認 16[NSNumber numberWithInt: 2], AVNumberOfChannelsKey,//通道的數目nil];return recordSetting; }

????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的音频文件的格式转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。