AVPlayer的使用,带缓冲

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

{

AVPlayer *player;

AVPlayerItem *playerItem;

UIProgressView * progressView;

UISlider *_slider;

//推断slider是否按下,

BOOL isOpen;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self createUI];

//进行初始化创建

NSURL *url = [NSURL fileURLWithPath:@"/Users/qianfeng01/Downloads/千锋Swift视频教程-1.Swift语言介绍.mp4"];

playerItem  = [[AVPlayerItem alloc]initWithURL:url];

//创建player

player = [[AVPlayer alloc]initWithPlayerItem:playerItem];

//生成layer层

AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];

//设置坐标

layer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

//把layer层假如到self.view.layer中

[self.view.layer addSublayer:layer];

//进行播放

[player play];

/**以上是主要的播放界面。可是没有前进后退**/

//观察是否播放,KVO进行观察,观察playerItem.status

[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

//观察缓存如今的进度,KVO进行观察,观察loadedTimeRanges

[playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

}

//观察是否播放

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

if ([keyPath isEqualToString:@"status"]) {

if (playerItem.status == AVPlayerStatusReadyToPlay) {

NSLog(@"開始播放");

//须要開始获取数据,包含播放的总时长。播放的缓存,播放的当时时间

[self loadData];

}else{

NSLog(@"播放失败");

}

}else{

//kvo触发的另外一个属性

NSArray *array = [playerItem loadedTimeRanges];

//获取范围i

CMTimeRange range = [array.firstObject CMTimeRangeValue];

//从哪儿開始的

CGFloat start = CMTimeGetSeconds(range.start);

//缓存了多少

CGFloat duration = CMTimeGetSeconds(range.duration);

//一共缓存了多少

CGFloat allCache = start+duration;

NSLog(@"缓存了多少数据:%f",allCache);

//设置缓存的百分比

CMTime allTime = [playerItem duration];

//转换

CGFloat time = CMTimeGetSeconds(allTime);

CGFloat y = allCache/time;

NSLog(@"缓存百分比:--------%f",y);

progressView.progress = y;

}

}

#pragma mark -- 获取播放数据

- (void)loadData{

__weak AVPlayerItem *xx = playerItem;

__weak UISlider *cc = _slider;

//第一个參数是每隔多长时间调用一次。在这里设置的是每隔1秒调用一次

[player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:NULL usingBlock:^(CMTime time) {

//当前播放时间

CGFloat current = xx.currentTime.value/xx.currentTime.timescale;

//获取总时长

CMTime time1 = xx.duration;

float x = CMTimeGetSeconds(time1);

NSLog(@"当前播放的秒数------- %f --------%f",current,x);

//设置滑动条进度

float v = current/x;

//推断slider是否按下,按下去就先别赋值

if (!isOpen) {

cc.value = v;

}

}];

}

#pragma mark --- 创建UI

- (void)createUI{

progressView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];

progressView.frame = CGRectMake(0, 460, self.view.frame.size.width, 20);

[self.view addSubview:progressView];

_slider = [[UISlider alloc]initWithFrame:CGRectMake(0, 480, self.view.frame.size.width, 20)];

[self.view addSubview:_slider];

//加入点击事件

[_slider addTarget:self action:@selector(sliderClick:) forControlEvents:UIControlEventTouchUpInside];

//抬起来的事件

[_slider addTarget:self action:@selector(sliderClickUp:) forControlEvents:UIControlEventTouchUpInside];

}

//加入点击事件

- (void)sliderClick:(UISlider *)slider{

NSLog(@"加入点击事件");

isOpen = YES;

}

//抬起来的事件

- (void)sliderClickUp:(UISlider *)slider{

NSLog(@"抬起来的事件");

isOpen = NO;

//从这里開始播放

CGFloat g = slider.value;

//获取总时长

CMTime time1 = playerItem.duration;

float x = CMTimeGetSeconds(time1);

//进行播放

[player seekToTime:CMTimeMake(x * g,1)];

//播放

[player play];

}

@end

时间: 2024-08-05 12:57:07

AVPlayer的使用,带缓冲的相关文章

UNIX环境编程学习笔记(2)——不带缓冲的 I/O

lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符.当读或写一个文件时,使用 open 或 creat 返回的文件描述符标识该文件,将其作为参数传送给 read 或 write. 按照惯例,UNIX 系统 shell 使用文件描述符 0 与进程的标准输入相关联,文件描述符 1 与进程的标准输出相关联,文件描述符 2 与进程的标准出错输出相关联. 2

js+css实现带缓冲效果右键弹出菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

使用带缓冲的字节流读写数据

首先不使用带缓冲的字节流: package com.yunqing; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class bytelianxi { public static void main(String[] args) { try { //输入流"video.mp4": 相对路径:idea读取根目录下的video.mp4文

不带缓冲的IO的标准输入到标准输出

在POSIX标准中提供了函数open, read, write, lseek以及close提供不带缓冲的IO,这些函数都是使用文件描述符: 在Linux/Unix系统中将标准输入复制到标准输出简单实现如下: #include <unistd.h> #define BUFFSIZE 4096 int main(int argc, char **argv) { int n; char buf[BUFFSIZE]; while((n = read(STDIN_FILENO, buf, BUFFSIZ

带缓冲IO和不带缓冲IO

不带缓冲IO是指read(),write()等函数 标准(带缓冲)IO是指fread(),fwrite()等函数 实际上缓冲有两种,是用户空间上的缓冲(流缓冲区)和内核缓冲区.无论是不带缓冲IO还是标准IO都要通过系统调用将数据输入到内核缓冲区. 所谓的带缓冲是指带流缓冲区. 可以参考文章http://blog.sina.cn/dpool/blog/s/blog_6592a07a0101gar7.html

jQuery生成横向带缓冲的水平运动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

何为不带缓冲的I/O——read &amp; write

所有的磁盘I/O都要经过内核的块缓冲区(也称为内核的缓冲区高速缓存),唯一例外的是对原始磁盘设备的I/O. 既然read或write的数据都要被内核缓冲,那么术语"不带缓冲的I/O"指的是在用户的进程中对这两个函数不会自动缓冲,每次read或write就要进行一次系统调用.

JS+CSS打造的仿惠惠网带缓冲效果的图片滚动

<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JS+CSS打造的仿惠惠网带缓冲效果的图片滚动丨上谷战国红|亿诚</title> <style>* {margin:0;paddin

带缓冲的IO和不带缓冲的IO

文件描述符: 文件描述符是一个小的非负整数,是内核用来标识特定进程正在访问的文件 标准输入/输出/出错: shell为每个程序打开了三个文件描述符,STDIN_FILEON,STDOUT_FILEON,STDERR_FILEON,默认这三个文件描述符都链向终端 不带缓冲的IO: 函数open read write lseek close提供了不用缓冲的IO.这些函数都使用文件描述符 size_t read(int fd,void *buf,size_t count) 从fd标识的文件中一次读取c

带缓冲I/O 和不带缓冲I/O的区别与联系

首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用.系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘.因此所谓的不带缓冲的I/O是指进程不提供缓冲功能(但内核还是提供缓冲的).每调用一次write或read函数,直接系统调用. 而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fw