美文网首页
iOS AVAudioRecorder的应用

iOS AVAudioRecorder的应用

作者: 9898a | 来源:发表于2017-06-29 09:25 被阅读0次

    IOS 录音AVAudioRecorder

    144  作者 qilinit 关注

    2016.09.07 23:41 字数 208 阅读 112评论 0喜欢 0

    1、懒加载一个AVAudioRecorer类对象

    2、设置保存的沙盒地址

    3、将沙盒的地址转换成NSURl对象

    4、用字典设置属性

    5、创建对象

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    }

    /**

    *  懒加载avaudiorecorder对象

    *

    *  @return AVAudioRecorer

    */

    -(AVAudioRecorder *)recorder

    {

    if (_recorder == nil) {

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    NSString *filePath = [path stringByAppendingPathComponent:@"123.caf"];

    self.pathUILable.text = filePath;

    NSLog(@"%@",filePath);

    NSURL *url = [NSURL URLWithString:filePath];

    NSDictionary *settingRecorder = @{AVFormatIDKey:@(kAudioFormatLinearPCM),AVSampleRateKey : @(8000)};

    self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settingRecorder error:nil];

    }

    return _recorder;

    }

    /**

    *  开始录音

    *

    *  @param sender void

    */

    - (IBAction)recorder:(id)sender {

    [self.recorder record];

    }

    - (IBAction)stopRecorder:(id)sender {

    [self.recorder stop];

    }

    @end

    #import<AVFoundation/AVFoundation.h>

    #include "lame.h"

    #define kSCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

    #define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)//应用尺寸

    #define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]

    #define RGB(r,g,b) RGBA(r,g,b,1.0f)

    #define kColorBack [UIColor groupTableViewBackgroundColor]

    #define margin 15

    #define kSandboxPathStr [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]

    #define kMp3FileName @"myRecord.mp3"

    #define kCafFileName @"myRecord.caf"

    2.分别遵守协议<AVAudioPlayerDelegate,AVAudioRecorderDelegate,UIGestureRecognizerDelegate>

    @property (nonatomic,strong) UIView *recordView;

    @property (nonatomic,strong) UIView *editView;

    @property (nonatomic,strong) UIImageView *voiceView;

    @property (nonatomic,strong) UILabel *timeLabel;  //录音计时

    @property (nonatomic,strong) UILabel *timeLabel2;  //语音试听计时

    @property (nonatomic,strong) UIImageView *recordBtn;

    @property (nonatomic,strong) UIImageView *rotateImgView;

    @property (nonatomic,strong) NSTimer *timer1;  //控制录音时长显示更新

    @property (nonatomic,assign) NSInteger countNum;//录音计时(秒)

    @property (nonatomic,copy) NSString *cafPathStr;

    @property (nonatomic,copy) NSString *mp3PathStr;

    @property (nonatomic,strong) AVAudioRecorder *audioRecorder;//音频录音机

    @property (nonatomic, strong) CABasicAnimation *rotationAnimation;

    3.声明宏定义

    /**

    *存放所有的音乐播放器

    */

    static NSMutableDictionary *_musices;

    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];

    self.title = @"录音";

    self.navigationController.navigationBar.barTintColor = RGB(215, 155, 252);

    [self initEditView];

    [self.view addSubview:self.recordView];

    self.timeLabel2.text = @"";

    self.cafPathStr = [kSandboxPathStr stringByAppendingPathComponent:kCafFileName];

    self.mp3PathStr =  [kSandboxPathStr stringByAppendingPathComponent:kMp3FileName];

    - (void)viewWillDisappear:(BOOL)animated

    {

    [super viewWillDisappear:animated];

    [self stopPlayRecord];

    }

    -(void)viewWillAppear:(BOOL)animated

    {

    [super viewWillAppear:animated];

    [self.view endEditing:YES];

    }

    - (void)changeRecordTime

    {

    self.countNum += 1;

    NSInteger min = self.countNum/60;

    NSInteger sec = self.countNum - min * 60;

    self.timeLabel.text = [NSString stringWithFormat:@"%02d:%02d",min,sec];

    }

    #pragma mark - 语音编辑视图

    - (void)initEditView{

    CGFloat commonW =kSCREEN_WIDTH - margin*2;

    UILabel *label1 = [[UILabel alloc]init];

    label1.text = @"语音试听";

    label1.textColor = [UIColor blackColor];

    label1.frame = CGRectMake(margin , margin , commonW * 0.6, 21);

    label1.font = [UIFont systemFontOfSize:16];

    CGFloat deleteW = 50.0;

    UIView *listenView = [[UIView alloc]init];

    listenView.frame = CGRectMake(margin, CGRectGetMaxY(label1.frame)+margin, commonW - deleteW - margin, 35);

    listenView.layer.cornerRadius = 3;

    listenView.clipsToBounds = YES;

    listenView.layer.borderColor = [UIColor purpleColor].CGColor;

    listenView.backgroundColor = [UIColor whiteColor];

    listenView.layer.borderWidth = 1;

    listenView.userInteractionEnabled = YES;

    [listenView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playRecord)]];

    UIImageView *iconView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"voice"]];

    CGFloat iconW = 11;

    CGFloat iconH = 14;

    CGFloat iconX = 8;

    CGFloat iconY = (listenView.frame.size.height - iconH) * 0.5;

    iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);

    self.voiceView = iconView;

    [listenView addSubview:iconView];

    UILabel *timeLabel2 = [[UILabel alloc]init];

    CGFloat labelW = 50;

    CGFloat timeW = 120;

    CGFloat timeX = listenView.frame.size.width - timeW;

    timeLabel2.frame = CGRectMake(timeX, 0, timeW, listenView.frame.size.height);

    timeLabel2.text = @"\"";

    timeLabel2.textColor = [UIColor grayColor];

    timeLabel2.textAlignment = NSTextAlignmentRight;

    self.timeLabel2 = timeLabel2;

    [listenView addSubview:timeLabel2];

    UILabel *listenLabel = [[UILabel alloc]init];

    listenLabel.frame = CGRectMake(CGRectGetMaxX(iconView.frame) + 5, 0, labelW , listenView.frame.size.height);

    listenLabel.text = @"试听";

    listenLabel.textColor = [UIColor purpleColor];

    [listenView addSubview:listenLabel];

    UIButton *deleteBtn = [[UIButton alloc]init];

    CGFloat deleteX =CGRectGetMaxX(listenView.frame) + margin;

    deleteBtn.frame = CGRectMake(deleteX, CGRectGetMinY(listenView.frame), deleteW, listenView.frame.size.height);

    [deleteBtn setTitle:@"删除" forState:UIControlStateNormal];

    [deleteBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];

    [deleteBtn setBackgroundColor:[UIColor whiteColor]];

    deleteBtn.layer.cornerRadius = 3;

    deleteBtn.clipsToBounds = YES;

    deleteBtn.layer.borderColor = [UIColor lightGrayColor].CGColor;

    deleteBtn.layer.borderWidth = 1;

    deleteBtn.titleLabel.font = [UIFont systemFontOfSize:16];

    [deleteBtn addTarget:self action:@selector(showDeleteAlert) forControlEvents:UIControlEventTouchUpInside];

    [self.editView addSubview:label1];

    [self.editView addSubview:listenView];

    [self.editView addSubview:deleteBtn];

    [self pictureChangeAnimationSetting];

    }

    #pragma mark - 动画效果

    - (void)pictureChangeAnimationSetting

    {

    NSArray *picArray = @[[UIImage imageNamed:@"voice1"],

    [UIImage imageNamed:@"voice2"],

    [UIImage imageNamed:@"voice3"],];

    //    self.imageView.image = [UIImage imageNamed:@"voice1"];

    //imageView的动画图片是数组images

    self.voiceView.animationImages = picArray;

    //按照原始比例缩放图片,保持纵横比

    self.voiceView.contentMode = UIViewContentModeScaleAspectFit;

    //切换动作的时间3秒,来控制图像显示的速度有多快,

    self.voiceView.animationDuration = 1;

    //动画的重复次数,想让它无限循环就赋成0

    self.voiceView.animationRepeatCount = 0;

    }

    #pragma mark - 删除当前录音

    - (void)deleteCurrentRecord

    {

    [self deleteOldRecordFile];

    [self stopPlayRecord];

    self.timeLabel2.text = @"";

    self.timeLabel.text = @"00:00";

    }

    - (void)commitVoiceNotice

    {

    [self audio_PCMtoMP3];

    NSData *data = [NSData dataWithContentsOfFile:self.mp3PathStr];

    NSString *base64Str = [self Base64StrWithMp3Data:data];

    if ([self isBlankString:base64Str]) {

    return;

    }

    NSData *mp3Data = [self Mp3DataWithBase64Str:base64Str];

    //    [AudioTool playMusicWithData:mp3Data];

    }

    -(UIView *)recordView{

    if (!_recordView) {

    CGFloat recordH = kSCREEN_HEIGHT * 0.4;

    CGFloat availH = recordH - margin * 4;

    _recordView = [[UIView alloc]initWithFrame:CGRectMake(0, kSCREEN_HEIGHT - recordH, kSCREEN_WIDTH, recordH)];

    _recordView.backgroundColor = [UIColor whiteColor];

    CGFloat timeH = availH * 0.2;

    CGFloat btnH = availH * 0.7;

    CGFloat noticeH = availH * 0.1;

    self.timeLabel.frame = CGRectMake(0, margin, kSCREEN_WIDTH, timeH);

    self.recordBtn.frame = CGRectMake((kSCREEN_WIDTH - btnH)*0.5, CGRectGetMaxY(self.timeLabel.frame) + margin, btnH, btnH);

    self.recordBtn.layer.cornerRadius = self.recordBtn.frame.size.width * 0.5;

    [self.recordBtn.layer setMasksToBounds:YES];

    //        [self.recordBtn addTarget:self action:@selector(recordNotice) forControlEvents:UIControlEventTouchDown];

    //        [self.recordBtn addTarget:self action:@selector(stopNotice) forControlEvents:UIControlEventTouchUpInside];

    //实例化长按手势监听

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTableviewCellLongPressed:)];

    //代理

    longPress.delegate = self;

    longPress.minimumPressDuration = 0.5;

    [self.recordBtn addGestureRecognizer:longPress];

    self.rotateImgView.frame = CGRectMake(0, 0, btnH, btnH);

    self.rotateImgView.center = self.recordBtn.center;

    [_recordView addSubview:self.rotateImgView];

    [_recordView addSubview:self.timeLabel];

    [_recordView addSubview:self.recordBtn];

    UILabel *noticeLabel = [[UILabel alloc]init];

    noticeLabel.frame = CGRectMake(0, recordH - noticeH - margin, kSCREEN_WIDTH, noticeH);

    noticeLabel.textAlignment = NSTextAlignmentCenter;

    noticeLabel.textColor = [UIColor lightGrayColor];

    noticeLabel.font = [UIFont systemFontOfSize:14];

    noticeLabel.text = @"按住不放录制语音";

    //        noticeLabel.backgroundColor = [UIColor redColor];

    [_recordView addSubview:noticeLabel];

    }

    return _recordView;

    }

    //长按事件的实现方法

    - (void) handleTableviewCellLongPressed:(UILongPressGestureRecognizer *)gestureRecognizer {

    if (gestureRecognizer.state ==  UIGestureRecognizerStateBegan) {

    NSLog(@"UIGestureRecognizerStateBegan");

    [self startRecordNotice];

    }

    if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {

    }

    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {

    NSLog(@"UIGestureRecognizerStateEnded");

    [self stopRecordNotice];

    }

    }

    #pragma mark - 录音方法

    - (void)startRecordNotice{

    self.timeLabel2.text = @"";

    [self stopMusicWithUrl:[NSURL URLWithString:self.cafPathStr]];

    [self.voiceView.layer removeAllAnimations];

    self.voiceView.image = [UIImage imageNamed:@"voice3"];

    if ([self.audioRecorder isRecording]) {

    [self.audioRecorder stop];

    }

    NSLog(@"----------开始录音----------");

    [self deleteOldRecordFile];  //如果不删掉,会在原文件基础上录制;虽然不会播放原来的声音,但是音频长度会是录制的最大长度。

    AVAudioSession *audioSession=[AVAudioSession sharedInstance];

    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    [_recordBtn setImage:[UIImage imageNamed:@"record_high"]];

    if (![self.audioRecorder isRecording]) {//0--停止、暂停,1-录制中

    [self.audioRecorder record];//首次使用应用时如果调用record方法会询问用户是否允许使用麦克风

    self.countNum = 0;

    NSTimeInterval timeInterval =1 ; //0.1s

    self.timer1 = [NSTimer scheduledTimerWithTimeInterval:timeInterval  target:self selector:@selector(changeRecordTime)  userInfo:nil  repeats:YES];

    [self.timer1 fire];

    }

    [self starAnimalWithTime:2.0];

    }

    // 执行动画

    - (void)starAnimalWithTime:(CFTimeInterval)time

    {

    self.rotateImgView.image = [UIImage imageNamed:@"rcirle_high"];

    self.rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

    self.rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ];

    self.rotationAnimation.duration = time;

    self.rotationAnimation.cumulative = YES;

    self.rotationAnimation.repeatCount = HUGE_VALF;

    [self.rotateImgView.layer addAnimation:self.rotationAnimation forKey:@"rotationAnimation"];

    }

    - (void)stopRecordNotice

    {

    NSLog(@"----------结束录音----------");

    [self.audioRecorder stop];

    [self.timer1 invalidate];

    //停止旋转动画

    [self.rotateImgView.layer removeAllAnimations];

    self.voiceView.image = [UIImage imageNamed:@"voice3"];

    self.rotateImgView.image = [UIImage imageNamed:@"rcirle_norm"];

    [self.recordBtn setImage:[UIImage imageNamed:@"record_norm"]];

    [self audio_PCMtoMP3];

    //计算文件大小

    long long fileSize = [self fileSizeAtPath:self.mp3PathStr]/1024.0;

    NSString *fileSizeStr = [NSString stringWithFormat:@"%lld",fileSize];

    self.timeLabel2.text = [NSString stringWithFormat:@"%ld \" %@kb  ",(long)self.countNum,fileSizeStr];

    self.timeLabel.text = @"00:00";

    NSLog(@"timer isValid:%d",self.timer1.isValid);

    //    NSLog(@"mp3PathStr:%@",self.mp3PathStr);

    NSLog(@"countNum %d , fileSizeStr : %@",self.countNum,fileSizeStr);

    }

    #pragma mark - 播放

    - (void)playRecord

    {

    [self stopAllMusic];

    AVAudioSession *audioSession=[AVAudioSession sharedInstance];

    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];  //此处需要恢复设置回放标志,否则会导致其它播放声音也会变小

    [self playMusicWithUrl:[NSURL URLWithString:self.cafPathStr]];

    [self.voiceView startAnimating];

    }

    - (void)stopPlayRecord

    {

    [self stopMusicWithUrl:[NSURL URLWithString:self.cafPathStr]];

    [self.voiceView.layer removeAllAnimations];

    self.voiceView.image = [UIImage imageNamed:@"voice3"];

    }

    -(void)deleteOldRecordFile{

    NSFileManager* fileManager=[NSFileManager defaultManager];

    BOOL blHave=[[NSFileManager defaultManager] fileExistsAtPath:self.cafPathStr];

    if (!blHave) {

    NSLog(@"不存在");

    return ;

    }else {

    NSLog(@"存在");

    BOOL blDele= [fileManager removeItemAtPath:self.cafPathStr error:nil];

    if (blDele) {

    NSLog(@"删除成功");

    }else {

    NSLog(@"删除失败");

    }

    }

    }

    -(void)deleteOldRecordFileAtPath:(NSString *)pathStr{

    NSFileManager* fileManager=[NSFileManager defaultManager];

    BOOL blHave=[[NSFileManager defaultManager] fileExistsAtPath:pathStr];

    if (!blHave) {

    NSLog(@"不存在");

    return ;

    }else {

    NSLog(@"存在");

    BOOL blDele= [fileManager removeItemAtPath:self.cafPathStr error:nil];

    if (blDele) {

    NSLog(@"删除成功");

    }else {

    NSLog(@"删除失败");

    }

    }

    }

    -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

    {

    NSLog(@"delegate--播放完毕----------------------");

    [self.voiceView.layer removeAllAnimations];

    self.voiceView.image = [UIImage imageNamed:@"voice3"];

    }

    #pragma mark - caf转mp3

    - (void)audio_PCMtoMP3

    {

    @try {

    int read, write;

    FILE *pcm = fopen([self.cafPathStr cStringUsingEncoding:1], "rb");  //source 被转换的音频文件位置

    fseek(pcm, 4*1024, SEEK_CUR);                                  //skip file header

    FILE *mp3 = fopen([self.mp3PathStr 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_in_samplerate(lame, 11025.0);

    lame_set_VBR(lame, vbr_default);

    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);

    }

    @catch (NSException *exception) {

    NSLog(@"%@",[exception description]);

    }

    @finally {

    NSLog(@"MP3生成成功: %@",self.mp3PathStr);

    }

    }

    #pragma mark -  Getter

    /**

    *  获得录音机对象

    *

    *  @return 录音机对象

    */

    -(AVAudioRecorder *)audioRecorder{

    if (!_audioRecorder) {

    //创建录音文件保存路径

    NSURL *url=[NSURL URLWithString:self.cafPathStr];

    //创建录音格式设置

    NSDictionary *setting=[self getAudioSetting];

    //创建录音机

    NSError *error=nil;

    _audioRecorder=[[AVAudioRecorder alloc]initWithURL:url settings:setting error:&error];

    _audioRecorder.delegate=self;

    _audioRecorder.meteringEnabled=YES;//如果要监控声波则必须设置为YES

    if (error) {

    NSLog(@"创建录音机对象时发生错误,错误信息:%@",error.localizedDescription);

    return nil;

    }

    }

    return _audioRecorder;

    }

    #pragma mark - AudioPlayer方法

    /**

    *播放音乐文件

    */

    - (BOOL)playMusicWithUrl:(NSURL *)fileUrl

    {

    //其他播放器停止播放

    [self stopAllMusic];

    if (!fileUrl) return NO;

    AVAudioSession *session=[AVAudioSession sharedInstance];

    [session setCategory:AVAudioSessionCategoryPlayback error:nil];  //此处需要恢复设置回放标志,否则会导致其它播放声音也会变小

    [session setActive:YES error:nil];

    AVAudioPlayer *player=[self musices][fileUrl];

    if (!player) {

    //2.2创建播放器

    player=[[AVAudioPlayer alloc]initWithContentsOfURL:fileUrl error:nil];

    }

    player.delegate = self;

    if (![player prepareToPlay]){

    NSLog(@"缓冲失败--");

    //        [self myToast:@"播放器缓冲失败"];

    return NO;

    }

    [player play];

    //2.4存入字典

    [self musices][fileUrl]=player;

    NSLog(@"musices:%@ musices",self.musices);

    return YES;//正在播放,那么就返回YES

    }

    /**

    *播放音乐文件

    */

    - (void)stopMusicWithUrl:(NSURL *)fileUrl{

    if (!fileUrl) return;//如果没有传入文件名,那么就直接返回

    //1.取出对应的播放器

    AVAudioPlayer *player=[self musices][fileUrl];

    //2.停止

    if ([player isPlaying]) {

    [player stop];

    NSLog(@"播放结束:%@--------",fileUrl);

    }

    if ([[self musices].allKeys containsObject:fileUrl]) {

    [[self musices] removeObjectForKey:fileUrl];

    }

    }

    - (BOOL)isPlayingWithUniqueID:(NSString *)uniqueID

    {

    if ([[self musices].allKeys containsObject:uniqueID]) {

    AVAudioPlayer *player=[self musices][uniqueID];

    return [player isPlaying];

    }else{

    return NO;

    }

    }

    - (void)stopAllMusic

    {

    if ([self musices].allKeys.count > 0) {

    for ( NSString *playID in [self musices].allKeys) {

    AVAudioPlayer *player=[self musices][playID];

    [player stop];

    }

    }

    }

    - (NSMutableDictionary *)musices

    {

    if (_musices==nil) {

    _musices=[NSMutableDictionary dictionary];

    }

    return _musices;

    }

    /**

    *  取得录音文件设置

    *

    *  @return 录音设置

    */

    -(NSDictionary *)getAudioSetting{

    //LinearPCM 是iOS的一种无损编码格式,但是体积较为庞大

    //录音设置

    NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];

    //录音格式 无法使用

    [recordSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey: AVFormatIDKey];

    //采样率

    [recordSettings setValue :[NSNumber numberWithFloat:11025.0] forKey: AVSampleRateKey];//44100.0

    //通道数

    [recordSettings setValue :[NSNumber numberWithInt:2] forKey: AVNumberOfChannelsKey];

    //线性采样位数

    //[recordSettings setValue :[NSNumber numberWithInt:16] forKey: AVLinearPCMBitDepthKey];

    //音频质量,采样质量

    [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];

    return recordSettings;

    }

    -(UIImageView *)rotateImgView

    {

    if (!_rotateImgView) {

    _rotateImgView = [[UIImageView alloc]init];

    _rotateImgView.image = [UIImage imageNamed:@"rcirle_norm"];

    }

    return _rotateImgView;

    }

    -(UIView *)editView

    {

    if (!_editView) {

    _editView = [[UIView alloc]initWithFrame:CGRectMake(0, 64, kSCREEN_WIDTH, 200)];

    _editView.backgroundColor = kColorBack;

    [self.view addSubview:_editView];

    }

    return _editView;

    }

    -(UILabel *)timeLabel

    {

    if (!_timeLabel) {

    _timeLabel = [[UILabel alloc]init];

    _timeLabel.textAlignment = NSTextAlignmentCenter;

    _timeLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:42];

    _timeLabel.text = @"00:00";

    _timeLabel.textColor = RGB(215, 155, 252);

    }

    return _timeLabel;

    }

    - (UIImageView *)recordBtn

    {

    if (!_recordBtn) {

    _recordBtn = [[UIImageView alloc]init];

    _recordBtn.backgroundColor = [UIColor clearColor];

    [_recordBtn setImage:[UIImage imageNamed:@"record_norm"]];

    _recordBtn.userInteractionEnabled = YES;//方便添加长按手势

    }

    return _recordBtn;

    }

    #pragma mark - 文件转换

    // 二进制文件转为base64的字符串

    - (NSString *)Base64StrWithMp3Data:(NSData *)data{

    if (!data) {

    NSLog(@"Mp3Data 不能为空");

    return nil;

    }

    //    NSString *str = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

    NSString *str = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

    return str;

    }

    // base64的字符串转化为二进制文件

    - (NSData *)Mp3DataWithBase64Str:(NSString *)str{

    if (str.length ==0) {

    NSLog(@"Mp3DataWithBase64Str:Base64Str 不能为空");

    return nil;

    }

    NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];

    NSLog(@"Mp3DataWithBase64Str:转换成功");

    return data;

    }

    //单个文件的大小

    - (long long) fileSizeAtPath:(NSString*)filePath{

    NSFileManager* manager = [NSFileManager defaultManager];

    if ([manager fileExistsAtPath:filePath]){

    return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];

    }else{

    NSLog(@"计算文件大小:文件不存在");

    }

    return 0;

    }

    - (BOOL)isBlankString:(NSString *)string {

    if (string == nil || string == NULL) {

    return YES;

    }

    if ([string isKindOfClass:[NSNull class]]) {

    return YES;

    }

    if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0) {

    return YES;

    }

    return NO;

    }

    相关文章

      网友评论

          本文标题:iOS AVAudioRecorder的应用

          本文链接:https://www.haomeiwen.com/subject/qsxmcxtx.html