iOS Video(视频)

简介: 1. 带View的播放器- (IBAction)moviePlayerViewController:(id)sender { // 带View的播放器的控制器 //1.

1. 带View的播放器

- (IBAction)moviePlayerViewController:(id)sender {
    // 带View的播放器的控制器
    
    //1. 获取URL地址
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil];
    
    //2. 创建带View的播放器
    MPMoviePlayerViewController *mpVC = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
    
    //3. 模态视图弹出 --> 模态视图的切换应该在View完全展示之后进行
    [self presentViewController:mpVC animated:YES completion:nil];
}

2. 不带View的播放器

#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
#import <AVKit/AVKit.h>

@interface ViewController ()

@property (nonatomic, strong) MPMoviePlayerController *mpC;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //检测视频播放完毕 --> 可以连续播放视频
    
    //注册通知监测视频播放完毕

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackDidFinishNotification:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
    
}

#pragma mark 通知绑定的方法
- (void)moviePlayerPlaybackDidFinishNotification:(NSNotification *)notification
{
    /**
     MPMovieFinishReasonPlaybackEnded,  播放结束
     MPMovieFinishReasonPlaybackError,  播放错误
     MPMovieFinishReasonUserExited      退出播放
     */
    
    //1. 获取通知结束的状态
    NSInteger movieFinishKey = [notification.userInfo[MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue];
    
    //2. 根据状态不同来自行填写逻辑代码
    switch (movieFinishKey) {
        case MPMovieFinishReasonPlaybackEnded:
            NSLog(@"播放结束");
            
            // 进行视频切换 需要两步
            
            //1. 要想换视频, 就需要更换地址
            self.mpC.contentURL = [[NSBundle mainBundle] URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil];
            
            // 
            [self.mpC play];
            
            break;
            
        case MPMovieFinishReasonPlaybackError:
            NSLog(@"播放错误");
            break;
            
        case MPMovieFinishReasonUserExited:
            NSLog(@"退出播放");
            
            // 如果是不带view的播放器, 那么播放完毕(退出/错误/结束)都应该退出
            [self.mpC.view removeFromSuperview];
            break;
            
        default:
            break;
    }
    
}

- (void)dealloc
{
    //移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (IBAction)moviePlayerController
{
    // 不带View的播放器的控制器 --> 需要强引用, 设置frame, 添加到view上, 开始播放
    //1. 获取URL地址
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil];
    
    //2. 创建不带View的播放器
    self.mpC = [[MPMoviePlayerController alloc] initWithContentURL:url];
    
    //3. 设置view.frame
    self.mpC.view.frame = CGRectMake(0, 0, 300, 400);
    
    //4. 添加到view上
    [self.view addSubview:self.mpC.view];
    
    //5. 准备播放 --> 规范写法, 要写上. 调用play方法时, 会自动调用此方法
    [self.mpC prepareToPlay];
    
    //6. 开始播放
    [self.mpC play];
    
    //7. 控制模式
    self.mpC.controlStyle = MPMovieControlStyleFullscreen;
    
    /**
     MPMovieControlStyleNone,       // No controls
     MPMovieControlStyleEmbedded,   // 嵌入式的控制 -- 默认
     MPMovieControlStyleFullscreen, // 全屏时的控制样式
     */

}
@end

3. iOS9 播放视频

#import "ViewController.h"
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
@implementation ViewController
- (IBAction)playerViewController {
    //1. 获取URL地址
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil];
    
    //2. AV播放视图控制器
    AVPlayerViewController *pVC = [AVPlayerViewController new];
    
    //3. 创建player --> 设置时需要传入网址
    pVC.player = [AVPlayer playerWithURL:url];
    
    //4. 开始播放
    [pVC.player play];
    
    //5. 模态弹出
    //[self presentViewController:pVC animated:YES completion:nil];
    
    //5. 如果想要自定义播放器的大小,应该自定义 --> 设置frame / 添加到视图中
    pVC.view.frame = CGRectMake(40, 200, 300, 400);
    [self.view addSubview:pVC.view];
}
@end

4. 视频截图

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

@interface ViewController ()

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

@end

@implementation ViewController


#pragma mark 点击屏幕, 开始截图
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //1. URL
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil];
    
    //2. 获取资源
    AVAsset *asset = [AVAsset assetWithURL:url];
    
    //3. 创建 资源图像生成器
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    
    //4. 开始生成图像
    
    //Times : 用来表示影片的时间的值
    
    //value: 帧数
    //timescale: 当前视频的每秒的帧数
    CMTime time = CMTimeMake(60, 1);
    
    NSValue *value = [NSValue valueWithCMTime:time];
    
    [imageGenerator generateCGImagesAsynchronouslyForTimes:@[value] completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
        
        //5. 主线程中更新UI
        dispatch_sync(dispatch_get_main_queue(), ^{
            self.imageView.image = [UIImage imageWithCGImage:image];
        });
        
    }];
}

@end

6. 视频录制

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AssetsLibrary/AssetsLibrary.h>

@interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@property (nonatomic, strong) MPMoviePlayerController *mpC;

@end

@implementation ViewController

- (IBAction)movieClick:(id)sender {
    //1. 判断是否可用
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        return;
    }
    
    //2. 创建图像选择器
    UIImagePickerController *picker = [UIImagePickerController new];
    
    //3. 设置类型
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    //4. 设置媒体类型
    picker.mediaTypes = @[(NSString *)kUTTypeMovie];
    
    //5. 设置相机检测模式
    picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
    
    //6. 设置视频的质量
    picker.videoQuality = UIImagePickerControllerQualityTypeHigh;
    
    //7. 设置代理
    picker.delegate = self;
    
    //8. 模态弹出
    [self presentViewController:picker animated:YES completion:nil];
}

//UIImagePickerController 代理方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    NSLog(@"info: %@",info);
    
    //1. 获取媒体类型
    NSString *mediaTyep = info[UIImagePickerControllerMediaType];
    
    //2. 判断是否是视频的媒体类型
    
    id url = info[UIImagePickerControllerMediaURL];
    
    if ([mediaTyep isEqualToString:(NSString *)kUTTypeMovie]) {
        if (self.mpC == nil) {
            self.mpC = [MPMoviePlayerController new];
            self.mpC.view.frame = self.view.bounds;
            [self.view addSubview:self.mpC.view];
        }
        self.mpC.contentURL = url;
        [self.mpC play];
    }
    
    //3. 保存视频
    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
        
        //3.1 创建ALAssetsLibrary对象
        ALAssetsLibrary *assetsLibrary = [ALAssetsLibrary new];
        
        //3.2 调用writeVideoAtPathToSavedPhotosAlbum即可
        //前面的URL, 需要传入要保存的视频的URL.
        [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:url completionBlock:nil];
        
    }
    
    [picker dismissViewControllerAnimated:YES completion:nil];
}
@end

7. 视频压缩

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

@interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@end

@implementation ViewController


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //1. 判断是否可用
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
        return;
    }
    
    //2. 创建图像选择器
    UIImagePickerController *picker = [UIImagePickerController new];
    
    //3. 设置类型
    picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    
    //4. 设置媒体类型
    picker.mediaTypes = @[(NSString *)kUTTypeMovie];
    
    //5. 设置代理
    picker.delegate = self;
    
    //6. 模态弹出
    [self presentViewController:picker animated:YES completion:nil];
}


#pragma mark 选中视频的时候, 进行压缩处理
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    //1. 获取媒体类型
    NSString *mediaTyep = info[UIImagePickerControllerMediaType];
    
    //2. 获取视频的地址
    id url = info[UIImagePickerControllerMediaURL];
    
    //3. 开始导出--> 压缩
    [self exportWithURL:url];
}

- (void)exportWithURL:(NSURL *)url
{
    //1. 获取资源
    AVAsset *asset = [AVAsset assetWithURL:url];
    
    //2. 根据资源, 创建资源导出会话对象
    //presetName : 压缩的大小
    AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
   
    //3. 设置导出路径
    session.outputURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"12345.mov"]];
    
    //4. 设置导出类型
    session.outputFileType = AVFileTypeQuickTimeMovie;
    
    //5. 开始导出
    [session exportAsynchronouslyWithCompletionHandler:^{
        NSLog(@"当你看到这句话的时候, 恭喜你已经导出成功");
    }];
}

@end
目录
相关文章
|
图形学 Android开发 iOS开发
穿越数字洪流,揭秘Unity3d中的视频魔法!Windows、Android和iOS如何征服RTSP与RTMP的终极指南!
【8月更文挑战第15天】在数字媒体的海洋中,实时视频流是连接世界的桥梁。对于那些渴望在Unity3d中搭建这座桥梁的开发者来说,本文将揭示如何在Windows、Android和iOS平台上征服RTSP与RTMP的秘密。我们将深入探讨这两种协议的特性,以及在不同平台上实现流畅播放的技巧。无论你是追求稳定性的RTSP拥趸,还是低延迟的RTMP忠实粉丝,这里都有你需要的答案。让我们一起穿越数字洪流,探索Unity3d中视频魔法的世界吧!
322 2
|
视频直播 API iOS开发
微信团队分享:详解iOS版微信视频号直播中因帧率异常导致的功耗问题
功耗优化一直是 app 性能优化中让人头疼的问题,尤其是在直播这种用户观看时长特别久的场景。怎样能在不影响主体验的前提下,进一步优化微信iOS端视频号直播的功耗占用,本文给出了一个不太一样的答案。
320 0
|
JavaScript Android开发 iOS开发
layui框架实战案例(6):上传图片和视频自动调用IOS或安卓系统的摄像头功能
layui框架实战案例(6):上传图片和视频自动调用IOS或安卓系统的摄像头功能
704 0
|
iOS开发
iOS MachineLearning 系列(6)—— 视频中的物体轨迹分析
轨迹分析是比物体追踪更上层的一种应用。Vision框架中提供了检测视频中多个物体的运动轨迹等能力,在健身,体育类应用中非常有用。
224 0
|
算法 API vr&ar
iOS MachineLearning 系列(5)—— 视频中的物体运动追踪
本系列的前面几篇文章中,我们将静态图片分析相关的API做了详尽的介绍。在Vision框架中,还提供了视频中物体追踪的能力。 仔细想来,其实视频的分析和静态图片的分析本质上并无太大的区别,我们可以将视频拆解成图片帧,之后再对图片进行静态分析。将所有图片帧的分析结果反馈到视频上,即实现了对视频的分析能力。 视频中物体运动的跟踪常在一些AR游戏中应用,这些现实增强类的应用常常需要实时追踪显示中的物体。
252 0
|
iOS开发
iOS视频镜像处理
在网上找了很多资料和dome都没有处理镜像的,于是就自己研究了下。在官方说明文档中找到了
403 0
iOS视频镜像处理
|
Web App开发 编解码 Android开发
iOS 视频转码处理
iOS 视频转码处理
|
编解码 iOS开发
iOS拍摄视频,压缩并上传服务器
iOS拍摄视频,压缩并上传服务器
608 0
|
iOS开发
iOS Video Gravity 视频播放时的拉伸方式
iOS Video Gravity 视频播放时的拉伸方式
627 0
iOS Video Gravity 视频播放时的拉伸方式
|
缓存 编解码 API
淘票票 iOS 客户端:视频本地代理与缓存方案
提高客户端视频起播速度一直是比较关键的优化点。如何提高起播速度?除了通过优化网络、提高服务器带宽、优化视频文件码率帧率等常规方案外,还可以从哪些方面进行优化呢?一起来看看吧!
淘票票 iOS 客户端:视频本地代理与缓存方案