您的位置:首页 > 产品设计 > UI/UE

调用相机 实现:视频录制,拍照 保存 上传服务器 UIImagePickerController AVPlayer

2016-07-01 17:45 781 查看
//

//  ViewController.m

//  PickUp

//

//  Created by 刘海艳 on 16/6/29.

//  Copyright © 2016年 qust. All rights reserved.

//

#import "ViewController.h"

#import <MobileCoreServices/MobileCoreServices.h>

#import <AVFoundation/AVFoundation.h>

@interface
ViewController ()<UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>

@property (weak,
nonatomic) IBOutlet
UIImageView *imageView;

@property(nonatomic,
strong) UIImagePickerController *imagePick;

@property (assign,nonatomic)
int isVideo;//是否录制视频,如果为1表示录制视频,0代表拍照

@property (strong,nonatomic)
UIImagePickerController *imagePicker;

@property (strong ,nonatomic)
AVPlayer *player;//播放器,用于录制完视频后播放视频

@end

@implementation ViewController

- (IBAction)buttonAction:(id)sender {

    

    if ([UIImagePickerController

         isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        NSArray *availableMediaTypes = [UIImagePickerController

                                        availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

        if ([availableMediaTypes
containsObject:(NSString *)kUTTypeMovie]) {

            // 支持视频录制

            _imagePicker=[[UIImagePickerController
alloc]init];

            _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image
picker的来源,这里设置为摄像头

            _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头

            if (self.isVideo) {

                _imagePicker.mediaTypes=@[(NSString
*)kUTTypeMovie];

                _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;

                _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)

                

            }

            else{

                _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;

            }

            _imagePicker.allowsEditing=YES;//允许编辑

            _imagePicker.delegate=self;//设置代理,检测操作

            

        }

    }

    

    

    [self
presentViewController:self.imagePicker
animated:YES
completion:nil];

    

}

#pragma mark - UIImagePickerController代理方法

//完成

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary
*)info{

    NSString *mediaType=[info
objectForKey:UIImagePickerControllerMediaType];

    if ([mediaType
isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照

        UIImage *image;

       
//如果允许编辑则获得编辑后的照片,否则获取原始照片

        if (self.imagePicker.allowsEditing)
{

            image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片

        }else{

            image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片

        }

        [self.imageView
setImage:image];//显示照片

        UIImageWriteToSavedPhotosAlbum(image,
nil,
nil, nil);//保存到相簿

    }else
if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频

        NSLog(@"video...");

        NSURL *url=[info
objectForKey:UIImagePickerControllerMediaURL];//视频路径

        NSString *urlStr=[url
path];

        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {

            //保存视频到相簿,注意也可以使用ALAssetsLibrary来保存

            UISaveVideoAtPathToSavedPhotosAlbum(urlStr,
self, @selector(video:didFinishSavingWithError:contextInfo:),
nil);//保存视频到相簿

        }

        

    }

    

    [self
dismissViewControllerAnimated:YES
completion:nil];

}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{

    NSLog(@"取消");

    [self
dismissViewControllerAnimated:YES
completion:nil];

}

- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error
contextInfo:(void *)contextInfo{

    if (error) {

        NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription);

    }else{

        NSLog(@"视频保存成功.");

        //录制完之后自动播放

        NSURL *url=[NSURL
fileURLWithPath:videoPath];

        NSLog(@"%@",url);

        _player=[AVPlayer
playerWithURL:url];

        AVPlayerLayer *playerLayer=[AVPlayerLayer
playerLayerWithPlayer:_player];

        playerLayer.frame=self.imageView.frame;

        [self.imageView.layer
addSublayer:playerLayer];

        [_player
play];

        

    }

}

- (void)viewDidLoad {

    [super
viewDidLoad];

    _isVideo=YES;//拍照,反之为YES,为录制视频,顺带保存;

    

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

9.0模拟器,xcode7.3 运行实现。最近的工作中涉及到音视频的东西,就查看了资料写了一些demo,仅供参考,上传服务器近期会实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: