首页 > 代码库 > iOS多播放器封装
iOS多播放器封装
今年在做直播业务的时候遇到一些问题,就是在一个套播放器UI中需要多种不同的播放器(AVPlayer、IJKPlayer、AliPlayer)支持,根据ABTest开关来切换具体使用哪种播放器,并且还要对播放器进行日志统计。
首先可以想到的是需要对不同的播放器封装一个统一的接口,对于UI来讲,不需要关系当前操控的是哪个播放器。
多播放器架构.jpg
其中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多播放器封装
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。