使用Vitamio开发iOS平台上的万能播放器
迅速了解
Vitamio是干什么的?看官方怎么说:
“Vitamio SDK for iOS是Yixia Ltd官方推出的 iOS 平台上使用的软件开发工具包(SDK),为iOS开发者提供简单、快捷的接口,帮助开发者实现 iOS 平台上的媒体播放应用。”
说白了,就是可以帮助你便捷地开发自己的iOS播放器。
本文目标
从0开始建工程,使用VitamioSDK开发一个最简单的播放器:打开app之后,能看到一个播放按钮,点击按钮,就开始播放事先放在Documents目录下的视频文件,再按一下按钮可以暂停。
就这么简单。
准备工作
下载Vitamio SDK:
https://github.com/yixia/Vitamio-iOS
当前版本是4.2.0。上个版本是1.1.3,这跳跃也太大了吧?估计是为了和安卓的Vitamio SDK保持同步。
压缩包解压后内容如下:
Doc放文档,用浏览器打开Doc/html/index.html可查看Vitamio官方文档(还是苹果官方文档的风格哦)。各种接口什么的貌似齐全,但全英文看着有点眼花啊。
Demo放了一个直接编译就能运行的工程,可以播放多个在线视频。你要是乐意,完全可以照着这个demo改造成自己想要的app。
Vitamio放的就是我们将要用到的SDK。
具体步骤
本文用于调试的真机是ipod touch5,系统是iOS7.0.4。
新建工程
新建一个Single View工程
起个名字叫myPlayer
简单UI
在storyboard中拖放三个控件,分别是UILabel,用于展示视频名称;UIView用于承载播放画面,UIButton用于播放或暂停。
按钮的default状态显示“播放”,selected状态显示“暂停”:
UILabel是lblTitle
UIView是playerView
UIButton是btnPlayOrPause,点击事件是btnPlayOrPauseClick
再加一个NSString变量存视频地址
目前看起来这样:
[objc] view plaincopy
- @interface iTechBlueViewController : UIViewController
- {
- NSString* videoPath;
- }
- @property (weak, nonatomic) IBOutlet UILabel *lblTitle;
- @property (weak, nonatomic) IBOutlet UIView *playerView;
- @property (weak, nonatomic) IBOutlet UIButton *btnPlayOrPause;
- - (IBAction)btnPlayOrPauseClick:(id)sender;
- @end
检测视频文件
我们要遍历Documents文件夹下的文件,将找到的第一个视频文件的地址记住,并将其名称显示在UILabel上。
[objc] view plaincopy
- -(NSString*)findVideoInDocuments
- {
- NSString *documentsDirectory = [NSString stringWithFormat:@"%@/Documents", NSHomeDirectory()];
- NSFileManager *fileMg = [[NSFileManager alloc] init];
- //遍历Documents下的文件,找到视频文件就返回它的全路径
- NSArray *subPaths = [fileMg contentsOfDirectoryAtPath:documentsDirectory error:nil];
- if (subPaths) {
- for (NSString *subPath in subPaths) {
- if ( [self isMediaFile:[subPath pathExtension]]) {
- NSString *path = [documentsDirectory stringByAppendingPathComponent:subPath];
- return path;
- }
- }
- }
- return nil;
- }
[objc] view plaincopy
- -(BOOL)isMediaFile:(NSString*)pathExtension
- {
- //可用格式
- /*
- ".M1V", ".MP2", ".MPE", ".MPG", ".WMAA",
- ".MPEG", ".MP4", ".M4V", ".3GP", ".3GPP", ".3G2", ".3GPP2", ".MKV",
- ".WEBM", ".MTS", ".TS", ".TP", ".WMV", ".ASF", ".ASX", ".FLV",
- ".MOV", ".QT", ".RM", ".RMVB", ".VOB", ".DAT", ".AVI", ".OGV",
- ".OGG", ".VIV", ".VIVO", ".WTV", ".AVS", ".SWF", ".YUV"
- */
- //简单粗暴地判断是否为视频格式,这里先试6个
- NSString*ext = [pathExtension uppercaseString];
- if([ext isEqualToString:@"MP4"])
- {
- return YES;
- }
- else if([ext isEqualToString:@"MOV"])
- {
- return YES;
- }
- else if([ext isEqualToString:@"RMVB"])
- {
- return YES;
- }
- else if([ext isEqualToString:@"MKV"])
- {
- return YES;
- }
- else if([ext isEqualToString:@"FLV"])
- {
- return YES;
- }
- else if([ext isEqualToString:@"TS"])
- {
- return YES;
- }
- return NO;
- }
[objc] view plaincopy
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- videoPath = [self findVideoInDocuments];
- if(videoPath)
- {
- _lblTitle.text = [videoPath lastPathComponent];
- }
- }
现在编译一下看看有没有问题吧!
好,虽然没问题,但也只是我们拖出来的那个界面而已。
咱们现在用iFunBox往Documents文件夹下放一个视频吧。
什么!?你还没用过iFunBox?赶紧去下载一个试试,确实能给开发带来便利哦。
我放了一个特小的文件0.ts进去。
再编译试试,这回题目就出来啦!
添加Vitamio并配置工程(or not?)
现在我们已经有了视频文件并且获得了它的具体路径,接着就是要播放它了。开始使用Vitamio!
将上文解压后获得的Vitamio文件夹添加至工程:
添加后如果你手痒编译,竟然发现是能编译成功的!
难道VitamioSDK这么强悍,不需要任何配置就能用了?且往下看。
写播放器代码
引入Vitamio头文件
[objc] view plaincopy
- #import "Vitamio.h"
声明一个播放器变量
[objc] view plaincopy
- VMediaPlayer *mMPayer;
声明使用播放器协议
[objc] view plaincopy
<VMediaPlayerDelegate>以上三行代码写好,Vitamio SDK的各种接口就可以任你调遣了。这是最精简的配置。
VMediaPlayer和VMediaPlayerDelegate都藏了什么好东西?我们只能边学变探索。
现在咱们的头文件看起来是这样的:
[objc] view plaincopy
- #import
- #import "Vitamio.h"
- @interface iTechBlueViewController : UIViewController
- {
- NSString* videoPath;
- VMediaPlayer *mMPayer;
- }
- @property (weak, nonatomic) IBOutlet UILabel *lblTitle;
- @property (weak, nonatomic) IBOutlet UIView *playerView;
- @property (weak, nonatomic) IBOutlet UIButton *btnPlayOrPause;
- - (IBAction)btnPlayOrPauseClick:(id)sender;
- @end
初始化播放器,以下代码是初始化播放器的最精简写法。
[objc] view plaincopy
- -(void)initPlayer
- {
- if (!mMPayer) {
- mMPayer = [VMediaPlayer sharedInstance];
- [mMPayer setupPlayerWithCarrierView:self.playerView withDelegate:self];
- }
- }
可以看到,我们将自己拖到界面上的playerView传了过去,表示要用它来承载视频画面。
准备播放视频,同样,下面代码是准备播放视频最精简的写法:
[objc] view plaincopy
- -(void)prepareVideo
- {
- if(videoPath)
- {
- //播放时不要锁屏
- [UIApplication sharedApplication].idleTimerDisabled = YES;
- NSURL* videoURL = [NSURL fileURLWithPath:videoPath];
- [mMPayer setDataSource:videoURL];
- [mMPayer prepareAsync];
- }
- }
我们的代码写到prepareAsync,就把工作丢给Vitamio了。它会在准备好后在协议方法中通知我们的。
如果这时候你是一副“啥意思”的表情,请看工程的这个地方:
它在警告你:有些method没有实现,那是因为我们引用了VMediaPlayerDelegate之后还没去实现它需要的几个方法:
@required表示,以上三个方法是必须的,我们一一实现之。
首先添加一个布尔变量BOOL didPrepared,它非常重要,是我们的代码首次介入播放器的逻辑。
didPrepared是在Vitamio准备好播放视频后被调用的,我们可以在这时候记录下布尔值——播放准备好了,同时让播放器开始播放:
[objc] view plaincopy
- - (void)mediaPlayer:(VMediaPlayer *)player didPrepared:(id)arg
- {
- //显示“暂停”两字
- _btnPlayOrPause.selected = YES;
- didPrepared = YES;
- [player start];
- }
playbackComplete会在视频播放结束后被调用,这时可以记录播放历史、退出播放器什么的,但这里我们要的是最简,所以将播放器重置,从而要再播放的话,就得调用我们写的prepareVideo,这时didPrepared设为NO。
[objc] view plaincopy
- - (void)mediaPlayer:(VMediaPlayer *)player playbackComplete:(id)arg
- {
- _btnPlayOrPause.selected = NO;
- [player reset];
- didPrepared = NO;
- }
error会在Vitamio处理视频出错时被调用,让你有机会提醒用户或做其他处理,这里我们只是默默得打一个log:
[objc] view plaincopy
- - (void)mediaPlayer:(VMediaPlayer *)player error:(id)arg
- {
- NSLog(@"VMediaPlayer Error: %@", arg);
- }
记得在ViewDidLoad中调用initPlayer进行初始化,变这样:
[objc] view plaincopy
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- videoPath = [self findVideoInDocuments];
- if(videoPath)
- {
- _lblTitle.text = [videoPath lastPathComponent];
- [self initPlayer];
- }
- }
如果你想一打开app就播放视频,可以将第一次prepareVideo放在ViewDidAppear中。
在按钮点击中控制播放还是暂停:
[objc] view plaincopy
- - (IBAction)btnPlayOrPauseClick:(id)sender {
- if(videoPath)
- {
- BOOL isPlaying = [mMPayer isPlaying];
- if (isPlaying) {
- [mMPayer pause];
- _btnPlayOrPause.selected = NO;
- } else {
- if(didPrepared)
- [mMPayer start];
- else
- [self prepareVideo];
- _btnPlayOrPause.selected = YES;
- }
- }
- }
这里用Vitamio接口isPlaying来判断是否正在播放是最准确的,比我们自己维护一个播放状态要好。
但视频是否准备好这个状态由我们记录(didPrepared)。
点击播放时比想象中复杂,是因为要判断视频是否已经准备好,如果是的话继续播放,如果没有的话得调用做准备的方法。
写到这,代码好像就完成啦!去编译吧!去启动你写的第一个播放器吧少年!
配置Vitamio
你当时就震惊了。代码写得好顺利,现在一编译,为什么直接就failed了呢?出来50个error!
不用着急这调试,你该记起在VitamioSDK 添加进来后还没有配置吧?
原来还是得配置的,刚才开心得太早。。。
首先需要去Build Phases添加些framework和dylib,如下所示:
文字版如下:
如果你有强迫症,倒序添加下面的库,得到的就是按首字母从小到大排列的顺序
[plain] view plaincopy
- libbz2.dylib
- libiconv.dylib
- libstdc++.dylib
- libz.dylib
- AVFoundation.framework
- AudioToolbox.framework
- CoreMedia.framework
- CoreVideo.framework
- MediaPlayer.framework
- OpenGLES.framework
- QuartzCore.framework
添加后再编译。
欧耶,编译通过啦!
但是点击播放后会崩溃,有一条log是:
[plain] view plaincopy
- [UIDevice platformString]: unrecognized selector sent to instance
还是不着急调试,去到Build Setting,找到Linking下的Other Linker Flags,添加“-ObjC”:
然后编译再试,oh my god!可以播放啦!
如果这时候你依然很冷静,在思考一个问题:为啥这么一设就好了呢?其实Vitamio sdk作者早已料到你有此一问,你可以在上文提到的Doc文件夹下找到一个FAQ.md文件,里面就专门对这个问题进行了解答。
另外,我不会告诉你,Doc下的 Vitamio_SDK_for_iOS_User_Manual_cn.md是一篇比本博文更简洁但信息足够齐全的中文教程。你值得一读。
多说两句
能够播放和暂停是一个好的开始,但你肯定觉得不够。停止呢?进度控制呢?时长呢?快放呢?后台播放呢?切换上一首下一首呢?截图呢?视频缩略图呢?播放在线视频呢?……
各种播放器该有的功能在以后的博客里都会讲到,敬请期待。
最后,记得设置你工程的version为1.0。
源码在这
https://github.com/itechblue/myPlayer
来源:http://blog.csdn.net/itechblue/article/details/17932151
使用Vitamio开发iOS平台上的万能播放器相关推荐
- Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
如果基于Unity3d完全重新开发一个播放器,代价大,周期长,不适合快速出产品,最好的方式就是集成现有Native平台上成熟稳定播放器. 集成Navtive播放器可行性分析: 安卓: Unity3d可 ...
- 【幻灯片分享】iOS平台上开发音视频处理 | 盛大微酷 赵志猛 | iOS DevCamp
专业视频处理算法在移动开发中的优化:<iOS平台上开发音视频处理>| 盛大微酷赵志猛 | iOS DevCamp 主题简介:视频处理技术,已经在专业设备上得到了几十年的发展.但是这些处理方 ...
- 9家在iOS平台上收入最高的中国公司
9家在iOS平台上收入最高的中国公司 2012-07-11 10:15 | 14852次阅读 | 来源:虎嗅网 [已有23条评论]发表评论 关键词:赚钱,iOS,二战风云,德克萨斯扑克,斗地主 | 作 ...
- iOS 平台上常见的安装包有三种,deb、ipa 和 pxl
前言: 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl. 其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系 ...
- HBuilder/Mui开发ios使用上拉刷新导致滚动条无法使用的解决方法
HBuilder/Mui开发ios使用上拉刷新导致滚动条无法使用的解决方法 参考文章: (1)HBuilder/Mui开发ios使用上拉刷新导致滚动条无法使用的解决方法 (2)https://www. ...
- Vitamio打造自己的Android万能播放器
前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...
- 手机影音第十二天,集成vitamio万能播放器
Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐.到目前,全球 ...
- android 播放器集成,手机影音第十二天,集成vitamio万能播放器
Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐.到目前,全球 ...
- Android之集成万能播放器Vitamio
万能解码框架简介: 1.ffmpeg 多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能.视频格式转换.视频抓图.给视频加水印等. 国内很多手机客户端都是集成这个开源框架. http:// ...
- Vitamio 打造自己的万能播放器
Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染. Vitamio 功能强大,能够流畅播放720P甚至1080P高清MKV,FLV,MP ...
最新文章
- 感知机模拟或门的实现:权重和阈值的设置
- kaggle之数据分析从业者用户画像分析
- Nat. Methods | 学习微生物与代谢产物之间相互作用的神经网络
- JVM Client Server启动设置
- keepalived中的脑裂
- AMD Cpu 性能分析
- Spring MVC--使用fastjson替换jackson来响应json数据
- android 如何使用android:supportsRtl属性
- Qt——P6 QPushButton创建
- 数据库设计还是不是信息系统的核心?
- Hive报错:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
- 6. Keras-RNN应用
- Apm飞控学习笔记-AC_PosControl位置控制-Cxm
- 酒店ETL管理解决方案
- VS2015社区版、企业版、专业版下载官网地址
- pythonweb项目微服务_python web微服务器端
- AJAX技术学院风连衣裙,学院风连衣裙怎么搭配好看
- web服务器的开发(简易版本)
- DIY TCP/IP IP模块和ICMP模块的实现1
- 应广单片机 PMS150G、FPC161 基础例子【GPIO设置】
热门文章
- 全网最简单解决OneNote中英字体不统一
- 1.4_2 Axure RP 9 for mac 高保真原型图 - 案例1 【基础】模仿微信页面
- 学生网页设计作业源码 HTML+CSS 网上书店网站设计与实现
- 2019美赛C题o奖论文结构整理
- QCC3003项目实战:BlueMotor6 AGHFP CVC 蓝牙对讲耳机
- 惠普安装linux系统u盘,怎么用U盘安装linux系统
- 三角形外心的坐标公式
- java反射机制面试_java面试中面试官让你讲讲反射,应该从何讲起?
- matlab视频分辨率更改
- MySQL影院管理系统_数据库三级项目(电影院管理系统)