iPhone通過(lame for iPhone armV7)將音頻Caf格式轉換成Mp3 iPhone通過(lame for iPhone armV7)將音頻Caf格式轉換成Mp3

iPhone通過(lame for iPhone armV7)將音頻Caf格式轉換成Mp3

         

這幾天的大部分時間也在研究這個. 爲了達到與Android實現音頻互通.主要目的也還是減小Caf的音頻體積,轉換爲Mp3以後體積縮小接近10倍.

至於能夠轉換成Amr 是最好,唉,技術有限,先用Mp3頂着了.

這裏主要用到lame,一款非常棒的Mp3音頻編碼器.

當然,還要感謝提供XCode下編譯通過的lame源.以下開始介紹下詳細使用方法.

提供lame源下載地址,也算是感謝下這位哥了:

http://d.download.csdn.net/download/mqiezi/3796937

附件會上傳我的Demo,噢,真機才能調試.這確實沒辦法.

lame的核心文件就兩個,使用很簡單.

1:lame庫加入組件庫中.  

2:引入頭文件 lame.h           

#include"lame.h"

接下來和核心的轉換代碼:

[csharp] view plaincopy
  1.                
  2. int read, write;  
  3.       
  4. FILE *pcm =fopen([autioPathcStringUsingEncoding:1],"rb");//被轉換的文件  
  5. FILE *mp3 =fopen([mp3AudioPathcStringUsingEncoding:1],"wb");//轉換後文件的存放位置  
  6. constint PCM_SIZE =8192;  
  7. constint MP3_SIZE =8192;  
  8. shortint pcm_buffer[PCM_SIZE*2];  
  9. unsignedchar mp3_buffer[MP3_SIZE];  
  10. lame_t lame =lame_init();  
  11.    
  12. lame_set_in_samplerate(lame, 44100);  
  13.      
  14. lame_set_VBR(lame, vbr_default);  
  15.      
  16. lame_init_params(lame);  
  17.       
  18.     do {  
  19.           
  20.         read = fread(pcm_buffer, 2*sizeof(shortint), PCM_SIZE, pcm);  
  21.           
  22.         if (read == 0)  
  23.               
  24.             write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);  
  25.           
  26.         else  
  27.               
  28.             write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);  
  29.           
  30.         fwrite(mp3_buffer, write, 1, mp3);  
  31.           
  32.     } while (read != 0);      
  33.     lame_close(lame);     
  34.     fclose(mp3);    
  35.     fclose(pcm);  

另外要注意的是:錄製的Caf音頻文件的參數必須如下,不然轉換後的音頻文件播放起來跟湯姆貓一樣.哈哈,那你就悲劇了.

                

[csharp] view plaincopy
  1. NSDictionary *recordSettings = [NSDictionary   
  2.                             dictionaryWithObjectsAndKeys:  
  3.                              [NSNumbernumberWithInt:AVAudioQualityMin],  
  4.                             AVEncoderAudioQualityKey,  
  5.                              [NSNumbernumberWithInt:16],   
  6.                             AVEncoderBitRateKey,  
  7.                              [NSNumbernumberWithInt:2],   
  8.                             AVNumberOfChannelsKey,  
  9.                              [NSNumbernumberWithFloat:44100.0],   
  10.                             AVSampleRateKey,  
  11.                             nil];  
  12.   
  13.   
  14. audioRecorder = [[AVAudioRecorderalloc]initWithURL:pathURLsettings:recordSettingserror:&error];  

這個真機才能調試噢!. command+B .  依舊編譯通過!

以下是本次的Demo,歡迎下載嘗試.

http://download.csdn.net/detail/ysy441088327/4174609


下面是解決 0.1s爆音問題(摘自cocoachina):

 貌似這個LAME 轉換需要PCM的數據,CAF是帶有頭信息的,所以轉碼後前0.1秒有爆音.


習慣性用法 

            fseek(pcm, 4*1024, SEEK_CUR);

            read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);

我也就不去研究頭有多少了,直接就跳過算了,至少沒爆音




         

這幾天的大部分時間也在研究這個. 爲了達到與Android實現音頻互通.主要目的也還是減小Caf的音頻體積,轉換爲Mp3以後體積縮小接近10倍.

至於能夠轉換成Amr 是最好,唉,技術有限,先用Mp3頂着了.

這裏主要用到lame,一款非常棒的Mp3音頻編碼器.

當然,還要感謝提供XCode下編譯通過的lame源.以下開始介紹下詳細使用方法.

提供lame源下載地址,也算是感謝下這位哥了:

http://d.download.csdn.net/download/mqiezi/3796937

附件會上傳我的Demo,噢,真機才能調試.這確實沒辦法.

lame的核心文件就兩個,使用很簡單.

1:lame庫加入組件庫中.  

2:引入頭文件 lame.h           

#include"lame.h"

接下來和核心的轉換代碼:

[csharp] view plaincopy
  1.                
  2. int read, write;  
  3.       
  4. FILE *pcm =fopen([autioPathcStringUsingEncoding:1],"rb");//被轉換的文件  
  5. FILE *mp3 =fopen([mp3AudioPathcStringUsingEncoding:1],"wb");//轉換後文件的存放位置  
  6. constint PCM_SIZE =8192;  
  7. constint MP3_SIZE =8192;  
  8. shortint pcm_buffer[PCM_SIZE*2];  
  9. unsignedchar mp3_buffer[MP3_SIZE];  
  10. lame_t lame =lame_init();  
  11.    
  12. lame_set_in_samplerate(lame, 44100);  
  13.      
  14. lame_set_VBR(lame, vbr_default);  
  15.      
  16. lame_init_params(lame);  
  17.       
  18.     do {  
  19.           
  20.         read = fread(pcm_buffer, 2*sizeof(shortint), PCM_SIZE, pcm);  
  21.           
  22.         if (read == 0)  
  23.               
  24.             write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);  
  25.           
  26.         else  
  27.               
  28.             write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);  
  29.           
  30.         fwrite(mp3_buffer, write, 1, mp3);  
  31.           
  32.     } while (read != 0);      
  33.     lame_close(lame);     
  34.     fclose(mp3);    
  35.     fclose(pcm);  

另外要注意的是:錄製的Caf音頻文件的參數必須如下,不然轉換後的音頻文件播放起來跟湯姆貓一樣.哈哈,那你就悲劇了.

                

[csharp] view plaincopy
  1. NSDictionary *recordSettings = [NSDictionary   
  2.                             dictionaryWithObjectsAndKeys:  
  3.                              [NSNumbernumberWithInt:AVAudioQualityMin],  
  4.                             AVEncoderAudioQualityKey,  
  5.                              [NSNumbernumberWithInt:16],   
  6.                             AVEncoderBitRateKey,  
  7.                              [NSNumbernumberWithInt:2],   
  8.                             AVNumberOfChannelsKey,  
  9.                              [NSNumbernumberWithFloat:44100.0],   
  10.                             AVSampleRateKey,  
  11.                             nil];  
  12.   
  13.   
  14. audioRecorder = [[AVAudioRecorderalloc]initWithURL:pathURLsettings:recordSettingserror:&error];  

這個真機才能調試噢!. command+B .  依舊編譯通過!

以下是本次的Demo,歡迎下載嘗試.

http://download.csdn.net/detail/ysy441088327/4174609


下面是解決 0.1s爆音問題(摘自cocoachina):

 貌似這個LAME 轉換需要PCM的數據,CAF是帶有頭信息的,所以轉碼後前0.1秒有爆音.


習慣性用法 

            fseek(pcm, 4*1024, SEEK_CUR);

            read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);

我也就不去研究頭有多少了,直接就跳過算了,至少沒爆音

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章