lame,把ios录音转换为mp3格式
2014-02-27 11:39
513 查看
在ios设备中进行录音,录音文件的格式为caf。但这种格式在很多设备中没法播放。为了适应终端的播放功能,特将caf转换为mp3格式文件来使用。
在录制caf文件时,需要使用双通道,否则在转换为MP3格式时,声音不对。caf录制端的设置为:
NSMutableDictionary * recordSetting = [NSMutableDictionary
dictionary];
[recordSetting
setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM]
forKey:AVFormatIDKey];//
[recordSetting
setValue:[NSNumber numberWithFloat:8000.0]
forKey:AVSampleRateKey];//采样率
[recordSetting
setValue:[NSNumber numberWithInt:
2] forKey:AVNumberOfChannelsKey];//声音通道,这里必须为双通道
[recordSetting
setValue:[NSNumber numberWithInt:AVAudioQualityLow]
forKey:AVEncoderAudioQualityKey];//音频质量
在转换mp3端的代码为:
NSString *cafFilePath = cafFilePathName; //caf文件路径
NSString *mp3FilePath = mp3FilePathName;//存储mp3文件的路径
NSFileManager* fileManager=[NSFileManager
defaultManager];
if([fileManager
removeItemAtPath:mp3FilePath error:nil])
{
NSLog(@"删除");
}
@try {
int read, write;
FILE *pcm =
fopen([cafFilePath cStringUsingEncoding:1],
"rb"); //source 被转换的音频文件位置
if(pcm ==
NULL)
{
NSLog(@"file not found");
}
else
{
fseek(pcm,
4*1024, SEEK_CUR);
//skip file header
FILE *mp3 =
fopen([mp3FilePath cStringUsingEncoding:1],
"wb"); //output 输出生成的Mp3文件位置
const
int PCM_SIZE = 8192;
const
int MP3_SIZE = 8192;
short
int pcm_buffer[PCM_SIZE*2];
unsigned
char mp3_buffer[MP3_SIZE];
lame_t lame =
lame_init();
lame_set_num_channels(lame,1);//设置1为单通道,默认为2双通道
lame_set_in_samplerate(lame,
8000.0);//11025.0
//lame_set_VBR(lame, vbr_default);
lame_set_brate(lame,8);
lame_set_mode(lame,3);
lame_set_quality(lame,2);
/* 2=high 5 = medium 7=low 音质*/
lame_init_params(lame);
do {
read =
fread(pcm_buffer, 2*sizeof(short
int), 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);
return
YES;
}
return
NO;
}
@catch (NSException *exception) {
NSLog(@"%@",[exception
description]);
return
NO;
}
@finally {
NSLog(@"执行完成");
}
在录制caf文件时,需要使用双通道,否则在转换为MP3格式时,声音不对。caf录制端的设置为:
NSMutableDictionary * recordSetting = [NSMutableDictionary
dictionary];
[recordSetting
setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM]
forKey:AVFormatIDKey];//
[recordSetting
setValue:[NSNumber numberWithFloat:8000.0]
forKey:AVSampleRateKey];//采样率
[recordSetting
setValue:[NSNumber numberWithInt:
2] forKey:AVNumberOfChannelsKey];//声音通道,这里必须为双通道
[recordSetting
setValue:[NSNumber numberWithInt:AVAudioQualityLow]
forKey:AVEncoderAudioQualityKey];//音频质量
在转换mp3端的代码为:
NSString *cafFilePath = cafFilePathName; //caf文件路径
NSString *mp3FilePath = mp3FilePathName;//存储mp3文件的路径
NSFileManager* fileManager=[NSFileManager
defaultManager];
if([fileManager
removeItemAtPath:mp3FilePath error:nil])
{
NSLog(@"删除");
}
@try {
int read, write;
FILE *pcm =
fopen([cafFilePath cStringUsingEncoding:1],
"rb"); //source 被转换的音频文件位置
if(pcm ==
NULL)
{
NSLog(@"file not found");
}
else
{
fseek(pcm,
4*1024, SEEK_CUR);
//skip file header
FILE *mp3 =
fopen([mp3FilePath cStringUsingEncoding:1],
"wb"); //output 输出生成的Mp3文件位置
const
int PCM_SIZE = 8192;
const
int MP3_SIZE = 8192;
short
int pcm_buffer[PCM_SIZE*2];
unsigned
char mp3_buffer[MP3_SIZE];
lame_t lame =
lame_init();
lame_set_num_channels(lame,1);//设置1为单通道,默认为2双通道
lame_set_in_samplerate(lame,
8000.0);//11025.0
//lame_set_VBR(lame, vbr_default);
lame_set_brate(lame,8);
lame_set_mode(lame,3);
lame_set_quality(lame,2);
/* 2=high 5 = medium 7=low 音质*/
lame_init_params(lame);
do {
read =
fread(pcm_buffer, 2*sizeof(short
int), 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);
return
YES;
}
return
NO;
}
@catch (NSException *exception) {
NSLog(@"%@",[exception
description]);
return
NO;
}
@finally {
NSLog(@"执行完成");
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- WMA To MP3 Encoder6.15绿色版含注册文件 下载
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 探讨Android与iOS,我们将何去何从?
- IOS 身份证校验详细介绍及示例代码
- 比较完整的android MP3 LRC歌词滚动高亮显示(附源码)
- iOS NSDate中关于夏令时的坑
- iOS内存错误EXC_BAD_ACCESS的解决方法
- 从 Auto Layout 的布局算法谈性能
- 浅谈 MVC、MVP 和 MVVM 架构模式
- 深入解析 ObjC 中方法的结构
- 你真的了解 load 方法么?
- 从源代码看 ObjC 中消息的发送
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(三)