需求:
app注需增加录音功能,上传到服务器,录音文件尽量不要太大
实现步骤:
1、在需要的文件导入AVFoundation
#import
2、写访问权限,在info.plist添加如下键值对
NAMicrophoneUsageDescription
需要在录音时访问您的麦克风
3、核心代码
首先检测就是判断用户是否打开了麦克风的权限,方法如下
AVAuthorizationstatus status = [AVCaptureDevice
authorizationStatusForMediaType: AVMediaTypeAudio];
switch (status){
case AVAuthorizationStatusNotDetermined:
break;
case AVAuthorizationStatusAuthorized:
break;
case AVAuthorizationStatusDenied:
case AVAuthorizationStatusRestricted: [
break;
default:
break;
}
开始录音
AV Foundation提供了AVAudioRecorder类,用于从内置麦克风或者外置音频设备录制音频。创建AVAudioRecorder需要提供以下数据信息:
录制的音频要存放的位置,也就是本地URL。
音频格式、采样率、声道等配置信息,这些信息使用字典保存。
NSError指针,用于捕捉初始化时可能出现的错误。
1、音频格式
kAudioFormatMPEG4AAC压缩格式能在显著减小文件的同时,保证音频的质量。同时Android也支持aac音频格式。
2、采样率
采样率越高,文件越大,质量越好,反之,文件小,质量相对差一些,但是低于普通的音频,人耳并不能明显的分辨出好坏。最终选取哪一种采样率,由我们的耳朵来判断。建议使用标准的采样率,8000、16000、22050、44100。
3、通道数
AVNumberOfChannelsKey用于指定记录音频的通道数。1为单声道,2为立体声。除非使用外部硬件进行录制,否则通常使用单声道录制。
4、其他配置
在AV Foundation Audio Session Settings Constants中查看完整的键列表。
代码如下:
//初始化全局会话
_session = [AVAudioSession sharedInstance];
NSError*sessionError;
//设置会话种类
[_session setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
//激活全局会话
if(_session) {
[_session setActive:YES error:nil];
}
if(sessionError) {
NSLog(@"sessionError -- %@",sessionError);
}
//指定音频存储路径
_recoderUrl = [NSURL fileURLWithPath:filePath];
//设置录音参数
NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat:8000.0],AVSampleRateKey,
[NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithInt:2],AVNumberOfChannelsKey,
[NSNumber numberWithInt:AVAudioQualityMax],
AVEncoderAudioQualityKey,
nil];
NSError *initError;
//初始化录音器
_recoder = [[AVAudioRecorder alloc] initWithURL:_recoderUrl
settings:recordSetting
error:&initError];
_recoder.delegate = self;
if(_recoder) {
_recoder.meteringEnabled = YES;
//开始录音
[_recoder prepareToRecord];
[_recoder record];
}else{
NSLog(@"%@",[initError description]);
}
停止录音
- (void)stopRecord{
if([_recoderisRecording]) {
[_recoderstop];
}
}
播放录音
- (void)startPlayWithFileName:(NSString *)fileName{
NSError*error;
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:&error];
//设置代理
_player.delegate=self;
if(error) {
[[NSNotificationCenter defaultCenter] postNotificationName:PlayErrorNotifcation object:nil];
}else{
[_playerplay];
}
}
停止播放录音
- (void)pausePlay{
if([_playerisPlaying]) {
[_playerpause];
}
}
录音完成会调用,我们可以在这个函数里边将录音文件转换为mp3文件
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag;
在iOS设备中进行录音,录音文件的格式为wav。但这种格式文件会很大,上传到服务器会消耗大量流量。为了适应终端的播放功能以及文件大小的要求,特将wav转换为mp3格式文件来使用。
注意:在录制wav文件时,需要使用双通道,否则在转换为MP3格式时,声音不对。
wav转MP3大致步骤如下:
1、下载lame源码:https://sourceforge.net/projects/lame/files/lame/,解压到一个文件夹里,完整路径如下
2、下载build的脚本,https://github.com/kewlbear/lame-ios-build,下载之后得到build-lame.sh,复制到步骤一中的路径下
3、用打开这个脚本,按照如下注释修改
第8行改为
SOURCE=""
第11行改为
SCRATCH=" /Users/**/Downloads/ Lame"
4. 打开终端, 依次输入如下命令行,输入系统密码, 开始编译
5. 编译完成, 生成fat-lame目录和thin-lame目录,分别存放合并所有指令集的静态库,以及各指令集的静态库
6.将fat-lame文件夹下的lame.h和libmp3lame.a文件导入项目中。
以下是完整的build的脚本,请注意第8行和第11行
#!/bin/sh
CONFIGURE_FLAGS="--disable-shared --disable-frontend"
ARCHS="arm64 armv7s x86_64 i386 armv7"
#directories
SOURCE="lame"
FAT="fat-lame"
SCRATCH="/Users/**/DownLoads/lame"
#must be an absolute path
THIN=`pwd`/"thin-lame"
COMPILE="y"
LIPO="y"
if["$*"]
then
if["$*"="lipo"]
then
#skip compile
COMPILE=
else
ARCHS="$*"
if[$#-eq1 ]
then
#skip lipo
LIPO=
fi
fi
fi
if["$COMPILE"]
then
CWD=`pwd`
forARCHin$ARCHS
do
echo"building$ARCH..."
mkdir -p"$SCRATCH/$ARCH"
cd"$SCRATCH/$ARCH"
if["$ARCH"="i386"-o"$ARCH"="x86_64"]
then
PLATFORM="iPhoneSimulator"
if["$ARCH"="x86_64"]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi
XCRUN_SDK=`echo$PLATFORM|tr'[:upper:]''[:lower:]'`
CC="xcrun -sdk$XCRUN_SDKclang -arch$ARCH"
#AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch$ARCH$SIMULATOR"
if!xcodebuild -version|grep"Xcode [1-6]\."
then
CFLAGS="$CFLAGS-fembed-bitcode"
fi
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC$CWD/$SOURCE/configure \
$CONFIGURE_FLAGS\
--host=$HOST\
--prefix="$THIN/$ARCH"\
CC="$CC"CFLAGS="$CFLAGS"LDFLAGS="$LDFLAGS"
make -j3 install
cd$CWD
done
fi
if["$LIPO"]
then
echo"building fat binaries..."
mkdir -p$FAT/lib
set-$ARCHS
CWD=`pwd`
cd$THIN/$1/lib
forLIBin*.a
do
cd$CWD
lipo -create`find$THIN-name$LIB`-output$FAT/lib/$LIB
done
cd$CWD
cp -rf$THIN/$1/include$FAT
fi