亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS的音頻文件的格式轉換示例

2019-10-21 18:39:49
字體:
來源:轉載
供稿:網友

背景

因為我的公司需要設計到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]; }

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

//錄音格式的設置+ (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,如果覺得好麻煩點下星,如果有什么問題歡迎指正

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产精品国自产在线| 国产在线视频2019最新视频| 亚洲美女激情视频| 国产精品9999| 国产欧美精品一区二区三区介绍| 国产精品一区二区在线| 永久免费毛片在线播放不卡| 国产成人精品久久二区二区91| 久久亚洲精品小早川怜子66| 正在播放欧美视频| 亚洲精品狠狠操| 欧美精品videofree1080p| xxxxx91麻豆| 国产精品福利久久久| 久久激情视频久久| 久久精品成人动漫| 国产精品露脸av在线| 国产一级揄自揄精品视频| 亚洲成年网站在线观看| 中文字幕欧美精品在线| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲综合小说区| 亚洲一区二区中文| 色老头一区二区三区| 2019中文字幕全在线观看| 国产精品久久91| 国产精品免费一区| 在线看日韩av| 日韩av免费在线播放| 亚洲女同精品视频| 久久免费国产精品1| 97国产suv精品一区二区62| 亚洲第一区在线| 国产精品永久免费| 久久久午夜视频| www.亚洲免费视频| 国产91免费观看| 久久久亚洲精品视频| 久久99久国产精品黄毛片入口| 日韩国产精品视频| 不卡av电影在线观看| 91成人福利在线| 国产97人人超碰caoprom| 在线成人免费网站| 国产视频久久久久久久| 国产欧美日韩精品在线观看| 日韩精品极品视频免费观看| 日韩欧美在线视频观看| 青青a在线精品免费观看| 亚洲国产成人久久| 98精品国产高清在线xxxx天堂| 日韩欧美高清在线视频| 这里只有精品在线播放| 久久久久亚洲精品国产| 欧美最猛性xxxxx亚洲精品| 日韩精品在线免费播放| 91在线高清免费观看| 欧美性xxxxxxxxx| 中文一区二区视频| 国产亚洲视频中文字幕视频| 青青青国产精品一区二区| 97av视频在线| 日韩欧美aⅴ综合网站发布| 久久久久久久爱| 亚洲精品久久久久| 岛国av午夜精品| 成人网在线观看| 亚洲自拍偷拍一区| 欧美理论电影在线播放| 国产香蕉97碰碰久久人人| 亚洲一二在线观看| 日韩精品中文字幕视频在线| 久久久久久久色| 深夜精品寂寞黄网站在线观看| 精品国产拍在线观看| 青青草精品毛片| 国产精品96久久久久久又黄又硬| 亚洲人成绝费网站色www| 亚洲新中文字幕| 国产成人精品视频在线观看| 久久精品国产99国产精品澳门| 日韩美女av在线| 中文字幕亚洲无线码在线一区| 欧美精品福利视频| 欧美成人国产va精品日本一级| 最近2019中文免费高清视频观看www99| 欧美日在线观看| 在线视频欧美日韩| 国产视频精品自拍| 91免费精品视频| 亚洲国产成人久久综合一区| 欧美日韩一区二区免费视频| 亚洲性视频网址| 久久大大胆人体| 日本国产精品视频| 欧美激情喷水视频| 亚洲xxx视频| 中文字幕欧美精品日韩中文字幕| 羞羞色国产精品| 久久亚洲国产精品| 日韩av电影国产| 欧美黑人国产人伦爽爽爽| 疯狂做受xxxx高潮欧美日本| 欧美激情乱人伦一区| 国产精品视频免费在线| 欧美性极品少妇精品网站| 欧美大荫蒂xxx| 亚洲国产精久久久久久久| 国产成人精品亚洲精品| 尤物yw午夜国产精品视频明星| 久久久久久久网站| 久久综合电影一区| 久久久久久久一区二区| 久久香蕉国产线看观看av| 深夜福利国产精品| 国产精品吴梦梦| 亚洲国产成人精品女人久久久| 欧美一区二区影院| 国产精品色婷婷视频| 亚洲欧美日韩第一区| 国产福利精品av综合导导航| 欧美成人黄色小视频| 久久777国产线看观看精品| 亚洲第一福利视频| 欧美专区在线播放| 国产一区二区三区四区福利| 国产精品久久久久久久久久东京| 日韩高清欧美高清| 亚洲午夜精品久久久久久久久久久久| 国语对白做受69| 国产精品av免费在线观看| 久99久在线视频| 欧美成人手机在线| 国产精品久久视频| 中文字幕亚洲无线码在线一区| 成人午夜激情网| 亚洲国产小视频| 一区二区三欧美| 庆余年2免费日韩剧观看大牛| 国产午夜精品理论片a级探花| 揄拍成人国产精品视频| 国产精品观看在线亚洲人成网| 亚洲视频在线看| 国产精品免费看久久久香蕉| 高清一区二区三区日本久| 亚洲自拍另类欧美丝袜| 国产精品影院在线观看| 韩国精品久久久999| 国产精品在线看| 亚洲一区亚洲二区| 国产这里只有精品| 亚洲91精品在线| 亚洲人线精品午夜| 九九热最新视频//这里只有精品| 欧美人在线观看| 欧美日韩国产影院| 亚洲色图欧美制服丝袜另类第一页| xvideos国产精品| 午夜精品一区二区三区av| 国产精品自在线| 国产精品十八以下禁看| 亚洲美女性生活视频| 91亚洲精品视频| 久久久久久97|