iOS多播放器封装
今年在做直播业务的时候遇到一些问题,就是在一个套播放器UI中需要多种不同的播放器(AVPlayer、IJKPlayer、AliPlayer)支持,根据ABTest开关来切换具体使用哪种播放器,并且还要对播放器进行日志统计。
首先可以想到的是需要对不同的播放器封装一个统一的接口,对于UI来讲,不需要关系当前操控的是哪个播放器。
其中player protocal是个关键
@protocol VideoPlaybackProtocal <NSObject>
@property (nonatomic, assign, setter=setDelegate:) id<LivePlaybackEventListener> delegate; -(void)addPlaybackEventListener:(id<LivePlaybackEventListener>)listener;
-(void)removePlaybackEventListener:(id<LivePlaybackEventListener>)listener; @property (nonatomic, strong, readonly) UIView * view;
@property (nonatomic, assign, readonly) CMTime currentPlaybackTime;
@property (nonatomic, assign, readonly) CMTime duration;
@property (nonatomic, assign, readonly) NSURL *currentPlayUrl;
@property (nonatomic, assign, readonly) BOOL supportsRTMP; - (void)stopDueToLiveDidEnd;
- (void)resume;
- (void)pause;
- (void)replay;
- (void)reload;
- (void)startPlayingWithPlayInfo:(NSURL*)url;
- (void)shutdown;
- (void)seekToProgress:(double)progress event:(PlayerEvent)event;
- (BOOL)isPlaying;
@end
然后三个播放器对这个接口进行各自的实现。这样对于ViewController来说播放器就是一个id<VideoPlaybackProtocal>,对播放器进行暂停播放各种操作就可以。打算用哪个播放器,就把id<VideoPlaybackProtocal>实例化成哪个播放器的实现,轻松又简单。
其中这里的Listener是一个delegate,当播放器出现播放完成、播放错误等事件时,Listener会对注册了Listener的对象进行广播,目前需要注册的是ViewController和Logger,UI收到广播来进行图形界面的变化,Logger则负责将事件统计上传到日志服务器当中。这个广播器通过一个NSHashTable * _listeners;来保证注册了广播的observe为弱引用,然后通过遍历observe来进行delegate调用,例如:
- (void)videoPlayerController:(id< VideoPlaybackProtocal >)playerController didFailWithError:(NSError *)error playerLog:(NSDictionary *)playerLog
{
[self _enumerateListeners:^(id listener, NSUInteger idx) {
if ([listener respondsToSelector:_cmd]) {
[listener videoPlayerController:playerController didFailWithError:error playerLog:playerLog];
}
}];
}
iOS多播放器封装的更多相关文章
- iOS音乐播放器相关
iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌 ...
- 一个功能齐全的IOS音乐播放器应用源码
该源码是在ios教程网拿过来的,一个不错的IOS音乐播放器应用源码,这个是我当时进公司时 我用了一晚上写的 图片都是在别的地方扒的,主要是歌词同步,及上一曲,下一曲,功能齐全了 ,大家可以学习一下吧 ...
- IOS AVAUDIOPLAYER 播放器使用
1. 导入 AVFoundation.framework 2.导入头文件 #import <AVFoundation/AVFoundation.h> 3. player = [[AVAu ...
- 卡拉OK效果的实现-iOS音乐播放器
自己编写的音乐播放器偶然用到这个模块,发现没有思路,而且上网搜了搜,关于这方面的文章不是很多,没找到满意的结果,然后自己也是想了想,最终实现了这种效果,想通了发现其实很简单. 直接上原理: 第一种: ...
- ios音乐播放器demo
闲暇时间,写了一个音乐播放器. 个人认为,基于Demo 的学习是最有效果的. 想学习的同学,欢迎下载.知识,只有在传播的时候才有价值. 不懂之处,欢迎留言询问,将热情解答. 运行图 项目结构图 Git ...
- iOS - 音乐播放器需要获取音乐文件的一些数据信息(封装获取封面图片的类)
// // AVMetadataInfo.h // AVMetadata // // Created by Wengrp on 15/10/27. // Copyright © 2015年 Wengr ...
- iOS 多个播放器同时播放,双击全屏,单击退出全屏
前言:公司需求如下:点击一个按钮播放一个视频,最多同时播放4个:双击某视频让其全屏,单击再恢复原来的样子.IOS的播放器有两种,MPMoviePlayerController,AVAudioPlaye ...
- iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码
iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...
- ump_player在线直播播放器
ump_player在线直播播放器封装,可以支持加载在线直播流 https://github.com/Mrxdh/EveryExercise/blob/master/ump_player%E5%9 ...
随机推荐
- photoshop常见抠图方法
1.多边形套索:这种工具是用于抠图的边界比较平直,但颜色比较复杂类的图像,它也是最笨最无奈的方法,只能是利用鼠标一点一点去点击抠选.2.磁性套索工具:分为三种:套索,多边形,磁性.这类工具一般只用于边 ...
- 一道Apple公司(中国)的面试题目
Apple在中国(上海)有公司业务,但是感觉主要是做测试工作的部门,主要是保障Apple的产品质量QE.面试的时候,面试官出了一道题目,我貌似曾今开过类似的题目,但是由于当场发挥不佳没有答出来.题目大 ...
- Git 分支管理和冲突解决
Git 分支管理和冲突解决 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称. 当前检出分支的前面会有星号. git branch newname 在当前检出分支上新建分支 ...
- vtkPlane和vtkPlaneSource
1.vtkPlane vtkPlane provides methods for various plane computations. These include projecting points ...
- Excel——OFFSET函数
1.首先看下offset函数的参数设置: 说明:height,width表面它的返回值可以是一个数组,而并非一个值.这样,它就可以用于数据有效性等. 2.使用offset实现转置: 3.offset函 ...
- vi 的使用
Vi 分三种模式:一般模式,编辑模式,和命令模式 一般模式: 光标移动,搜索与替换,删除,复制,粘贴 编辑模式:插入或者替换文本 命令模式:读取.保存文件 一般模式 光标移动: h(左), j(下), ...
- sublime3 的安装
1.官网下载 2.无耻的注册码(help) https://www.douban.com/note/539496964/ 常用 —– BEGIN LICENSE —–Alexey PlutalovSi ...
- 鼠标上下滑动总是放大缩小页面,按住ctrl+0
鼠标上下滑动总是放大缩小页面,可能是ctrl键失灵了,幸好键盘有两个ctrl键,按住ctrl+0,页面就正常了,吓死宝宝了,~~~~(>_<)~~~~
- python raise a string exception is deprecated
python不允许raise 一个内建的string 对象.所以就崩溃,可以先将其转换成其他string,比如赋值.
- Mac下配置Apache + Php + Mysql环境
Apache与PHP的配置 Mavericks同以往的OSX一样自带了apache2.2.24和php5.4.17,但默认情况下没有开启,打开终端 sudo apachectl start 这时在浏览 ...