美文网首页
iOS (相册、视频、录音、语音识别)

iOS (相册、视频、录音、语音识别)

作者: 无敌小蚂蚱这个名字被占用了 | 来源:发表于2018-01-30 14:31 被阅读0次

最近用到了系统自带的工具 (相册、视频、录音、语音识别)

都是一些常用的功能 ,废话不多哦  直接开始

dome GitHub 地址 可以下载参考

https://github.com/LWKMUMU/iOS_systemTool/tree/master/MLTestDome

1、【调用系统的相册和拍照】  (其实这个太简单了 ,本不想记录了不过为了完整 还是简单分享一下吧)

#import <MobileCoreServices/MobileCoreServices.h> //先引用着 下面会有说哪里用这个

遵守两个协议  一个UIImagePickerControllerDelegate 另一个是UINavigationControllerDelegate

直接开始创建系统的UIImagePickerController

然后设置一些自己想要的属性就可以了

【本地照片】

UIImagePickerController * pickerController = [[UIImagePickerController alloc] init];

        pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//本地

pickerController.mediaTypes = @[(NSString *)kUTTypeImage];//只允许照片 这个属性值就用到了上面所说的那个引用

pickerController.allowsEditing = NO;//是否可以编辑

pickerController.delegate = ViewController;

[ViewController presentViewController:alertController animated:YES completion:nil];

【拍摄照片】(在这之前记得要判断权限,dome里有写判断权限)

直接将上面的sourceType属性值替换成 UIImagePickerControllerSourceTypeCamera 就可以了 打开就是相机界面了

拍摄还有其它的一些设置 看项目具体需求设置,比如:

1、拍摄时打开闪光灯(UIImagePickerControllerCameraFlashMode)

//        UIImagePickerControllerCameraFlashModeOff

//        UIImagePickerControllerCameraFlashModeAuto 默认自动

//        UIImagePickerControllerCameraFlashModeOn

pickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;

2、//拍摄时打开的摄像头(UIImagePickerControllerCameraDevice)

//        UIImagePickerControllerCameraDeviceRear,//后摄像头 默认

//        UIImagePickerControllerCameraDeviceFront //前摄像头

  pickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;

还有其他的设置自己去找吧 

2、【获取系统的视频和拍摄视频】

【本地视频】

UIImagePickerController * pickerController = [[UIImagePickerController alloc] init];

        pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

pickerController.mediaTypes =@[(NSString*)kUTTypeMovie];//只允许视频

pickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

pickerController.allowsEditing = NO;

pickerController.delegate = ViewController;

[ViewController presentViewController:alertController animated:YES completion:nil];

【拍摄视频】(在这之前记得要判断权限,dome里有写判断权限)

直接将上面的sourceType属性值替换成 UIImagePickerControllerSourceTypeCamera 就可以了 打开就是相机界面了

【协议回调】

【使用回调】

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    NSLog(@"%@", info);

    //    UIImagePickerControllerMediaType // 返回媒体的媒体类型

    NSString *mediaType = info[UIImagePickerControllerMediaType];

    if ([mediaType isEqualToString:(NSString*)kUTTypeMovie]){//视频

    NSURL *URL = info[UIImagePickerControllerMediaURL];

                    NSData *file = [NSData dataWithContentsOfURL:URL];//视频data数据

//如果拍摄的视频想要保存到相册

    //UISaveVideoAtPathToSavedPhotosAlbum(URL.path, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);

        }else{//图片

    // UIImagePickerControllerEditedImage // 编辑后的UIImage

    //    UIImagePickerControllerOriginalImage // 原始的UIImage

    //    UIImagePickerControllerReferenceURL // 图片地址

    UIImage * image = info[UIImagePickerControllerOriginalImage];//获取得到的原始图片

//如果拍摄的图片想要保存到相册

//UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

    }

//图片info

[self dismissViewControllerAnimated:YES completion:nil];

}

【取消回调】

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{

    [self dismissViewControllerAnimated:YES completion:nil];

}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{

    if (error){

        NSLog(@"图片保存失败%@", error.localizedDescription);

    }else{

        NSLog(@"图片保存成功");

    }

}

- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo {

    if (error) {

        NSLog(@"保存视频失败%@", error.localizedDescription);

    }

    else {

        NSLog(@"保存视频成功");

    }

}

3、【系统录音】引用#import<AVFoundation/AVFoundation.h>

遵守一个协议 AVAudioRecorderDelegate

初始化一个AVAudioRecorder

        NSError * error = nil;

        //录音设置

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

        //设置录音格式  AVFormatIDKey==kAudioFormatLinearPCM

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

        //设置录音采样率(Hz) 如:AVSampleRateKey==8000/44100/96000(影响音频的质量)

        [recordSetting setValue:[NSNumber numberWithFloat:8000] forKey:AVSampleRateKey];

        //录音通道数  1 或 2

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

        //线性采样位数  8、16、24、32

        [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];

        //录音的质量

        [recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMedium] forKey:AVEncoderAudioQualityKey];

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

        NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@.caf", strUrl,[self getCurrentTime]]];

        //初始化

        AVAudioRecorder * recorder  = [[AVAudioRecorder alloc]initWithURL:url settings:recordSetting error:&error];

        //开启音量检测

        recorder.meteringEnabled = YES;

        recorder.delegate = self;

【开始录音】(在这之前记得要判断权限,dome里有写判断权限)

- (void)recordingBegin{

  if ([self.recorder prepareToRecord]) {

        [self.recorder record];

    }else{}

}

【结束录音】

- (void)recordingEndWithSuccessRecord:(void(^)(NSURL * url))block {

  __weak typeof(self) weakSelf = self;

    if (self.recorder) {

        [self.recorder stop];

        if (block) {

            //此时的录音为caf格式 需要转换成MP3格式  推荐lame第三方转换

            block(weakSelf.recorder.url);

        }

    }

}

//获取当地时间

- (NSString *)getCurrentTime {

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    [formatter setDateFormat:@"yyyyMMddHHmmssS"];

    NSString *dateTime = [formatter stringFromDate:[NSDate date]];

    return dateTime;

}

4、【语音识别】这个功能最低支持的系统要求是10.0 所以记得处理这个问题

语音识别呢 需要引用 #import<Speech/Speech.h>这个头文件

遵守SFSpeechRecognizerDelegate这个协议

科大讯飞.....微信.....百度......额 算了 不说他们SDK了

直接开始吧

@property (nonatomic,strong) SFSpeechRecognizer *speechRecognizer;

@property (nonatomic,strong) AVAudioEngine *audioEngine;

@property (nonatomic,strong) SFSpeechRecognitionTask *recognitionTask;

@property (nonatomic,strong) SFSpeechAudioBufferRecognitionRequest *recognitionRequest;

- (AVAudioEngine *)audioEngine{

    if (!_audioEngine) {

        _audioEngine = [[AVAudioEngine alloc] init];

    }

    return _audioEngine;

}

- (SFSpeechRecognizer *)speechRecognizer{

    if (!_speechRecognizer) {

        NSLocale *local =[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

        _speechRecognizer =[[SFSpeechRecognizer alloc] initWithLocale:local];

        _speechRecognizer.delegate = self;

    }

    return _speechRecognizer;

}

【开始语音识别】(在这之前记得要判断权限,dome里有写判断权限)

- (void)starteRecording{

    if (_recognitionTask) {

        [_recognitionTask cancel];

        _recognitionTask = nil;

    }

  AVAudioSession *audioSession = [AVAudioSession sharedInstance];

    NSError *error;

    [audioSession setCategory:AVAudioSessionCategoryRecord error:&error];

    NSParameterAssert(!error);

    [audioSession setMode:AVAudioSessionModeMeasurement error:&error];

    NSParameterAssert(!error);

    [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

    NSParameterAssert(!error);

  _recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];

    AVAudioInputNode *inputNode = self.audioEngine.inputNode;

    NSAssert(inputNode, @"录入设备没有准备好");

    NSAssert(_recognitionRequest, @"请求初始化失败");

    _recognitionRequest.shouldReportPartialResults = YES;

    __weak typeof(self) weakSelf = self;

    _recognitionTask = [self.speechRecognizer recognitionTaskWithRequest:_recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {

        __strong typeof(weakSelf) strongSelf = weakSelf;

        BOOL isFinal = NO;

        if (result) {

            //            strongSelf.resultStringLable.text = result.bestTranscription.formattedString;

            //这个协议方法回调识别到的结果

            [strongSelf.delegate identifyResults:result.bestTranscription.formattedString];

          isFinal = result.isFinal;

        }

        if (error || isFinal) {//识别失败或者结束

            [self.audioEngine stop];

            [inputNode removeTapOnBus:0];

            [strongSelf.delegate identifyFinish];

            strongSelf.recognitionTask = nil;

            strongSelf.recognitionRequest = nil;

        }

  }];

  AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0];

    //在添加tap之前先移除上一个  不然有可能报"Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio',"之类的错误

    [inputNode removeTapOnBus:0];

    [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {

        __strong typeof(weakSelf) strongSelf = weakSelf;

        if (strongSelf.recognitionRequest) {

            [strongSelf.recognitionRequest appendAudioPCMBuffer:buffer];

        }

    }];

  [self.audioEngine prepare];

    [self.audioEngine startAndReturnError:&error];

    NSParameterAssert(!error);

}

【停止语音识别】

- (void)shopspeechRecognitionAction{

    if (self.audioEngine.isRunning) {

        [self.audioEngine stop];

        if (_recognitionRequest) {

            [_recognitionRequest endAudio];

        }

    }

}

/**

欢迎批评指正哦  我是一只奔跑的无敌小蚂蚱.......

*/

相关文章

网友评论

      本文标题:iOS (相册、视频、录音、语音识别)

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