zoukankan      html  css  js  c++  java
  • 187实现录制视频功能

    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
  • 相关阅读:
    RN-Android构建失败:Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'AwesomeProject'.
    Android更新包下载成功后不出现安装界面
    真机调试: The application could not be installed: INSTALL_FAILED_TEST_ONLY
    react native 屏幕尺寸转换
    Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
    React Native安卓真机调试
    git提交代码报错Permission denied, please try again
    The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    命令行设置快捷命令
    Linux 常用指令
  • 原文地址:https://www.cnblogs.com/huangjianwu/p/4592642.html
Copyright © 2011-2022 走看看