最近用到了系统自带的工具 (相册、视频、录音、语音识别)
都是一些常用的功能 ,废话不多哦 直接开始
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];
}
}
}
/**
欢迎批评指正哦 我是一只奔跑的无敌小蚂蚱.......
*/