6.4 视频->3.0 视频功能

作者: 蓝田_Loto | 来源:发表于2016-11-11 15:22 被阅读144次

本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


本文相关目录:
================== 所属文集:6.0 图形和多媒体 ==================
6.1 Quartz 2D->1.1 Quartz 2D 简介
6.2 核心动画->1.0 CALayer的简介
··················· 1.1 CALayer的基本属性
··················· 1.2 CALayer的创建 & 非根layer的隐式动画
··················· 2.0 Core Animation(核心动画)
··················· 3.0 核心动画 & UIView动画
··················· 4.0 常用动画效果
6.3 音频->1.0 录音 未发布
············· 2.0 音效/音乐 未发布
············· iOS项目Demo - 仿·QQ音乐播放器 未发布
6.4 视频->1.0 视频播放方案
············· 2.0 视频特效:画中画
············· 3.0 视频功能
············· iOS项目Demo - 仿·慕课网视频播放器 未发布
6.5 直播 未发布
6.5 直播-> iOS项目Demo - 仿·斗鱼直播 未发布
================== 所属文集:6.0 图形和多媒体 ==================


视频目录

本文目录


功能1:视频截图

代码7:视频截图 demo

编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0

【OC语言】
// 为了简化代码,只做截图功能,不附加播放器功能

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

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

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark - 视频截图
- (IBAction)star:(UIButton *)sender {
    
    // ① 本地媒体文件
    NSString *path = [[NSBundle mainBundle]pathForResource:@"1.mp4" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
    // 创建AVAsset对象,指定素材
    AVAsset *asset = [AVAsset assetWithURL:url];
    
    // ② 通过远程URL, 创建控制器 MPMoviePlayerViewController
    // NSURL *remoteURL = [NSURL URLWithString:@"http://v1.mukewang.com/3e35cbb0-c8e5-4827-9614-b5a355259010/L.mp4"];
    // AVAsset *asset = [AVAsset assetWithURL:remoteURL];
    
    // 1.创建截图对象
    AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    
    // 2.开始截图(参数1:Times表示要截取的视频的时间,必须是对象,如果用在播放器中,则此处应是当前视频播放的时间)
    [gen generateCGImagesAsynchronouslyForTimes:@[@(20.0)]
                              completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
                                  
                                  // 把截图显示在imageView上的操作放在主线程(更新UI)
                                  dispatch_sync(dispatch_get_main_queue(), ^{
                                      // 类型转换
                                      self.imageView.image = [UIImage imageWithCGImage:image];
                                  });
                                  
                              }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
【Swift 语言】(暂无,以后补上)


功能2:视频压缩导出

备注:
1、真机运行后,如何找到压缩的视频?
首先,打开 Xcode -> Window -> Devices 后如下图中的方法操作


2、iOS 10以后相册权限配置
Key:Privacy - Photo Library Usage Description
Value:photoLibraryDesciption

代码8:视频压缩导出 demo

编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0

【OC语言】
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

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

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

// 1.获取手机上的视频
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    // 1.1 获取手机相册
    UIImagePickerController *vc = [[UIImagePickerController alloc]init];
    
    // 设置来源
    vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    // 设置类型
    vc.mediaTypes = [UIImagePickerController  availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    
    // 1.2 设置代理
    vc.delegate = self;
    
    // 1.3 展示界面
    [self presentViewController:vc animated:YES completion:nil];
}

// 1.4 实现 UIImagePickerControllerDelegate 代理方法
// 获取所点击的图片or视频 (实现代理方法之后,界面不会退出)
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    
    [self dismissViewControllerAnimated:YES completion:nil];
    
    NSLog(@"%@",info);
    
    // 2.进行导出 压缩
    
    // 2.1 创建导出对象(通过 UIImagePickerControllerMediaURL 获取到点击的视频)
    NSURL *url = info[UIImagePickerControllerMediaURL];
    // 指定素材
    AVAsset *asset = [AVAsset assetWithURL:url];
    // 设置导出的类型
    AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:asset
                                                                    presetName:AVAssetExportPresetLowQuality];
    
    
    // 2.2 设置导出存放的地方
    // 获取沙盒路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    // 设置保存的视频的路径(包括视频名)
    path = [path stringByAppendingPathComponent:@"123.mp4"];
    // 设置导出位置
    session.outputURL = [NSURL fileURLWithPath:path];
    
    // 设置导出的视频类型
    session.outputFileType = AVFileTypeQuickTimeMovie;
    
    //2.3 导出,开始压缩
    [session exportAsynchronouslyWithCompletionHandler:^{
        NSLog(@"导出完成");
    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
【Swift 语言】(暂无,以后补上)

功能3:视频录制

备注:
1、真机运行后,如何找到录制的视频?
首先,打开 Xcode -> Window -> Devices 后,方法操作和视频压缩类似

2、iOS 10以后麦克风权限配置
Key:Privacy - Microphone Usage Description
Value:microphoneDesciption

3、iOS 10以后摄像头权限配置
Key:Privacy - Camera Usage Description
Value:cameraDesciption

代码9:视频录制 demo

编译环境:Xcode 8.0
模拟器版本:iOS 10
Swift版本:3.0

【OC语言】

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()<AVCaptureFileOutputRecordingDelegate>
@property (nonatomic,strong)AVCaptureMovieFileOutput *output;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark - 开始录制视频
- (IBAction)start:(UIButton *)sender {
    // 1.创建输入对象
    // 获取麦克风
    AVCaptureDevice *audioDevice = [AVCaptureDevice  defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput *audioInput = [[AVCaptureDeviceInput alloc]initWithDevice:audioDevice error:nil];
    
    // 获取摄像头
    AVCaptureDevice *videoDevice = [AVCaptureDevice  defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc]initWithDevice:videoDevice error:nil];
    
    // 2.创建输出对象
    AVCaptureMovieFileOutput *output = [[AVCaptureMovieFileOutput alloc]init];
    self.output = output;
    
    // 3.创建会话连接输入和输出
    AVCaptureSession *session = [[AVCaptureSession alloc]init];
    
    // 判断是否可以添加到会话
    if ([session canAddInput:videoInput]) {
        [session addInput:videoInput];
    }
    
    if ([session canAddInput:audioInput]) {
        [session addInput:audioInput];
    }
    
    if ([session canAddOutput:output]) {
        [session addOutput:output];
    }
    
    // 4.添加到图层
    AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
    layer.frame = CGRectMake(15,30,300, [UIScreen mainScreen].bounds.size.height-80);
    [self.view.layer addSublayer:layer];
    
    // 5.开始会话
    [session startRunning];
    
    // 6.设置视频的存放位置
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    path = [path stringByAppendingPathComponent:@"123.mp4"];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    // 7.开始录制
    [output startRecordingToOutputFileURL:url recordingDelegate:self];
}

#pragma mark - 停止录制视频
- (IBAction)stop:(UIButton *)sender {
    [self.output stopRecording];
}

#pragma mark - 代理方法:开始录制视频
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections{
    
    NSLog(@"开始录制视频");
}

#pragma mark - 代理方法:停止录制视频
-(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error{
    
    NSLog(@"停止录制视频");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

本文源码 Demo 详见 Github(方便的话,帮忙点个Star,谢啦!)
https://github.com/shorfng/iOS_6.0_Graphics_and_multimedia.git


作者:蓝田(Loto)
【作品发布平台】

简书
博客园
Gitbook(如果觉得文章太长,请阅读此平台发布的文章)

【代码托管平台】

Github

【如有疑问,请通过以下方式交流】

评论区回复
发送邮件shorfng@126.com


本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,谢谢合作。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
  • 支付宝扫一扫 向我打赏


  • 你也可以微信 向我打赏


相关文章

网友评论

  • LeeCen:期待你的“iOS项目Demo - 仿·慕课网视频播放器 ”发布 :blush:
    蓝田_Loto:@Lee_Cen 好的👌🏻

本文标题:6.4 视频->3.0 视频功能

本文链接:https://www.haomeiwen.com/subject/pnlxpttx.html