问题1、如何转
导入第三方lame,本人使用的相关framework与头文件已上传百度云:https://pan.baidu.com/s/1D4lHLhcqtJiIv0DybT6fvA 密码: 5fwy
导入注意事项,静态库的导入需要先将文件copy工程目录,然后再使用add file即可,否则会报错:
问题2、播放声音小
在录音时这样设置AVAudioSession为:setCategory:AVAudioSessionCategoryPlayAndRecord
-(AVAudioSession *)session {
if(!_session){
_session =[AVAudioSession sharedInstance];
NSError *sessionError;
[_session setCategory:AVAudioSessionCategoryPlayAndRecord
error:&sessionError];
}
return _session;
}
在播放时设置AVAudioSession为:setCategory:AVAudioSessionCategoryPlayback
AVAudioSession *playSession =[AVAudioSession sharedInstance];
[playSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[playSession setActive:YES error:nil];
问题3、MP3文件需要以中文命名
FILE *fopen(const char * __restrict __filename, const char * __restrict __mode)
读取初始录音文件:
FILE*pcm =fopen([soucePath cStringUsingEncoding:1],
"rb");// soucePath 待转换的音频文件位置
fseek(pcm,4*1024,SEEK_CUR);// skip file header
FILE *mp3 = fopen([desPath cStringUsingEncoding:4],
"wb");// desPath 输出生成的Mp3文件位置
- (nullableconstchar*)cStringUsingEncoding:(NSStringEncoding)encoding 中
NSStringEncoding 是一个枚举类型:
NSASCIIStringEncoding =1, /* 0..127 only */ 初始录音文件设置的文件名为:test 因此选择此类型
NSNEXTSTEPStringEncoding =2,
NSJapaneseEUCStringEncoding =3,
NSUTF8StringEncoding =4, 目标文件名为:iOS_程序员_111 因此选择此类型。
问题4、沙盒路径中有中文,导致player初始化失败。
今天我们从问题4说起。
根据项目协议,mp3文件名的命名规则是这样的:iOS_工程师_888.mp3
兴冲冲的直接调用
NSURL url = [NSURL URLWithString:@"path/iOS_工程师_888.mp3"];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err];
结果发现,点击播放的时候,竟然声音。开始怀疑是否是转格式的方法错误了,最后把文件copy到桌面,使用电播放,没毛病,可以播。
断点调试,发现player 为 nil.推测是否是路径中的中文引起的?
去掉中文后,手机端可以正常播放。于是,百度了一下,iOS url有中文,找到了如下方法。
NSString* encodedString = [@"path/iOS_工程师_888.mp3" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
随后再次调用
NSURL url = [NSURL URLWithString:encodedString];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err];
重新运行,成功播放了含有中文路径的mp3文件。
小结一下:如果是文件路径里有中文,直接转URL会失败,导致无法正确加载资源,所以player返回为空,不能播放。需要将带有中文的Str,使用指定方法转为合法的URL。