在这个时代很多设备都带了摄像头,但我们还是得判断运行程序的这台设备到底有没有摄像头,此外,还要判断摄像头的类型。录制视频之前,应用程序应该先检查设备是否支持基于摄像头的视频录制。
这个过程要分成两步执行。只检查设备有没有摄像头是不够的,因为第一代iPhone及iPhone 3G虽然有摄像头,但却没有录制视频的功能,只有3GS及后续的机型才可以录制视频。虽说不太可能,但苹果公司将来没准还会推出带有摄像头却只能拍摄静态照片的机型。
于是,我们必须执行两次检测:首先判断设备有没有摄像头,然后判断可以捕获的媒体类型里面有没有视频这一项。下列返回的布尔值用来表示运行程序的设备能不能拍摄视频:
- (BOOL)videoRecordingAvailable
{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
return NO;
}
NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
return [mediaTypes containsObject:(NSString *)kUTTypeMovie];
}
上述方法会查询设备所支持的媒体类型,然后在查询结果里搜寻表示视频的那种类型(kUTTypeMovie)。同一类型标识符是一种描述抽象类型的字符串,用来指代图像、影片及数据等常用的文件格式。由于这些类型定义域Mobile Core Services魔=模块之中,所以在源文件里要引入
#import <MobileCoreServices/MobileCoreServices.h>
1、创建录制视频用的选取器
用摄像头来录制视频与用它来拍摄静态照片是一样的。开发者可以指定视频的录制质量。视频质量越高,每秒所产生的数据量就越大。我们可以选择UIImagePickerControllerQualityTypeHigh(高质量)、UIImagePickerControllerQualityTypeMedium(中等质量)、UIImagePickerControllerQualutyTypeLow(低质量)或者UIImagePickerControllerQualityType640*480(VGA)。
- (void)performDismiss
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (BOOL)videoRecordingAvailable
{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
return NO;
}
NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
return [mediaTypes containsObject:(NSString *)kUTTypeMovie];
}
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
if (!error) {
self.title = @"Saved";
}else{
NSLog(@"Error saving video:%@",error.localizedFailureReason);
}
}
- (void)saveVideo:(NSURL *)mediaURL
{
BOOL compatible = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(mediaURL.path);
if (compatible) {
UISaveVideoAtPathToSavedPhotosAlbum(mediaURL.path, self, @selector(video:didFinishSavingWithError:contextInfo:), NULL);
}
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
[self performDismiss];
NSURL *mediaURL = info[UIImagePickerControllerMediaURL];
[self saveVideo:mediaURL];
}
- (void)recordVideo
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.videoQuality = UIImagePickerControllerQualityTypeHigh;
picker.mediaTypes = @[(NSString *)kUTTypeMovie];
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
}
2、保存视频
视频选取器所返回的信息字典里面含有名为UIImagePickerControllerMediaURL的键,该键所对应的媒体URL志向录制好的视频,此视频存放于应用程序的沙盒里的临时文件夹中,我们可以用UISaveVideoAtPathToSavedPhotosAlbum()函数将视频保存到媒体库。
保存视频用的函数接受四个参数:视频在媒体库中的保存路径、回调的目标、回调的选择子(这个选择子接受三个参数,与保存图片时所指定的那个回调选择子基本相同)以及可选的上下文。此函数执行完任务之后,会在目标上面调用选择子,使得开发者可以检查任务有没有执行成功。