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

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

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

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

        }

    }

}


/**

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

*/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容