iOS 录音、格式转换

需求

        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格式时,声音不对。

wavMP3大致步骤如下

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

你可能感兴趣的:(iOS 录音、格式转换)