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 ...
随机推荐
- FORM
一 .新增的input输入属性 1.email类型 在表单提交E-mail地址时,无效的输入会生成很多无效数据,对后期的数据检索造成一定的影响.所以在表单提交之前,需要对输入的E-mail地址进行有效 ...
- Python
语法 #!/usr/bin/python 注释:# 编码:# -*- coding: UTF-8 -*- 缩进 运算符 算数运算符 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得 ...
- js 刷新页面window.location.reload();
Javascript刷新页面的几种方法:1 history.go(0)2 window.location.reload() window.location.reload(true) 3 ...
- 如何让vim自动显示函数声明-使用 echofunc.vim插件
echofunc.vim可以显示函数的declaration, 默认的是针对c/c++, 对于php, 只要 启用了 ctags都可以, 因为echofunc是从tags file中获取数据的... ...
- linux大文件分割 split命令
inux split 命令 功能说明:切割文件. 语 法:split [--help][--version][-][-b ][-C ][-l ][要切割的文件][输出文件名] 补充说明:split可将 ...
- mysql获取一个表中的下一个自增(id)值的方法
SELECT Auto_increment FROM information_schema.`TABLES` WHERE Table_Schema='数据库名' AND table_name = '表 ...
- Red5 1.0.0RC1 集成到tomcat6.0.35中运行&部署新的red5项目到tomcat中
1.下载red5-war-1.0-RC1.zip 解压之得到 ROOT.war 文件. 2.处理tomcat. 下载apache-tomcat-6.0.35-windows-x86.zip包,解压到你 ...
- FTP下载文件失败
这几天的定时任务下载文件的脚本失败了. 于是手工执行测试,发现报550 Permission denied. Passive mode refused. 意思就是被动模式下,没有权限获取文件. 解决方 ...
- Javascript设计模式学习一
学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...
- jquery load 和 iframe 比较
如果要加载的东西比较简单,里面的没有复杂的数据和逻辑,可以使用load.如果要加载的页面自身有复杂的逻辑.操作,还是建议使用ifame,因为iframe里面可以引入自身的js和样式,而load引入的东 ...