iOS控件

iOS视频播放:预览播放视频前面N秒的设计

2020-11-04  本文已影响0人  双鱼子曰1987

一、需求

二、设计

2.1、设计要求

2.2、类图

短视频预览控制~.png

2.3、设计说明

@interface RETBL_ViewController : NSObject
@property (nonatomic, strong) VideoPlayerController *videoPlayerManager;
@property (nonatomic, strong) RETableViewManager *tblViewManager;

// 曝光的时候
[self.videoPlayerManager addVideoIntoList:item];

// cell 消失
[self.videoPlayerManager removeVideoFromList:item];
@end
@protocol VideoPlayerPreviewDelegate <NSObject>
@optional
- (NSArray<NSString *> *)videoUrlList;
- (NSArray<UIView *> *)videoContainerViewList;
@end
@interface VideosPreviewTableCell : RETableCell < ShortVideoPlayerViewDelegate >
@end
@implementation VideosPreviewTableCell
#pragma mark - ZTHVideoPlayerPreviewDelegate
- (NSArray<UIView *> *)videoContainerViewList {
    return viewList; // 一个cell可能有多个视频view
}
@end

@interface VideosPreviewTableCellItem : RETableCellItem < ShortVideoPlayerViewDelegate >
@property (nonatomic, weak) id< ShortVideoPlayerViewDelegate > cDelegate;
@end
@implementation VideosPreviewTableCellItem
#pragma mark - ZTHVideoPlayerPreviewDelegate
- (NSArray<NSString *> *)videoUrlList {
    return urlList;
}

- (NSArray<UIView *> *)videoContainerViewList {
    if (self.cDelegate && [self.cDelegate respondsToSelector:@selector(videoContainerViewList)]) {
        return [self.cDelegate videoContainerViewList];
    }
    
    return nil;
}
@end
@interface VideoPlayerController ()
/// 由于Player的ContentView,可能被复用的,如在Cell中使用。但是每个Id
@property (nonatomic, strong) NSMutableArray<id< ShortVideoPlayerViewDelegate >> *videoItemList;
@property (nonatomic, strong) ShortVideoPlayerCenter *currentPlayerCenter;
@property (nonatomic, strong) GCDTimer *timer;
@end

@implementation VideoPlayerController
// timer回调函数,播放videoItemList的控制
- (void)videoPlayControlLoopHandler {
  ...
}
@end

同时,内部设计一个定时器1s,定时器函数videoPlayControlLoopHandler主要代码是,检查VideoPlayer播放器状态是否可以加载下一个DataItem,可以则加载下一个,播放其对应视频。

采用定时器的原因在于,将列表DataITem播放与否 和 视频播放逻辑剥离,彼此互不影响。类似RunLoop循环机制,将需要播放的DataItem放入队列中,内部定时循环是否启动播放。而不是来一个就马上播放一个,消失一个立即暂停,当列表快速滚动的时候,会频繁让播放器在播放和暂停不断切换,会影响性能。

当然,后续的优化中,可以加入列表的ScrollRate,当滚动太快的时候,暂停播放逻辑提高性能。也可以考虑加入displaylink,当有空余能力的时候,才启动播放逻辑。

@interface ShortVideoPlayerCenter ()
/// 由于Player的ContentView,可能被复用的,如在Cell中使用。但是每个Id
@property (nonatomic, strong) EasyVideoPlayer *videoPlayer;
@property (nonatomic, strong) ShortVideoPlayerUnit *playerUnit;
@end

@implementation ShortVideoPlayerCenter
// timer回调函数,播放videoItemList的控制
- (void)videoPlayControlLoopHandler {
  ...
}
@end
@interface ShortVideoPlayerUnit : NSObject
@property (nonatomic, strong) NSArray<NSString *> *videoUrlList;
@property (nonatomic, strong) NSArray<UIView *> *videoViewList;
@end

三、总结

其他

上一篇 下一篇

猜你喜欢

热点阅读