zoukankan      html  css  js  c++  java
  • 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];
            }
        }];
    }

     

     
  • 相关阅读:
    机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
    机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
    机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
    Shell遍历文件的每一行[转载]
    从C中变化过来的各种语言的printf输出格式
    PostgreSQL中的引号和null
    linux入门基础_centos(二)--fdisk分区
    linux入门基础_centos(一)--基础命令和概念
    centos中设置apache显示目录列表
    转载:centos上yum安装apache+php+mysql等
  • 原文地址:https://www.cnblogs.com/jacklandrin/p/6097447.html
Copyright © 2011-2022 走看看