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];
        }
    }];
}

 

时间: 2024-10-27 08:17:07

iOS多播放器封装的相关文章

一个功能齐全的IOS音乐播放器应用源码

该源码是在ios教程网拿过来的,一个不错的IOS音乐播放器应用源码,这个是我当时进公司时 我用了一晚上写的  图片都是在别的地方扒的,主要是歌词同步,及上一曲,下一曲,功能齐全了 ,大家可以学习一下吧.<ignore_js_op><ignore_js_op><ignore_js_op><ignore_js_op> 详细说明:http://ios.662p.com/thread-1599-1-1.html

iOS音乐播放器相关

iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌曲,只不过该播放器播放网络歌曲是先将歌曲下载下来再进行播放) 下面记录一下相关要用到的方法 1.获取本地歌曲库(ipod路径)歌曲 // 读取本地音乐 MPMediaPropertyPredicate *albumNamePredicate = [MPMediaPropertyPredicate p

iOS音乐播放器(歌词自动滚动)

简单实现基于IOS的音乐播放器,并且带有歌词,随播放自动滚动,实现效果如下: 首先,需要建立一个解析歌词的类ZMPlrc,解析歌词主要就是把时间和对应的歌词分离出来,然后存储到数组中. ZMPlrc.h #import <Foundation/Foundation.h> @interface ZMPlrc : NSObject /** 时间 */ @property (nonatomic,strong)NSMutableArray *timeArray; /** 歌词 */ @property

一个IOS音乐播放器源码

此代码是IOS一款播放器代码,自己闲来仿照主流播放器写的,该播放器支持各种格式播放,支持上一曲,下一曲,歌词同步播放,音量调节大小,快进,快退等功能,后续功能我会继续完善.代码仅供学习交流,如有写的不好,望各位海涵...希望对刚刚接触这块的童鞋有所帮助......js_op> 3. [图片] iOS 模拟器屏幕快照“2013-9-18 上午11.06.16”.png    <ignore_js_op> 4. [图片] iOS 模拟器屏幕快照“2013-9-18 上午10.58.17”.p

卡拉OK效果的实现-IOS音乐播放器

自己编写的音乐播放器偶然用到这个模块,发现没有思路,而且上网搜了搜,关于这方面的文章不是很多,没找到满意的结果,然后自己也是想了想,最终实现了这种效果,想通了发现其实很简单. 直接上原理: 第一种: 原理就是创建一个UILabel,设置一下UILabel的lineBreakMode属性为NSLineBreakByClipping(这样的话就是的内容过多的话就会不显示,所以UILabel的宽度设置成0,就会不显示内容,然后用定时器不断更改宽度,内容也就会不断地显示出来,覆盖掉原本的内容,字体颜色要

iOS 音频播放器

ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support. TheAmazingAudioEngine: Core Audio, Cordially: A sophisticated framework for iOS audio applications, built so you don't have to. 原文地址:https://www.cnblogs.

iOS 多个播放器同时播放,双击全屏,单击退出全屏

前言:公司需求如下:点击一个按钮播放一个视频,最多同时播放4个:双击某视频让其全屏,单击再恢复原来的样子.IOS的播放器有两种,MPMoviePlayerController,AVAudioPlayer.首先我尝试的是前者,发现并不能让两个视频同时播放,当播放第二个视频的时候,第一个就自动停止了:后来又找了些资料试了试后者,完美解决了这个问题. 多个播放器同时播放,资料参考自:http://ios.jobbole.com/84287/ ,这里介绍的挺详细的,文章后面还有项目可以下载演示,这里就不

基于VLC的播放器开发

VLC的C++封装 因为工作需要,研究了一段时间的播放器开发,如果从头开始做,可以学习下FFmpeg(http://www.ffmpeg.org/),很多播放器都是基于FFmpeg开发的,但是这样工作量和难度都比较大,如果想很快能拿出一个播放器来用的,可以研究下开源的播放器,参考下射手播放器作者的文章:媒体播放器三大底层架构. 对比下现有的主流播放器:媒体播放器列表,VLC是在各个方面都表现很突出的一款.VLC 是一款免费.自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,DVD.音

【U3D】播放器设置(PlayerSettings)

播放器设置 (Player Settings) 播放器设置 (Player Settings) 用于为您要在 Unity 中编译的最终游戏定义各项(特定于平台的)参数.例如,参数中的一些值用于您打开单机版游戏时启动的分辨率对话框 (Resolution Dialog) 中,而在编译 iOS 设备游戏时 XCode 会使用其他值.因此,正确填写这些值十分重要. 要查看“播放器设置”(Player Settings),请从菜单栏选择编辑 (Edit) -> 项目设置 (Project Setting