·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 187实现录制视频功能

187实现录制视频功能

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

PS:对于 Video 选项,会调用摄像头和麦克风,需要真机才能测试。

 

UIImagePickerControllerQualityType(视频质量类型枚举):

经过真机测试,录制30秒的视频,清晰度和大小由高到低为:

UIImagePickerControllerQualityTypeIFrame1280x720 -- 135.6 MB

UIImagePickerControllerQualityTypeIFrame960x540 -- 100.1 MB

UIImagePickerControllerQualityTypeHigh -- 61.8 MB

UIImagePickerControllerQualityType640x480 -- 12.7 MB(清晰度和大小来说,更推荐这个)

UIImagePickerControllerQualityTypeMedium -- 2.8 MB(默认值)

UIImagePickerControllerQualityTypeLow -- 721.4 KB(无法直视的模糊啊)

 

PCH File 的作用:

PCH File 在 Xcode 6中默认不会添加,这里如果我们工程文件多处地方需要调用到框架头文件时,我们可以考虑通过自行添加一个 PCH File,然后在 Build Settings 中的 PRefix Header 项设置引用此文件;这样我们就不需要在需要调用它的地方通过 import 来导入框架头文件了。

PS:Prefix Header 项设置引用此文件如果不直接用「FirstBook187/PrefixHeader.pch」的话,也可以用「$(SRCROOT)/$(PROJECT_NAME)/PrefixHeader.pch」,在这里:

$(SRCROOT) 表示工程的相对路径:/Users/Kenmu/Documents/iOSDevelopment/FirstBook187

$(PROJECT_NAME)表示工程名称:FirstBook187

实际上「$(SRCROOT)/$(PROJECT_NAME)/PrefixHeader.pch」就被自动识别为:「/Users/Kenmu/Documents/iOSDevelopment/FirstBook187/FirstBook187/PrefixHeader.pch」了

 

关键操作:

 

 

 

效果如下:

ViewController.h

1 #import <UIKit/UIKit.h>
2 
3 @interface ViewController : UIViewController <UIActionSheetDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>
4 
5 @end

ViewController.m

  1 #import "ViewController.h"
  2 #import "sys/utsname.h"
  3 
  4 @interface ViewController ()
  5 - (void)layoutUI;
  6 - (void)showActionSheet:(UIBarButtonItem *)sender;
  7 - (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
  8 @end
  9 
 10 @implementation ViewController
 11 
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14     
 15     [self layoutUI];
 16 }
 17 
 18 - (void)didReceiveMemoryWarning {
 19     [super didReceiveMemoryWarning];
 20     // Dispose of any resources that can be recreated.
 21 }
 22 
 23 - (void)viewWillAppear:(BOOL)animated {
 24     [super viewWillAppear:animated];
 25     [self.navigationController setNavigationBarHidden:NO animated:animated];
 26     [self.navigationController setToolbarHidden:NO animated:animated];
 27 }
 28 
 29 - (void)layoutUI {
 30     self.navigationItem.title = @"实现录制视频功能";
 31     self.view.backgroundColor = [UIColor whiteColor];
 32     UIBarButtonItem *barBtnVideo = [[UIBarButtonItem alloc]
 33                                           initWithBarButtonSystemItem:UIBarButtonSystemItemCamera
 34                                           target:self
 35                                           action:@selector(showActionSheet:)];
 36     self.toolbarItems = @[barBtnVideo];
 37 }
 38 
 39 - (void)showActionSheet:(UIBarButtonItem *)sender {
 40     UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"录制视频"
 41                                                              delegate:self
 42                                                     cancelButtonTitle:@"取消"
 43                                                destructiveButtonTitle:nil
 44                                                     otherButtonTitles:@"PhotoLibrary", @"Video", nil];
 45     [actionSheet showFromToolbar:self.navigationController.toolbar];
 46 }
 47 
 48 - (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
 49     if (error) {
 50         NSLog(@"%@", [error localizedDescription]);
 51     }
 52 }
 53 
 54 #pragma mark - UIActionSheetDelegate
 55 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
 56     if (buttonIndex != actionSheet.cancelButtonIndex) {
 57         UIImagePickerControllerSourceType sourceType = buttonIndex;
 58         if ([UIImagePickerController isSourceTypeAvailable:sourceType]) {
 59             UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
 60             imagePickerController.delegate = self;
 61             imagePickerController.sourceType = sourceType;
 62             imagePickerController.videoQuality = UIImagePickerControllerQualityType640x480; //设置视频质量;默认值为UIImagePickerControllerQualityTypeMedium
 63             imagePickerController.videoMaximumDuration = 30; //录制视频的时间,单位为秒;默认值为10分钟=600秒,这里设置为30秒
 64             
 65             NSArray *arrMediaType = [UIImagePickerController availableMediaTypesForSourceType:sourceType];
 66             if ([arrMediaType containsObject:(NSString *)kUTTypeMovie]) { //为了使用kUTTypeMovie,这里需要导入<MobileCoreServices/MobileCoreServices.h>
 67                 imagePickerController.mediaTypes = @[(NSString *)kUTTypeMovie];
 68             } else {
 69                 NSLog(@"%@ is not available.", kUTTypeMovie);
 70             }
 71             
 72             [self presentViewController:imagePickerController
 73                                animated:YES
 74                              completion:nil];
 75         }
 76     }
 77     
 78     /*
 79      UIImagePickerControllerQualityType(视频质量类型枚举):经过真机测试,录制30秒的视频,清晰度和大小由高到低为:
 80      UIImagePickerControllerQualityTypeIFrame1280x720 -- 135.6 MB
 81      UIImagePickerControllerQualityTypeIFrame960x540 -- 100.1 MB
 82      UIImagePickerControllerQualityTypeHigh -- 61.8 MB
 83      UIImagePickerControllerQualityType640x480 -- 12.7 MB(清晰度和大小来说,更推荐这个)
 84      UIImagePickerControllerQualityTypeMedium -- 2.8 MB(默认值)
 85      UIImagePickerControllerQualityTypeLow -- 721.4 KB(无法直视的模糊啊)
 86      
 87      
 88      typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) {
 89      UIImagePickerControllerQualityTypeHigh = 0,       // highest quality
 90      UIImagePickerControllerQualityTypeMedium = 1,     // medium quality, suitable for transmission via Wi-Fi
 91      UIImagePickerControllerQualityTypeLow = 2,         // lowest quality, suitable for tranmission via cellular network
 92      #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
 93      UIImagePickerControllerQualityType640x480 = 3,    // VGA quality
 94      #endif
 95      #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
 96      UIImagePickerControllerQualityTypeIFrame1280x720 = 4,
 97      UIImagePickerControllerQualityTypeIFrame960x540 = 5
 98      #endif
 99      };
100      */
101 }
102 
103 #pragma mark - UIImagePickerControllerDelegate
104 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
105     //判断是否是视频
106     NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
107     if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
108         NSURL *mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
109         NSString *mediaPath = [mediaURL path];
110         //判断视频路径是否支持被保存到图片库中
111         if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(mediaPath)) {
112             //将视频保存到相册
113             UISaveVideoAtPathToSavedPhotosAlbum(mediaPath,
114                                                 self,
115                                                 @selector(video:didFinishSavingWithError:contextInfo:),
116                                                 NULL);
117         } else {
118             NSLog(@"视频路径不支持被保存到图片库中");
119         }
120     }
121     
122     
123     //把图片保存到相册
124     //    UIImageWriteToSavedPhotosAlbum(imgChoice,
125     //                                   self,
126     //                                   @selector(image:didFinishSavingWithError:contextInfo:),
127     //                                   NULL);
128     
129     [self imagePickerControllerDidCancel:picker];
130 }
131 
132 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
133     [self dismissViewControllerAnimated:YES completion:nil];
134 }
135 
136 @end

AppDelegate.h

1 #import <UIKit/UIKit.h>
2 
3 @interface AppDelegate : UIResponder <UIapplicationDelegate>
4 @property (strong, nonatomic) UIWindow *window;
5 @property (strong, nonatomic) UINavigationController *navigationController;
6 
7 @end

AppDelegate.m

 1 #import "AppDelegate.h"
 2 #import "ViewController.h"
 3 
 4 @interface AppDelegate ()
 5 @end
 6 
 7 @implementation AppDelegate
 8 
 9 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
10     _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
11     ViewController *viewController = [[ViewController alloc] init];
12     _navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
13     _window.rootViewController = _navigationController;
14     //[_window addSubview:_navigationController.view]; //当_window.rootViewController关联时,这一句可有可无
15     [_window makeKeyAndVisible];
16     return YES;
17 }
18 
19 - (void)applicationWillResignActive:(UIApplication *)application {
20 }
21 
22 - (void)applicationDidEnterBackground:(UIApplication *)application {
23 }
24 
25 - (void)applicationWillEnterForeground:(UIApplication *)application {
26 }
27 
28 - (void)applicationDidBecomeActive:(UIApplication *)application {
29 }
30 
31 - (void)applicationWillTerminate:(UIApplication *)application {
32 }
33 
34 @end

PrefixHeader.pch

1 #ifndef FirstBook187_PrefixHeader_pch
2 #define FirstBook187_PrefixHeader_pch
3 
4 // Include any system framework and library headers here that should be included in all compilation units.
5 // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
6 #import <MobileCoreServices/MobileCoreServices.h>
7 
8 #endif