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);

我也就不去研究头有多少了,直接就跳过算了,至少没爆音

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