iOS 视频播放器开发

article/2025/10/3 21:53:40

需求设计

做一个小学生教育辅导视频播放器。

参考小猿搜题视频播放器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0GsyFSt-1675164972791)(https://tva1.sinaimg.cn/large/008vxvgGgy1h9xk4fm5xfj31sx0u0mz0.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZ7e0Z3Z-1675164972792)(https://tva1.sinaimg.cn/large/008vxvgGgy1h9xk4fm5xfj31sx0u0mz0.jpg)]

主要功能

  • 非VIP用户免费播放开头部分;
  • 截屏;
  • 倍速播放;
  • 进度条快进快退;

实现原理

  1. 公开属性
#import "WMPlayer.h"
@property (nonatomic, retain) WMPlayerModel *playerModel;
@property (nonatomic, strong) WMPlayer  *wmPlayer;
  1. 实例化播放器
    //self.wmPlayer = [[WMPlayer alloc] initWithFrame:CGRectMake(0, [WMPlayer IsiPhoneX]?34:0, self.view.frame.size.width, self.view.frame.size.width*(9.0/16))];self.wmPlayer = [[WMPlayer alloc] initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height-88)];self.wmPlayer.delegate = self;self.wmPlayer.playerModel = self.playerModel;[self.view addSubview:self.wmPlayer];[self.wmPlayer play];//旋转屏幕通知[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(onDeviceOrientationChange:)name:UIDeviceOrientationDidChangeNotificationobject:nil];
  1. VC生命周期
#pragma mark - Life Cycle- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];[self.navigationController setNavigationBarHidden:YES animated:NO];self.view.frame = UIScreen.mainScreen.bounds;self.wmPlayer.delegate = self;
}-(void)viewDidDisappear:(BOOL)animated{[super viewDidAppear:animated];[self.navigationController setNavigationBarHidden:NO animated:NO];
}- (void)dealloc{[self.wmPlayer pause];[self.wmPlayer removeFromSuperview];self.wmPlayer = nil;[[NSNotificationCenter defaultCenter] removeObserver:self];NSLog(@"DetailViewController dealloc");
}
  1. 播放器代理
#pragma mark - WMPlayerDelegate
///播放器CloseButton
-(void)wmplayer:(WMPlayer *)wmplayer clickedCloseButton:(UIButton *)closeBtn{if (wmplayer.isFullscreen) {[self exitFullScreen];}else{if (self.presentingViewController) {[self dismissViewControllerAnimated:YES completion:^{}];}else{[self.navigationController popViewControllerAnimated:YES];}}
}
///全屏按钮
-(void)wmplayer:(WMPlayer *)wmplayer clickedFullScreenButton:(UIButton *)fullScreenBtn{if (self.wmPlayer.viewState == PlayerViewStateSmall) {[self enterFullScreen];}
}-(void)enterFullScreen{if (self.wmPlayer.viewState != PlayerViewStateSmall) {return;}LandscapeRightViewController *rightVC = [[LandscapeRightViewController alloc] init];[self presentToVC:rightVC];
}-(void)exitFullScreen{if (self.wmPlayer.viewState!=PlayerViewStateFullScreen) {return;}self.wmPlayer.isFullscreen = NO;self.wmPlayer.viewState = PlayerViewStateAnimating;[self dismissViewControllerAnimated:YES completion:^{self.wmPlayer.viewState  = PlayerViewStateSmall;}];
}
  1. 旋转屏幕通知
#pragma mark - NSNotificationCenter
/***  旋转屏幕通知*/
- (void)onDeviceOrientationChange:(NSNotification *)notification{if (self.wmPlayer.viewState!=PlayerViewStateSmall) {return;}if (self.wmPlayer.isLockScreen){return;}UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;UIInterfaceOrientation interfaceOrientation = (UIInterfaceOrientation)orientation;switch (interfaceOrientation) {case UIInterfaceOrientationPortraitUpsideDown:{}break;case UIInterfaceOrientationPortrait:{}break;case UIInterfaceOrientationLandscapeLeft:{[self presentToVC:[LandscapeLeftViewController new]];}break;case UIInterfaceOrientationLandscapeRight:{[self presentToVC:[LandscapeRightViewController new]];}break;default:break;}
}-(void)presentToVC:(FullScreenHelperViewController *)aHelperVC{self.wmPlayer.viewState = PlayerViewStateAnimating;self.wmPlayer.beforeBounds = self.wmPlayer.bounds;self.wmPlayer.beforeCenter = self.wmPlayer.center;self.wmPlayer.parentView = self.wmPlayer.superview;self.wmPlayer.isFullscreen = YES;aHelperVC.wmPlayer = self.wmPlayer;aHelperVC.modalPresentationStyle = UIModalPresentationFullScreen;aHelperVC.transitioningDelegate = self;[self presentViewController:aHelperVC animated:YES completion:^{self.wmPlayer.viewState = PlayerViewStateFullScreen;}];
}
  1. 调用播放器
        VideoDataModel *videoModel = self.videoDataAry[indexPath.row];WMPlayerModel *playerModel = [WMPlayerModel new];playerModel.videoURL = [NSURL URLWithString:videoModel.video_url];//playerModel.videoURL = [NSURL URLWithString:@"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4"];//playerModel.videoURL = [NSURL URLWithString:@"http://img.zhuoqi.tech/test_h264_level30_480_360.mp4"];playerModel.title = videoModel.nickname;DetailViewController *detailVC = [DetailViewController new];detailVC.playerModel = playerModel;[self.navigationController pushViewController:detailVC animated:YES];

基本概念

一个在线视频能够播放,大致是经过了如下步骤:

视频播放原理

HLS(Http Live Streaming)

HLS是苹果推出,实现的基于HTTP的流媒体传输协议:

优点:

1、通过m3u8索引文件可实现针对当前浏览设备的智能选择播放源

2、通过m3u8索引文件可实现添加备份索引文件,防止服务器崩溃视频播放失败

3、和http视频一样不需要太多服务器额外配置

缺点:

1、并非真正实时视频,30s左右时间差

2、需要视频处理

3、因为需要请求索引文件(ts视频文件)请求次数相对较多,对服务器负载较大

AVPlayer支持哪些视频格式

苹果设备支持音视频格式并不是就代表AVPlayer也支持那么多格式,确定AVPlayer的支持格式,我们可以查看AVKit中的一个API:

//展示当前支持的音视频格式
let asset = AVURLAsset.audiovisualTypes()
//打印asset可以得到(已经转过展示格式)
asset type ("audio/aacp","video/3gpp2","audio/mpeg3","audio/mp3","audio/x-caf","audio/mpeg","video/quicktime","audio/x-mpeg3","video/mp4","audio/wav","video/avi","audio/scpls","audio/mp4","audio/x-mpg","video/x-m4v","audio/x-wav","audio/x-aiff","application/vnd.apple.mpegurl","video/3gpp","text/vtt","audio/x-mpeg","audio/wave","audio/x-m4r","audio/x-mp3","audio/AMR","audio/aiff","audio/3gpp2","audio/aac","audio/mpg","audio/mpegurl","audio/x-m4b","application/mp4","audio/x-m4p","audio/x-scpls","audio/x-mpegurl","audio/x-aac","audio/3gpp","audio/basic","audio/x-m4a","application/x-mpegurl"
)

AVPlayer支持的

视频编码格式:H.264、HEVC(iPhone7及以后设备)、MPEG-4。
视频封装格式:.mp4、.mov、.m4v、.3gp、.avi等。
如果想支持更多的视频格式,可以使用使用第三方的框架,常用的视频编码和解码框架有VLC和ffmpeg。

AVPlayerItem的控制

AVPlayerItem作为资源管理对象,它控制着视频从创建到销毁的诸多状态。

播放状态 status

typedef NS_ENUM(NSInteger,AVPlayerItemStatus) {AVPlayerItemStatusUnknown,//未知AVPlayerItemStatusReadyToPlay,//准备播放AVPlayerItemStatusFailed//播放失败
};

我们使用KVO监测playItem.status,可以获取播放状态的变化

[self.playerItem addObserver:selfforKeyPath:@"status"options:NSKeyValueObservingOptionNewcontext:nil];

在监听回调中:

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{if([object isKindOfClass:[AVPlayerItemclass]]) {if([keyPath isEqualToString:@"status"]) {switch(_playerItem.status) {caseAVPlayerItemStatusReadyToPlay://推荐将视频播放放这里[self play];break;caseAVPlayerItemStatusUnknown:NSLog(@"AVPlayerItemStatusUnknown");break;caseAVPlayerItemStatusFailed:NSLog(@"AVPlayerItemStatusFailed");break;default:break;}}}
}

虽然设置完播放配置我们可以直接调用[self.player play];进行播放,但是更稳妥的方法是在回调收到AVPlayerItemStatusReadyToPlay时进行播放。

参考文章

HTTP Streaming Architecture

HTTP Live Streaming

WMPlayer

WeChat

SJVideoPlayer

DouYin

TBPlayer

iOS视频播放器开发

iOS视频播放的基本方法

上传到阿里云OSS的视频如何实现在线播放

ZFPlayer 3.0解析

AVPlayer支持的视频格式

iOS音视频播放指南(一)

iOS音视频开发学习指南

iOS视频开发(一):视频采集


http://chatgpt.dhexx.cn/article/pDOZRDHC.shtml

相关文章

iOS播放器SDK-基于FFmpeg解码OpenGL渲染-CYPlayer

CYPlayer基于Objective-C编写,支持RTMP和HTTP协议的播放流,如果需要smb协议,可以自行修改CYFFmpeg兼容samba协议即可。 1.支持动态帧率控制,适配各种性能的机型,最高支持1080p60fps; 2.动态内存控制,防止…

iOS播放器常用功能

iOS播放器常用功能 强制横屏 在播放器中常见强制横屏,例如,如下这种: OC实现代码如下: if ([[UIDevice currentDevice] respondsToSelector:selector(setOrientation:)]) {SEL selector NSSelectorFromString(&…

IOS开发之——音乐播放器-播放器页面(05)

一 概述 播放器页面Storyboard点击列表Cell时,播放器页面show弹出播放器页面按钮对应的功能 二 播放器页面Storyboard 2.1 Storyboard界面 2.2 界面说明 界面分类:顶部View和底部View两部分顶部View:歌曲大图、名字背景(歌曲名和歌手名)、…

西瓜视频 iOS 播放器技术重构

动手点关注 干货不迷路 👆 播放器简介 播放器是西瓜视频等视频类 App 最主要的业务场景,也是最主要的流量入口,其承载包括下层基础播放,上层的各种播放业务:状态栏、弹幕、音量、亮度、评论、点赞、进度、倍速、清晰度…

iOS系统自带的视频播放器

简述:MPMoviePlayerController,MPMoviePlayerViewController,AVPlayerViewController三种视频播放器的讲解1.MPMoviePlayerController效果:MPMoviePlayerController 密码: yam8MPMoviePlayerController&#xff0c;在MediaPlayer框架中 #import <MediaPlayer/MediaPlayer.h&…

iOS 超好用的本地视频播放器推荐!

本地播放器作为日常生活中不可或缺的一款工具类APP&#xff0c;Windows、Android等平台不乏一些功能与体验兼优的产品&#xff0c;但 iOS 平台的用户就没有那么幸运了&#xff0c;优秀的产品凤毛麟角&#xff0c;且多数收费。 这源于 iOS 平台的特殊性&#xff0c;完美支持各种…

iOS视频播放器之ZFPlayer剖析

1、引言 本文主要针对ZFPlayer的功能实现来剖析&#xff0c;以及总结一下大家遇到的问题和解决方案 首先ZFPlayer现在拥有的功能&#xff1a; 支持横、竖屏切换&#xff0c;在全屏播放模式下还可以锁定屏幕方向 支持本地视频、网络视频播放 支持在TableviewCell播放视频 左侧1/…

996程序员办公室猝死?公司:没死,继续上班了

程序员头条 报道 网传 996 程序员办公室猝死&#xff0c;公司回应&#xff1a;系因低血糖晕倒 日前&#xff0c;一则“996程序员办公室猝死”的视频在网络传播。根据视频显示&#xff0c;一名男子扶着办公桌栏短暂逗留之后&#xff0c;直挺挺的摔倒在地面。 事发后&#xff0c;…

网传京东37岁程序员在工位猝死。当事人:我还没死,还能加班!

编程牛人整理 近日微信群里疯传&#xff0c;一男子在工位突然倒地的图片与视频&#xff0c;随后&#xff0c;有自媒体称&#xff0c;这位倒地的员工系京东程序员疑似因常年夜班在工位猝死。 3月25日&#xff0c;网传消息称&#xff0c;该员工今年37岁&#xff0c;在加班过程中猝…

35岁程序员被公司辞退,生活压力太大痛哭,中年危机如何自救?

多数人都喜欢安逸的生活&#xff0c;尤其是随着年龄的增长&#xff0c;很多人都希望工作和生活趋于稳定&#xff0c;不愿意再让生活有很大的变动。可是&#xff0c;当达到一定的年龄时&#xff0c;危机还是存在的。 如今已经35岁的杰哥&#xff0c;是一个典型的理工男&#xf…

秒啊!程序员防猝死指南来了!

‍‍ 作者 | 咏春警告的胖虎 来源 | golang小白成长记&#xff08;ID&#xff1a;golangxbczj&#xff09; 过年之前&#xff0c;跟我可爱的小侄子通了个电话&#xff0c;上来就说&#xff0c;"叔叔你头发怎么变少了"&#xff0c;我很痛心&#xff0c;我的小侄子&…

程序员工作猝死给公司造成损失可以找其父母追讨吗?

从 996.icu 开始&#xff0c;996开始被热议&#xff0c;马巴巴说&#xff1a;“996 是福报”&#xff0c;东哥说&#xff1a;“81168”。然后 90 后乃至 00 后被推出来说&#xff1a;“这届真难带&#xff01;”。我一直认为网上有个段子说得好。  ☠ 月薪5W&#xff1a;996就…

程序员离职事件始末

吴小胖第10次推送 阅读时间预计3分钟~ 这是我毕业后的第一份工作... 面试时&#xff0c;HR小姐姐告诉我... 然鹅...我入职之后才发现&#xff1a; 对标阿里的只有加班强度 对标华为的只有狼性文化 对标百度的&#xff0c;额&#xff0c;没有对标百度 同事们有的住在海淀区、有的…

为什么程序猿996会猝死,而企业家007却不会?

想和吴小胖一起工作吗&#xff1f; 内推邮箱【shen_baili163.com】&#xff0c;响应P99非常小 其实&#xff0c;也可以关注公众号&#xff0c;不取关的那种哦 然后留言&#xff0c;我会主动联系你哟 后面还会继续更新Apache Dubbo源码分析和ElasticSearch的内容哦&#xff0c;大…

唉!一 28 岁程序员因新冠离世。。。

上一篇&#xff1a;为什么总是闹离职的员工没走&#xff0c;平时不吭声的员工却突然离职&#xff1f; 2022年12月19日&#xff0c;微信公众号万户楼台 发布《西安28岁程序员重症病危》的内容。 病人名字为郭晓桐&#xff08;94年生&#xff09;&#xff0c;年龄28岁。 其没有基…

成年人的崩溃只在一瞬间,程序员凌晨三点写的代码竟被女友删了...

对于恋爱中的情侣来说&#xff0c;吵架是很正常的事情&#xff0c;就算是再怎么亲密&#xff0c;也难免会出现意见不合的时候。 吵架不可怕&#xff0c;可怕的是&#xff0c;受吵架情绪的影响&#xff0c;做出一些比较“极端”的事情。 之前某社交平台上一位女生吐槽自己的男…

违法?猝死?你肯定不知道程序员还有这些“高危”操作

全文共2975字&#xff0c;预计学习时长9分钟 图源&#xff1a;百度 10月24日&#xff0c;一段“996程序员猝死在1024程序员节”的视频在各大IT群疯传。不久 “程序员猝死”的消息被搬上了热搜。 图源&#xff1a;微博 看毕&#xff0c;坐在电脑面前的程序员们觉得自己的心跳仿佛…

59% 的程序员曾担心自己猝死!

近期&#xff0c;接连发生的几起猝死事件引发人们的警觉&#xff0c;年轻人健康的话题成为大众持续关注的热点。 1月25日&#xff0c;丁香医生数据研究院发布了《2021国民健康洞察报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;在56196个样本调查中&#xff0c;…

程序员防猝死!!!

自从踏上了这条路&#xff0c;我就早已把生死置之度外了。 如果我死了&#xff0c;只能证明我不过是如此程度的男人。 ​ -----------罗罗诺亚索隆 昨天&#xff0c;微信群里传苏宁程序员上班期间倒地猝死。 这种消息对本身就是程序员的我们&#xff0c;已经不是什么新闻了。…

又一程序员猝死...

声明&#xff1a;本文首发微信公众号【菜鸟要飞】&#xff0c;如有转载&#xff0c;请标明出处&#xff01; 今日在脉脉上看到了一篇不幸的消息&#xff1a;今日头条一名iOS开发猝死了。据网上消息说&#xff0c;此开发曾是腾讯OMG开发组长。 逝者为大&#xff0c;又是同行&am…