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"
接下來和核心的轉換代碼:
- int read, write;
- FILE *pcm =fopen([autioPathcStringUsingEncoding:1],"rb");//被轉換的文件
- FILE *mp3 =fopen([mp3AudioPathcStringUsingEncoding:1],"wb");//轉換後文件的存放位置
- constint PCM_SIZE =8192;
- constint MP3_SIZE =8192;
- shortint pcm_buffer[PCM_SIZE*2];
- unsignedchar mp3_buffer[MP3_SIZE];
- lame_t lame =lame_init();
- lame_set_in_samplerate(lame, 44100);
- lame_set_VBR(lame, vbr_default);
- lame_init_params(lame);
- do {
- read = fread(pcm_buffer, 2*sizeof(shortint), PCM_SIZE, pcm);
- if (read == 0)
- write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
- else
- write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
- fwrite(mp3_buffer, write, 1, mp3);
- } while (read != 0);
- lame_close(lame);
- fclose(mp3);
- fclose(pcm);
另外要注意的是:錄製的Caf音頻文件的參數必須如下,不然轉換後的音頻文件播放起來跟湯姆貓一樣.哈哈,那你就悲劇了.
- NSDictionary *recordSettings = [NSDictionary
- dictionaryWithObjectsAndKeys:
- [NSNumbernumberWithInt:AVAudioQualityMin],
- AVEncoderAudioQualityKey,
- [NSNumbernumberWithInt:16],
- AVEncoderBitRateKey,
- [NSNumbernumberWithInt:2],
- AVNumberOfChannelsKey,
- [NSNumbernumberWithFloat:44100.0],
- AVSampleRateKey,
- nil];
- 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"
接下來和核心的轉換代碼:
- int read, write;
- FILE *pcm =fopen([autioPathcStringUsingEncoding:1],"rb");//被轉換的文件
- FILE *mp3 =fopen([mp3AudioPathcStringUsingEncoding:1],"wb");//轉換後文件的存放位置
- constint PCM_SIZE =8192;
- constint MP3_SIZE =8192;
- shortint pcm_buffer[PCM_SIZE*2];
- unsignedchar mp3_buffer[MP3_SIZE];
- lame_t lame =lame_init();
- lame_set_in_samplerate(lame, 44100);
- lame_set_VBR(lame, vbr_default);
- lame_init_params(lame);
- do {
- read = fread(pcm_buffer, 2*sizeof(shortint), PCM_SIZE, pcm);
- if (read == 0)
- write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
- else
- write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
- fwrite(mp3_buffer, write, 1, mp3);
- } while (read != 0);
- lame_close(lame);
- fclose(mp3);
- fclose(pcm);
另外要注意的是:錄製的Caf音頻文件的參數必須如下,不然轉換後的音頻文件播放起來跟湯姆貓一樣.哈哈,那你就悲劇了.
- NSDictionary *recordSettings = [NSDictionary
- dictionaryWithObjectsAndKeys:
- [NSNumbernumberWithInt:AVAudioQualityMin],
- AVEncoderAudioQualityKey,
- [NSNumbernumberWithInt:16],
- AVEncoderBitRateKey,
- [NSNumbernumberWithInt:2],
- AVNumberOfChannelsKey,
- [NSNumbernumberWithFloat:44100.0],
- AVSampleRateKey,
- nil];
- 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);
我也就不去研究頭有多少了,直接就跳過算了,至少沒爆音