您的位置:首页 > 其它

iPhone通过(lame for iPhone armV7)将音频Caf格式转换成Mp3 iPhone通过(lame for iPhone armV7)将音频Caf格式转换成Mp3

2013-05-26 17:38 357 查看


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

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音频文件的参数必须如下,不然转换后的音频文件播放起来跟汤姆猫一样.哈哈,那你就悲剧了.

[csharp] view plaincopy

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"
接下来和核心的转换代码:

[csharp] view plaincopy

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音频文件的参数必须如下,不然转换后的音频文件播放起来跟汤姆猫一样.哈哈,那你就悲剧了.

[csharp] view plaincopy

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);
我也就不去研究头有多少了,直接就跳过算了,至少没爆音
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: