• iOS录音


    1.导入头文件,声明属性

    #import <MobileCoreServices/MobileCoreServices.h>
    
    @property (nonatomic,strong) AVAudioPlayer * audioPlayerSend;
    @property (nonatomic,strong) AVAudioSession * audioSession;
    @property (nonatomic,strong) AVAudioRecorder * audioRecorder;

    2.定制录音按钮

    self.longPressRecordBtn=[UIButton buttonWithType:UIButtonTypeCustom];
        self.longPressRecordBtn.frame=CGRectMake(50, 7, _screenW-140, 30);
        [self.longPressRecordBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [self.longPressRecordBtn setTitle:[NSString stringWithFormat:@"按住 说话"] forState:UIControlStateNormal];
        [self.longPressRecordBtn setTitle:[NSString stringWithFormat:@"松开 结束"] forState:UIControlStateHighlighted];
        [self.longPressRecordBtn setBackgroundImage:[UIImage imageNamed:@"bg_Tool_Record"] forState:UIControlStateNormal];
        [self.longPressRecordBtn addTarget:self action:@selector(talkPrepare) forControlEvents:UIControlEventTouchDown];
        [self.longPressRecordBtn addTarget:self action:@selector(talkSend) forControlEvents:UIControlEventTouchUpInside];
        [self.longPressRecordBtn addTarget:self action:@selector(recordViewBtnCancel) forControlEvents:UIControlEventTouchDragOutside];
        [self.longPressRecordBtn addTarget:self action:@selector(recordViewBtnRecording) forControlEvents:UIControlEventTouchDragInside];
        [self.longPressRecordBtn addTarget:self action:@selector(talkCancel) forControlEvents:UIControlEventTouchUpOutside];
        self.longPressRecordBtn.hidden=YES;

    3.开始录音方法

    -(void)startAudioRecord
    {
        [_audioSession setActive:YES error: nil];
        
    //    NSString * nnPKChat = [Util GetUUID];
    //    NSString * nPKChat = [nnPKChat lowercaseString];
        
        // 获取音频文件的保存路径
        NSString *destinationString = [SaveAudioVoiceDataEngine getRecordTemporaryVoiceWholePath];
        NSURL *destinationURL = [NSURL fileURLWithPath:destinationString];
        // 创建一个NSDictionary,用于保存录制属性
        NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];
        
        // 设置录制音频的格式
        [recordSettings setObject:[NSNumber numberWithInt:kAudioFormatLinearPCM]
                           forKey: AVFormatIDKey];
        
        // 设置录制音频的采样率
        //    float sampleRate=11025.0;
        float sampleRate=8000.0;
        [recordSettings setObject:[NSNumber numberWithFloat:
                                   sampleRate] forKey: AVSampleRateKey];
        
        // 设置录制音频的通道数
        NSInteger ch=1;
        [recordSettings setObject:
         [NSNumber numberWithInt:ch]
                           forKey:AVNumberOfChannelsKey];
        
        // 设置录制音频的每个样点的位数
        NSInteger bi=16;
        [recordSettings setObject: [NSNumber numberWithInt:bi]
                           forKey:AVLinearPCMBitDepthKey];
        
        //    // 设置录制音频采用高位优先的记录格式
        //    [recordSettings setObject:[NSNumber numberWithBool:NO]
        //                       forKey:AVLinearPCMIsBigEndianKey];
        //
        //    // 设置采样信号采用浮点数
        //    [recordSettings setObject:[NSNumber numberWithBool:NO]
        //                       forKey:AVLinearPCMIsFloatKey];
        //
        //    // 音频质量
        //    [recordSettings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
        NSError *recorderSetupError = nil;
        
        // 初始化AVAudioRecorder
        self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:destinationURL
                                                         settings:recordSettings  error:&recorderSetupError];
        self.audioRecorder.meteringEnabled=YES;
        [self.audioRecorder updateMeters];
        self.audioRecorder.delegate = self;
        [self.audioRecorder record];
        
        _recordTimeNum=0.0;
        _recordingTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(volumeChange) userInfo:nil repeats:YES];
    }

    4.说话声音大小改变图片(并且存储临时声音文件)

    -(void)volumeChange
    {
        _recordTimeNum+=0.5;
        
        if (self.audioRecorder)
        {
            if (_recordTimeNum < 50)
            {
                [self.audioRecorder updateMeters];
                
                float h = pow(10, (0.05 * [self.audioRecorder peakPowerForChannel:0]));
                NSInteger vh = ceilf(h * 8);
                NSLog(@"---%f",h);
                
                self.recordingHUD.showVolumeView.image=[UIImage imageNamed:[NSString stringWithFormat:@"icon_chat_microphone%d",vh]];
            }else if (_recordTimeNum < 60)
            {
                [self showCancelRecordHUD];
                _cancelRecordHUD.statusLab.text=[NSString stringWithFormat:@"%.0f",ceilf(_recordTimeNum)];
            }else if (_recordTimeNum == 60)
            {
                _timeoutSended=YES;
                [self hidenRecordHUD];
                [self recordEndToSend];
            }
        }
    }

    5.发送语音消息

    -(void)recordEndToSend
    {
        [self closeAudioSessionAndAudioRecord];
        
        NSString *destinationString = [SaveAudioVoiceDataEngine getRecordTemporaryVoiceWholePath];
        NSURL *destinationURL = [NSURL fileURLWithPath:destinationString];
        
        AVAudioPlayer * avap = [[AVAudioPlayer alloc]initWithContentsOfURL:destinationURL error:nil];
        NSInteger l=(int)avap.duration;
        
        if (l >= 1)
        {
            NSString * nnPKChat = [Util GetUUID];
            NSString * nPKChat = [nnPKChat lowercaseString];
            NSString * updatePath = [SaveAudioVoiceDataEngine spliceRelativePathWithWithPKVoice:nPKChat phoneNumber:self.friendPhoneNumber pathType:1];
            
            [VoiceConverter wavToAmr:[SaveAudioVoiceDataEngine getRecordTemporaryVoiceWholePath] amrSavePath:[SaveAudioVoiceDataEngine getVoiceLocalWholePathWithPath:updatePath PKVoice:nPKChat]];
            
            MessageObj * obj = [[MessageObj alloc]init];
            obj.PKChat=nPKChat;
            obj.MessageType = 4;
            obj.MessageFromType=1;
            obj.PKUserFrom = _myUserStr;
            obj.MessageActions=@"";
            obj.createTime = [Util getNowDateTime];
            obj.voiceLength = l;
            obj.voiceStatus=1;
            obj.VoiceRelPath=updatePath;
            obj.messageSize = CGSizeMake(20, 20);
            
            [_array addObject:obj];
            [self.chatTableView reloadData];
            if (_array.count>0)
            {
                [self.chatTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:_array.count-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
            }
            
            _recordTimeNum=0;
            
            [SNSInfomationEngine operateChatInfomationToSQLWithMessageObj:obj PKUserTo:self.PKUserFriend imageSize:CGSizeZero];
            [SaveAudioVoiceDataEngine sendChatVoiceWithMessageObj:obj PKUserTo:self.PKUserFriend chatMsgServer:self.chatMsgSer UserHostServer:_appdelegate.serviceUrl phoneNumber:self.friendPhoneNumber success:^
            {
                NSLog(@"sendVoiceSuccess");
            } Failure:^
            {
                NSLog(@"sendVoicefailure");
            }];
            
        }else
        {
            NSLog(@"说话时间太短");
        }
    }
  • 相关阅读:
    360抢票王验证码自动识别真的那么牛吗?
    wpf 的各个template
    HTML/CSS实现的一个列表页
    泛型约束和利用反射修改对象属性的值
    KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值
    检查对象是否为NULL或者为Empty
    【笔记】WPF实现ViewPager引导界面效果及问题汇总
    【笔记】WPF之模板控件应用
    【笔记】W3C CSS关键属性
    【转】Web标准中的常见问题
  • 原文地址:https://www.cnblogs.com/liaods/p/4887151.html
Copyright © 2020-2023  润新知