iOS中想播放视频,那么就要用到AVFoundation库,在头文件导入#import <AVFoundation/AVFoundation.h>


下面介绍一下三个要使用到的类:

//播放器
@property(nonatomic,strong) AVPlayer *myPlayer;
//播放单元(多媒体资源)
@property(nonatomic,strong) AVPlayerItem *item;
//播放界面
@property(nonatomic,strong) AVPlayerLayer *playerLayer;

我们可以看到有视频播放,其实是因为AVPlayerLayer加入到父视图的layer中,才看得到的视频播放。

通过以下代码,可以实现一个简单的视频播放:

    //播放网站NSURL *mediaURL = [NSURL URLWithString:@"http://baobab.wdjcdn.com/1455782903700jy.mp4"];//初始化一个播放单元self.item = [AVPlayerItem playerItemWithURL:mediaURL];//初始化一个对象播放器self.myPlayer = [AVPlayer playerWithPlayerItem:self.item];//初始化一个播放器的Layerself.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];self.playerLayer.frame = CGRectMake(0, 0, ScreenW, 300);[self.view.layer addSublayer:self.playerLayer];//开始播放视频[self.myPlayer play];

想获取播放的总时长,并且实时用Lable显示播放时间,用UISlider显示播放进度,请看如下代码:

获取播放总时长:

self.mySlider.maximumValue = self.item.duration.value / self.item.duration.timescale;

播放进度CMTime类型一般是用来表示视频或者动画的时间类型,CMTime对象的Value属性是用来得到当前视频或者动画一共有多少帧,timescale是指每秒多少帧。视频总时长 = value / timescale(秒)

滑动UISlider时候,改变播放进度:

    //value值为视频的时间float seconds = self.mySlider.value;//让视频从指定的CMTime对象处播放CMTime startTime = CMTimeMakeWithSeconds(seconds, self.item.currentTime.timescale);//让视屏从指定处播放[self.myPlayer seekToTime:startTime completionHandler:^(BOOL finished) {[self startToPlay];}];

实时更新UISider进度:

    self.mySlider.value = self.item.currentTime.value / self.item.currentTime.timescale;self.leftLb.text = [self changeSecondsTime:self.mySlider.value];

将总时长转化成固定时间格式的方法:

//将秒数转化成00:00的格式,用于显示
-(NSString *)changeSecondsTime:(NSInteger)time
{NSInteger min = time / 60;NSInteger seconds = time % 60;return [NSString stringWithFormat:@"%02ld:%02ld",(long)min,(long)seconds];
}

很多视频播放中,都会用到KVO来处理视频播放,例如视频是否加载好了,视频的缓存处理等等。这里只演示视频是否加载好。

贴上完整代码:

//
//  ViewController.m
//  AVPlayer
//
//  Created by HZhenF on 2017/6/2.
//  Copyright © 2017年 Huangzhengfeng. All rights reserved.
//#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>#define ScreenW [UIScreen mainScreen].bounds.size.width
#define ScreenH [UIScreen mainScreen].bounds.size.height@interface ViewController ()//播放器
@property(nonatomic,strong) AVPlayer *myPlayer;
//播放单元(多媒体资源)
@property(nonatomic,strong) AVPlayerItem *item;
//播放界面
@property(nonatomic,strong) AVPlayerLayer *playerLayer;
//实现视频的播放进度
@property(nonatomic,strong) UISlider *mySlider;
//用来判断当前视频是否准备好播放
@property(nonatomic,assign) BOOL isReadToPlay;@property(nonatomic,strong) NSTimer *timer;@property(nonatomic,strong) UILabel *leftLb;@property(nonatomic,strong) UILabel *rightLb;@end@implementation ViewController-(UILabel *)rightLb
{if (!_rightLb) {_rightLb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ScreenW*0.1, 30)];_rightLb.center = CGPointMake(ScreenW*0.95, self.mySlider.center.y);_rightLb.textColor = [UIColor grayColor];_rightLb.font = [UIFont systemFontOfSize:12.0];_rightLb.text = @"00:00";_rightLb.textAlignment = NSTextAlignmentCenter;}return _rightLb;
}-(UILabel *)leftLb
{if (!_leftLb) {_leftLb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ScreenW*0.1, 30)];_leftLb.center = CGPointMake(ScreenW*0.05, self.mySlider.center.y);_leftLb.textColor = [UIColor grayColor];_leftLb.font = [UIFont systemFontOfSize:12.0];_leftLb.text = @"00:00";_leftLb.textAlignment = NSTextAlignmentCenter;}return _leftLb;
}-(NSTimer *)timer
{if (!_timer) {_timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES];[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];}return _timer;
}-(UISlider *)mySlider
{if (!_mySlider) {_mySlider = [[UISlider alloc] initWithFrame:CGRectMake(ScreenW*0.1, CGRectGetMaxY(self.playerLayer.frame) - 30, ScreenW*0.8, 30)];_mySlider.minimumTrackTintColor = [UIColor orangeColor];_mySlider.maximumTrackTintColor = [UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:1];[_mySlider addTarget:self action:@selector(mySliderAction) forControlEvents:UIControlEventValueChanged];}return _mySlider;
}- (void)viewDidLoad {[super viewDidLoad];//初始化视频[self setupAVPlayer];[self.view addSubview:self.mySlider];[self addControls];[self.view addSubview:self.leftLb];[self.view addSubview:self.rightLb];
}-(void)addControls
{UIButton*button = [UIButton buttonWithType:UIButtonTypeCustom];button.frame=CGRectMake(250,600,100,100);button.backgroundColor= [UIColor redColor];[button setTitle:@"播放" forState:UIControlStateNormal];[button addTarget:self action:@selector(playAction:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:button];
}//实时更新UISlider和时间
-(void)updateSlider
{self.mySlider.value = self.item.currentTime.value / self.item.currentTime.timescale;self.leftLb.text = [self changeSecondsTime:self.mySlider.value];
}//将秒数转化成00:00的格式,用于显示
-(NSString *)changeSecondsTime:(NSInteger)time
{NSInteger min = time / 60;NSInteger seconds = time % 60;return [NSString stringWithFormat:@"%02ld:%02ld",(long)min,(long)seconds];
}//滑动UISlider,改变播放进度
-(void)mySliderAction
{//value值为视频的时间float seconds = self.mySlider.value;//让视频从指定的CMTime对象处播放CMTime startTime = CMTimeMakeWithSeconds(seconds, self.item.currentTime.timescale);//让视屏从指定处播放[self.myPlayer seekToTime:startTime completionHandler:^(BOOL finished) {[self startToPlay];}];
}//点击播放按钮
-(void)playAction:(UIButton *)sender
{if (sender.isSelected) {sender.selected = !sender.selected;[sender setTitle:@"播放" forState:UIControlStateNormal];[self.timer invalidate];self.timer = nil;self.isReadToPlay = 0;[self startToPlay];}else{sender.selected = !sender.selected;[sender setTitle:@"暂停" forState:UIControlStateSelected];self.isReadToPlay = 1;//开始播放[self startToPlay];[self timer];}}-(void)startToPlay
{if (self.isReadToPlay) {//开始播放视频[self.myPlayer play];}else{//暂停播放视频[self.myPlayer pause];}
}-(void)setupAVPlayer
{//播放网站NSURL *mediaURL = [NSURL URLWithString:@"http://baobab.wdjcdn.com/1455782903700jy.mp4"];//初始化一个播放单元self.item = [AVPlayerItem playerItemWithURL:mediaURL];//初始化一个对象播放器self.myPlayer = [AVPlayer playerWithPlayerItem:self.item];//初始化一个播放器的Layerself.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];self.playerLayer.frame = CGRectMake(0, 0, ScreenW, 300);[self.view.layer addSublayer:self.playerLayer];//通过KVO来观察status属性的变化,来获取播放之前的错误信息[self.item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
}//KVO的回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{/*播放进度CMTime类型一般是用来表示视频或者动画的时间类型,CMTime对象的Value属性是用来得到当前视频或者动画一共有多少帧,timescale是指每秒多少帧。视频总时长 = value / timescale(秒)*///取出status的新值AVPlayerStatus status = [change[NSKeyValueChangeNewKey] intValue];switch (status) {case AVPlayerStatusFailed:NSLog(@"item有误");self.isReadToPlay = NO;break;case AVPlayerStatusReadyToPlay:NSLog(@"准备好播放了");self.isReadToPlay = YES;self.mySlider.maximumValue = self.item.duration.value / self.item.duration.timescale;self.rightLb.text = [self changeSecondsTime:self.mySlider.maximumValue];break;case AVPlayerItemStatusUnknown:NSLog(@"视频资源出现位置错误");self.isReadToPlay = NO;break;default:break;}//移除监听[object removeObserver:self forKeyPath:@"status"];
}@end

iOS-AVPlayer的简单使用相关推荐

  1. iOS编写最简单的界面切换应用

    以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建一个window-based applicat ...

  2. iOS AVPlayer视频播放器

    代码地址如下: http://www.demodashi.com/demo/11168.html 一.运行效果 二.实现过程 ①.创建播放器avPlayer //创建播放器url = [url str ...

  3. 1、OPenGL ES - 简介、iOS中GLKit简单应用

    OPenGL ES -  简介.iOS中GLKit简单应用 一.OPenGL ES 1.简介: OpenGL ES 是以手持和嵌入式为目标的高级的3D图形应用程序编程接口(API),OpenGL ES ...

  4. iOS AVPlayer 简单应用

    //1 AVPlayerViewController *avvc = [[AVPlayerViewController alloc] init]; //2 avvc.player = [[AVPlay ...

  5. android ios av tv,iOS AVPlayer 实现后台连续播放视频

    最近接到一个需求,需要做一个在后台播放视频的功能.折腾了一下,最后总算完成了.因此写一篇文章,介绍下具体的实现步骤,也说说自己遇到的坑,算是总结和记录. 前言 当 App 退到后台时,会进入 susp ...

  6. iOS AVPlayer的使用

    AVPlayer 在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要导入MediaPlayer.Framework),还有一种是使用AVPlayer ...

  7. IOS AVPlayer无法播放H265编码格式的MP4视频

    具体现象 使用 IOS 的 AVPlayer 播放 H265编码格式的mp4视频时,只有声音无图像. 原因 H265即 HEVC,在打包成mp4时需要有 codec tag.hev1 or hvc1是 ...

  8. iOS开发:简单的Toast提示框实现

    今天小年,再分享一篇2018年度最后一篇博客,博主是以iOS开发出身,那就最后一篇博文就分享一下关于iOS的内容吧.iOS开发过程中,有些时候操作App的时候,需要给用户对应的响应提示操作,使用系统自 ...

  9. iOS - AVPlayer播放视频,获取视频尺寸(宽高)

    公司启动页要求播放视频,其实很简单,AVPlayer可以胜任此任务. - (void)playVideoWithType:(NSString *)type {//获取视频sizeNSURL *medi ...

  10. iOS AVPlayer 与 AVPlayerViewController

    iOS 媒体功能主要的类 AVPlayer 全功能影音播放器 AVPlayerLayer 主要用于显示视频 AVPlayerViewController 提供了默认的可视化控制界面 一. AVPlay ...

最新文章

  1. 图解VMWARE内存机制
  2. 关于STM32与SD卡通信的一些思考与总结
  3. 使用Ansible批量部署SSH免密登录远程主机
  4. 静态服务器显示固定页面,【Python高级编程034 ● 静态web服务器 ● 静态Web服务器-返回固定页面数据】...
  5. java服务限流_Java实现系统限流
  6. Codeforce 1255 Round #601 (Div. 2) C. League of Leesins (大模拟)
  7. 数据挖掘算法(logistic回归,随机森林,GBDT和xgboost)-腾讯云社区
  8. 项目经理到底要不要懂技术?
  9. 20181031-1
  10. Git不断询问我ssh密钥密码
  11. 视频剪辑软件Movie Studio安装教程
  12. 【搜狗拼音输入法 3.2 论坛版】
  13. NuGet无法下载的问题
  14. js select 联动
  15. mysql innodb 分区_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
  16. 参与全国软考调查问卷,赢精彩大奖
  17. [Android]安卓简易计算器 (使用GridLayout)
  18. 微信小程序————样式
  19. VUE中V-IF条件判断改变元素的样式
  20. Bos物流项目之在线下单流程图

热门文章

  1. ReactNative使用精美图标库react-native-vector-icons(具体使用方法)
  2. 史上最全 | 计算机视觉2D/3D标注工具汇总!
  3. R语言-因子分析中因子综合得分求解
  4. 基于模拟退火的粒子群优化算法(Matlab实现)
  5. python脚本合并多个pdf文件
  6. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java攀枝花学院学生宿舍管理系统491bh
  7. 软件测试性能测试安全测试
  8. DuiLib入门简明教程
  9. EAN-13 编码原理
  10. CityEngine2019 学习笔记 (1)一 基本操作