视频播放
2016-03-27 15:49
309 查看
视频播放,不用多说大家都能知道是什么怎样操作,现在手机软件中有很多视频播放的软件,今天我们来学习一下用代码怎样实现视频播放。
一、介绍一下iOS9.0之后的改变
iOS9.0之后弃用MPMoviePlayerViewController这个类以及需要导入框架MediaPlayer
iOS9.0使用的AVPlayerViewController,需要导入的框架是AVFoundation
二、介绍使用到的类
AVPlayer:播放音视频
AVPlayerItem:音视频的对象
AVPLayerLayer:播放显示视频的图层界面
AVPlayerViewController:视图控制器,可以显示视频并且有调节控件
三、具体的使用
使用
1、AVPlayer:直接播放
(1)创建AVPlayerItem视频内容相关
(2)创建AVPlayer
(3)创建AVPlayerLayer添加到父视图视频操作相关
(4)播放
创建AVPlayerItem的方法
1、playerItemWithURL:类方法通过URL地址创建要播放的对象(可以是本地也可是在线)
2、initWithURL:构造方法
3、playerItemWithAsset:通过设备相册里面的内容创建一个要播放的对象
4、playerItemWithAsset:automaticallyLoadedAssetKeys自动根据要求的Key去加载相册里面的内容
5、initWithAsset:automaticallyLoadedAssetKeys:
创建AVPlayer的方法
1、playerWithURL:URL
2、initWithURL:URL
3、playerWithPlayerItem:item
4、initWithPlayerItem:item
创建AVPlayerLayer的方法
(1)根据播放器去创建一个可以显示的图层playerLayerWithPlayer:类方法
(2)设置位置frame
(3)将显示的图层添加到父图层
(4)播放器*****play开始播放
(5)获得播放状态
AVPlayerItem:音视频播放的对象
duration:总时长
status:记载状态
AVPlayerItemStatusUnknown,未知状态
AVPlayerItemStatusReadyToPlay,准备播放
AVPlayerItemStatusFailed失败
其他属性
seekToTime跳转到某一个进度
CMTime:结构体两个参数 value timeScale(帧率)
AVPlayer播放音视频
play:播放
pause:暂停
seekToTime:跳转进度
currentItem:当前播放的视频元素
volum:调节音量
externaPlaybackVideoGravity
视频显示的样式:
AVLayerVideoGravityResizeAspect:普通的
AVLayerVideoGravityResizeAspectFill:充满的
currentTime:获得当前播放的时间 CMTime类型
通过CMTime获得当前时间秒CMTimeGetSeconds(
CMTime time)
具体代码
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interfaceViewController ()
{
AVPlayer *player;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100,100,100);
[button setTitle:@"TICK"forState:UIControlStateNormal];
button.backgroundColor = [UIColorblueColor];
[button addTarget:selfaction:@selector(doit)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
- (void)doit{
/*
视频播放需要三个东西:AVPlayer、AVPlayerItem、AVPlayerLayer
AVPlayer:是一个视频播放器,去播放视频
AVPlayerItem:视频播放的元素
AVPlayerLayer:展示播放的视图
*/
// 1、创建播放的元素
NSURL *URL = [[NSBundlemainBundle]URLForResource:@"IMG_9638.m4v"withExtension:nil];
AVPlayerItem *item = [AVPlayerItemplayerItemWithURL:URL];
// 2、创建播放器
player = [AVPlayerplayerWithPlayerItem:item];
// 3、创建视频播放的图层
AVPlayerLayer *layer = [AVPlayerLayerplayerLayerWithPlayer:player];
layer.frame =self.view.frame;
// 4、添加到父视图上
[self.view.layeraddSublayer:layer];
// 5、开始播放
[playerplay];
// 获得播放结束的状态,通过发送通知的形式获得播放结束的状态->AVPlayerItemDidPlayToEndTimeNotification
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(itemDidPlayToEndTime:)name:AVPlayerItemDidPlayToEndTimeNotificationobject:nil];
// NSLog(@"获得视频总时长%f",CMTimeGetSeconds(player.currentItem.duration));
// player.currentItem.status =只要可以获得到当前视频元素准备好的状态,就可以得到总时长
// 采取KVO的形式获得总时长
// 通过监视status判断是否准备好
-->获得
[item addObserver:selfforKeyPath:@"status"options:NSKeyValueObservingOptionNewcontext:nil];
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches
withEvent:(UIEvent *)event{
// 获得当前播放的时间
Float64 cur =CMTimeGetSeconds(player.currentTime);
cur += 1;
[playerseekToTime:CMTimeMake(cur,1)];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change context:(void
*)context{
// NSLog(@"status:%@",change[@"new"]);
switch ([change[@"new"]integerValue])
{
case0:
{
NSLog(@"未知状态");
}
break;
case1:
{
NSLog(@"获得视频的总时长%f",CMTimeGetSeconds(player.currentItem.duration));
}
break;
case2:
{
NSLog(@"加载失败");
}
break;
default:
break;
}
}
- (void)itemDidPlayToEndTime:(NSNotification *)not{
NSLog(@"播放结束");
// CMTime表示视频播放的进度
// value(具体的进度) timescale(帧率)
// CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)
// kCMTimeZero:表示初始进度
// seekToTime:跳转到某一个进度
[playerseekToTime:kCMTimeZero];
}
快速创建视频播放器的方法,自带播放按钮
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interfaceViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100,
100,100);
[button setTitle:@"TICK"forState:UIControlStateNormal];
button.backgroundColor = [UIColorbrownColor];
[button addTarget:selfaction:@selector(playMovie)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
- (void)playMovie{
// 1、AVPLayer
AVPlayer *player = [AVPlayerplayerWithURL:[[NSBundlemainBundle]
URLForResource:@"IMG_9638.m4v"withExtension:nil]];
//
创建视频播放视图的控制器
AVPlayerViewController *playerVC = [[AVPlayerViewControlleralloc]
init];
playerVC.player = player;
playerVC.showsPlaybackControls =NO;
playerVC.view.frame =CGRectMake(100,100,
100,100);
[self.viewaddSubview:playerVC.view];
// [self presentViewController:playerVC animated:YES completion:nil];
[playerVC.playerplay];
}
一、介绍一下iOS9.0之后的改变
iOS9.0之后弃用MPMoviePlayerViewController这个类以及需要导入框架MediaPlayer
iOS9.0使用的AVPlayerViewController,需要导入的框架是AVFoundation
二、介绍使用到的类
AVPlayer:播放音视频
AVPlayerItem:音视频的对象
AVPLayerLayer:播放显示视频的图层界面
AVPlayerViewController:视图控制器,可以显示视频并且有调节控件
三、具体的使用
使用
1、AVPlayer:直接播放
(1)创建AVPlayerItem视频内容相关
(2)创建AVPlayer
(3)创建AVPlayerLayer添加到父视图视频操作相关
(4)播放
创建AVPlayerItem的方法
1、playerItemWithURL:类方法通过URL地址创建要播放的对象(可以是本地也可是在线)
2、initWithURL:构造方法
3、playerItemWithAsset:通过设备相册里面的内容创建一个要播放的对象
4、playerItemWithAsset:automaticallyLoadedAssetKeys自动根据要求的Key去加载相册里面的内容
5、initWithAsset:automaticallyLoadedAssetKeys:
创建AVPlayer的方法
1、playerWithURL:URL
2、initWithURL:URL
3、playerWithPlayerItem:item
4、initWithPlayerItem:item
创建AVPlayerLayer的方法
(1)根据播放器去创建一个可以显示的图层playerLayerWithPlayer:类方法
(2)设置位置frame
(3)将显示的图层添加到父图层
(4)播放器*****play开始播放
(5)获得播放状态
AVPlayerItem:音视频播放的对象
duration:总时长
status:记载状态
AVPlayerItemStatusUnknown,未知状态
AVPlayerItemStatusReadyToPlay,准备播放
AVPlayerItemStatusFailed失败
其他属性
seekToTime跳转到某一个进度
CMTime:结构体两个参数 value timeScale(帧率)
AVPlayer播放音视频
play:播放
pause:暂停
seekToTime:跳转进度
currentItem:当前播放的视频元素
volum:调节音量
externaPlaybackVideoGravity
视频显示的样式:
AVLayerVideoGravityResizeAspect:普通的
AVLayerVideoGravityResizeAspectFill:充满的
currentTime:获得当前播放的时间 CMTime类型
通过CMTime获得当前时间秒CMTimeGetSeconds(
CMTime time)
具体代码
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interfaceViewController ()
{
AVPlayer *player;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100,100,100);
[button setTitle:@"TICK"forState:UIControlStateNormal];
button.backgroundColor = [UIColorblueColor];
[button addTarget:selfaction:@selector(doit)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
- (void)doit{
/*
视频播放需要三个东西:AVPlayer、AVPlayerItem、AVPlayerLayer
AVPlayer:是一个视频播放器,去播放视频
AVPlayerItem:视频播放的元素
AVPlayerLayer:展示播放的视图
*/
// 1、创建播放的元素
NSURL *URL = [[NSBundlemainBundle]URLForResource:@"IMG_9638.m4v"withExtension:nil];
AVPlayerItem *item = [AVPlayerItemplayerItemWithURL:URL];
// 2、创建播放器
player = [AVPlayerplayerWithPlayerItem:item];
// 3、创建视频播放的图层
AVPlayerLayer *layer = [AVPlayerLayerplayerLayerWithPlayer:player];
layer.frame =self.view.frame;
// 4、添加到父视图上
[self.view.layeraddSublayer:layer];
// 5、开始播放
[playerplay];
// 获得播放结束的状态,通过发送通知的形式获得播放结束的状态->AVPlayerItemDidPlayToEndTimeNotification
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(itemDidPlayToEndTime:)name:AVPlayerItemDidPlayToEndTimeNotificationobject:nil];
// NSLog(@"获得视频总时长%f",CMTimeGetSeconds(player.currentItem.duration));
// player.currentItem.status =只要可以获得到当前视频元素准备好的状态,就可以得到总时长
// 采取KVO的形式获得总时长
// 通过监视status判断是否准备好
-->获得
[item addObserver:selfforKeyPath:@"status"options:NSKeyValueObservingOptionNewcontext:nil];
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches
withEvent:(UIEvent *)event{
// 获得当前播放的时间
Float64 cur =CMTimeGetSeconds(player.currentTime);
cur += 1;
[playerseekToTime:CMTimeMake(cur,1)];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change context:(void
*)context{
// NSLog(@"status:%@",change[@"new"]);
switch ([change[@"new"]integerValue])
{
case0:
{
NSLog(@"未知状态");
}
break;
case1:
{
NSLog(@"获得视频的总时长%f",CMTimeGetSeconds(player.currentItem.duration));
}
break;
case2:
{
NSLog(@"加载失败");
}
break;
default:
break;
}
}
- (void)itemDidPlayToEndTime:(NSNotification *)not{
NSLog(@"播放结束");
// CMTime表示视频播放的进度
// value(具体的进度) timescale(帧率)
// CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)
// kCMTimeZero:表示初始进度
// seekToTime:跳转到某一个进度
[playerseekToTime:kCMTimeZero];
}
快速创建视频播放器的方法,自带播放按钮
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interfaceViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100,
100,100);
[button setTitle:@"TICK"forState:UIControlStateNormal];
button.backgroundColor = [UIColorbrownColor];
[button addTarget:selfaction:@selector(playMovie)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
- (void)playMovie{
// 1、AVPLayer
AVPlayer *player = [AVPlayerplayerWithURL:[[NSBundlemainBundle]
URLForResource:@"IMG_9638.m4v"withExtension:nil]];
//
创建视频播放视图的控制器
AVPlayerViewController *playerVC = [[AVPlayerViewControlleralloc]
init];
playerVC.player = player;
playerVC.showsPlaybackControls =NO;
playerVC.view.frame =CGRectMake(100,100,
100,100);
[self.viewaddSubview:playerVC.view];
// [self presentViewController:playerVC animated:YES completion:nil];
[playerVC.playerplay];
}
相关文章推荐
- DVI 视频接口图文解析
- C#实现语音视频录制-附demo源码
- 编写C++程序使DirectShow进行视频捕捉
- AnyChat的视频会议程序实例详解
- C#调用mmpeg进行各种视频转换的类实例
- C#获取视频某一帧的缩略图的方法
- 基于jQuery的网页影音播放器jPlayer的基本使用教程
- 显示youtube视频缩略图和Vimeo视频缩略图代码分享
- PHP使用ffmpeg给视频增加字幕显示的方法
- PHP实现将视频转成MP4并获取视频预览图的方法
- C++实现优酷土豆去视频广告的方法
- PHP简单获取视频预览图的方法
- asp.net 页面中添加普通视频的几种方式介绍
- Mac OS下为Android Studio编译FFmpeg解码库的详细教程
- Android获取SD卡上图片和视频缩略图的小例子
- php使用memcoder将视频转成mp4格式的方法
- 基于js与flash实现的网站flv视频播放插件代码
- java调用ffmpeg实现视频转换的方法
- js+HTML5基于过滤器从摄像头中捕获视频的方法
- python+ffmpeg视频并发直播压力测试