【iOS】AVPlayer 视频播放

news/2024/11/8 16:36:53/

视频播放器的类别

iOS开发中不可避免地会遇到音视频播放方面的需求。
常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是,AVAudioPlayer 只支持本地音频的播放,而 AVPlayer 既支持本地音频播放,也支持网络音频播放。
常用的视频播放器有 MPMoviePlayerController、AVPlayer 等。不同的是,MPMoviePlayerController 内部做了高度封装,包含了播放控件,几乎不用写几行代码就能完成一个播放器,但是正是由于它的高度封装使得要自定义这个播放器变得很复杂,甚至是不可能完成。而 AVPlayer 更加接近于底层,所以灵活性也更强,更加方便自定义。
今天我们要介绍的主角就是强大的 AVPlayer。

AVPlayer

AVPlayer 存在于 AVFoundation 框架中,所以要使用 AVPlayer,要先在工程中导入 AVFoundation 框架。
AVPlayer 播放界面中不带播放控件,想要播放视频,必须要加入 AVPlayerLayer 中,并添加到其他能显示的 layer 当中。
AVPlayer 中音视频的播放、暂停功能对应着两个方法 play、pause 来实现。
大多播放器都是通过通知来获取播放器的播放状态、加载状态等,而 AVPlayer 中对于获得播放状态和加载状态有用的通知只有一个:AVPlayerItemDidPlayToEndTimeNotification(播放完成通知) 。播放器的播放状态判断可以通过播放器的播放速度 rate 来获得,如果 rate 为0说明是停止状态,为1时则是正常播放状态。想要获取视频播放情况、缓冲情况等的实时变化,可以通过 KVO 监控 AVPlayerItemstatus、loadedTimeRanges 等属性来获得。当 AVPlayerItem status 属性为 AVPlayerStatusReadyToPlay时说明可以开始播放,只有处于这个状态时才能获得视频时长等信息;当 loadedTimeRanges 改变时(每缓冲一部分数据就会更新此属性),可以获得本次缓冲加载的视频范围(包含起始时间、本次加载时长),这样一来就可以实时获得缓冲情况。

AVPlayer 中播放进度的获取通常是通过:- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block 方法。这个方法会在设定的时间间隔内定时更新播放进度,通过time参数通知客户端。至于播放进度的跳转则是依靠 - (void)seekToTime:(CMTime)time 方法。
AVPlayer 还提供了 - (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item 方法用于在不同视频之间的切换(事实上在AVFoundation内部还有一个AVQueuePlayer专门处理播放列表切换,有兴趣的朋友可以自行研究,这里不再赘述)。

代码示例

#import "ViewController.h"
#import "TableViewCell.h"
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
@property (nonatomic, strong, readwrite) UITableView* tableView;
@property (nonatomic, strong) AVPlayerViewController* avPlayerVC;
@property (nonatomic, strong) AVPlayer* avPlayer;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor whiteColor];self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, 428, 826)  style:UITableViewStylePlain];self.tableView.backgroundColor = [UIColor systemGray6Color];self.tableView.delegate = self;self.tableView.dataSource = self;[self.view addSubview:self.tableView];
}- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {return 250;
}
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {return 1;
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 1;}- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"111"];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"111"];}NSString *webVideoPath = @"https://webdownload.wmupd.com/webdownload/client/sandianlingxiandaopv.mp4";//用视频路径的字符串生成网络接口NSURL *webVideoUrl = [NSURL URLWithString:webVideoPath];//创建AVPlayer(同时引用上方创建好的网络接口)self.avPlayer = [[AVPlayer alloc] initWithURL:webVideoUrl];//使用AVPlayer创建AVPlayerViewController_avPlayerVC =[[AVPlayerViewController alloc] init];_avPlayerVC.player = _avPlayer;//设置AVPlayerViewController的位置_avPlayerVC.view.frame = cell.bounds;[cell.contentView addSubview:_avPlayerVC.view];return cell;
}@end

请添加图片描述


http://www.ppmy.cn/news/428327.html

相关文章

AVB简介--第三篇:AVTP简介

转自&#xff1a;AVB简介--第三篇&#xff1a;AVTP简介 本文是AVB系列文章的第三篇&#xff0c;主要介绍AVB协议族中的音视频传输协议AVTP(IEEE Std 1722-2016)。 AVTP是个链路层传输协议&#xff0c;其主要作用有两个&#xff1a; 音视频数据封装&#xff1a;将音视频数据封…

AVFoundation(一)

AVFoundation是可用于播放和创建基于时间的视听媒体的几种框架之一。它提供了一个Objective-C接口&#xff0c;您可以使用该接口详细处理基于时间的视听数据。例如&#xff0c;您可以使用它来检查、创建、编辑或重新编码媒体文件。您还可以从设备中获取输入流&#xff0c;并在实…

ios 视频播放器:AVPlayer(附:seektotime精准定位)

Swift 3.1{ func playVideo() {var playerItem AVPlayerItem(url: movieURL as URL)// 创建 AVPlayer 播放器var player AVPlayer(playerItem: playerItem)// 将 AVPlayer 添加到 AVPlayerLayer 上let playerLayer AVPlayerLayer(player: player)// 设置播放页面大小player…

iOS AVFoundation

AVFoundation AVPlayer AVPlayer是一个控制器对象&#xff0c;用于管理媒体资源。AVPlayer基于本地文件或远程文件媒体播放。AVPlayer用于一次播放单个媒体资源&#xff0c;可以使用replaceCurrentItem(with:)方法重用播放器实例来播放气体媒体资源&#xff0c;但同一个时刻只…

AVFoundation–简介

AVFoundation是很多处理基于时间的音视频文件的框架之一。你可以用它来检查&#xff0c;创建&#xff0c;编辑或者对媒体文件重编码。可以从设备中得到输入流&#xff0c;以及在实时捕捉和播放的时候对视频进行处理。 如果你仅仅需要播放视频&#xff0c;在IOS上你可以使用Medi…

[AV1] AV1 Reference Software

返回目录 AV1 Reference Software 版本发布&#xff08;官方Tag&#xff09; 版本发布日期v0.1.02017-06-09v1.0.02018-06-25v1.0.0-errata12019-01-18v2.0.02020-05-18v3.0.02021-03-23 软件下载 Libav1的下载地址在谷歌的服务器上&#xff0c;国内需要科学上网才能访问得…

数字IC设计 - 数字集成电路基础

MOS管结构以及工作原理 MOS管结构图 MOS管是金属&#xff08;metal&#xff09;—氧化物&#xff08;oxide&#xff09;—半导体&#xff08;semiconductor&#xff09;场效应晶体管&#xff0c;或者称是金属—绝缘体&#xff08;insulator&#xff09;—半导体。MOS管的sour…

Mock和Vite-plugin-Mock的区别是什么?

简介 我不知道大家和我是否有一样的疑问&#xff0c;之前Mock.js用的挺好&#xff0c;为啥又出现了一个vite-plugin-mock,而且这个插件还依赖于Mock.js.那么他的优势到底是什么呢&#xff1f;如果你也有这样的疑问&#xff0c;本文最后会给出答案解开这个谜底 前言 我之前已经…