视频
1.1 协议名
BBASMVideoAdapterProtocol
功能说明
小程序 SDK 内部基于播放器严重依赖宿主播放器(准确来说播放内核 ffmpeg),没有提供具体播放器的实现,只提供了调用播放相关接口以及委托事件,这样以来,宿主方需按照定义的接口进行实现、委托处理相关事件。
- 智能小程序提供了视频播放能力,通过实现 video 抽象接口就可以轻松让您的小程序拥有定制化的视频播放器,让小程序的的产品体验及产品功能更加完善。
- 开发者通过 swan.createVideoContext 来创建一个播放器实例,后续有关播放器的操作均在此对象上完成。
1.2 接口列表
协议介绍
BBASMVideoAdapterProtocol 为多实例播放器协议。
接入方法
- 遵循 BBASMVideoAdapterProtocol 协议,实现相关接口。
- 在相应时机调用 BBASMVideoHandleDelegate 代理方法。
播放视频
- 播放视频基本能力的接口。
- 小程序框架会提供父视图让宿主 App 将播放组件设置为其子视图。
- 小程序框架会提供 frame 让宿主设置播放组件的 frame 。
- 小程序框架提供代理对象来接受播放中的各种事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| /** * @brief 播放视频 * @param superView 父视图 * @param frame frame * @param videoInfo 视频信息 * @param superViewController 父vc * @param delegate BBASMVideoHandleDelegate */ - (void)playVideoInView:(UIView *)superView withFrame:(CGRect)frame videoInfo:(NSDictionary *)videoInfo videoController:(UIViewController *)superViewController delegate:(id<BBASMVideoHandleDelegate>)delegate; __attribute__((deprecated("该方法废弃,请使用 'createVideoInstanceWithDelegate:' 和 setPlayerVideoInfo:接口替代")));
/** * @brief 创建播放器实例 (SDK2.26.0新增接口) * @param delegate BBASMVideoHandleDelegate * @return 播放器实例(如果播放器实例类型是UIView或者UIView的子类,则需要加到ViewController上) */ - (UIViewController *)createVideoInstanceWithDelegate:(id)delegate;
/* * @brief 设置视频播放信息 (SDK2.26.0新增接口) * @param videoInfo 视频信息 */ - (void)setPlayerVideoInfo:(NSDictionary *)videoInfo;
@optional
/** * @brief 创建VR播放器实例,如果是VR视频,则初始化会调用此接口 (SDK2.26.0新增接口) * @param delegate BBASMVideoHandleDelegate */ - (UIViewController *)createVRVideoInstanceWithDelegate:(id)delegate;
|
开始播放
暂停播放
继续播放
停止播放
1 2 3 4 5 6 7 8 9
| /** * @brief 停止播放器,内核释放 (destroy) - 默认不向外部发送停止声音事件 */ - (void)stop; /** * @brief 停止播放器,内核释放 (destroy) * @param isReport 是否向外部app发送停止声音事件 */ - (void)stopPlayerReportDeactiveAudioSession:(BOOL)isReport;
|
重新播放
跳到指定时间播放
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| /** * @brief 播放器seek到位置,默认不精确seek * @param seconds 时间位置 */ - (void)seek:(double)seconds;
/** * @brief 播放器seek到位置 * @param seconds 时间位置 * @param accurate 是否精准(精准的话会影响性能,比如启播慢) */
- (void)seek:(double)seconds accurate:(BOOL)accurate; /** * @brief 播放器seek到位置,默认不精确seek * @param seconds 时间位置 * @param completionHandler block回调 */
- (void)seek:(double)seconds completionHandler:(void (^)(BOOL finished))completionHandler;
/** * @brief 播放器seek到位置 * @param seconds 时间位置 * @param accurate 是否精准(精准的话会影响性能,比如启播慢) * @param completionHandler block回调 */ - (void)seek:(double)seconds accurate:(BOOL)accurate completionHandler:(void (^)(BOOL finished))completionHandler;
|
进入全屏
1 2 3 4 5 6 7 8 9 10 11 12
| /** * @brief 播放器进入全屏 * @param direction 全屏转屏角度 */ - (void)enterFullScreenWithDirection:(SWANPlayerFullScreenDirection)direction;
/** * @brief 播放器进入全屏 * @param animated 动画 * @param completion block回调 */ - (void)enterFullScreenAnimated:(BOOL)animated completionHandler:(void(^)(void))completion;
|
退出全屏
1 2 3 4 5 6 7 8
| - (void)exitFullScreen;
/** * @brief 播放器退出全屏 * @param animated 动画 * @param completion block回调 */ - (void)exitFullScreenAnimated:(BOOL)animated completionHandler:(void(^)(void))completion;
|
播放器代理
播放器当前播放模式
1
| - (NSUInteger)currentPlayerMode;
|
发送弹幕信息
1
| - (void)sendDanmu:(NSDictionary *)barrage;
|
更新弹幕信息
1
| - (void)updateBarrageMeta:(NSDictionary *)barrageMeta;
|
外部更新弹幕信息
1
| - (void)updateBarrageList:(NSArray *)barrageList;
|
更新播放器的数据
1
| - (void)updateVideoInfo:(NSDictionary *)videoInfo;
|
当前播放状态
1
| - (int)currentPlayerStatus;
|
是否正在播放
1
| - (BOOL)currentIsPlaying;
|
是否全屏模式
1
| - (BOOL)currentIsFullMode;
|
更新播放器 frame
1
| - (void)updatePlayerFrame:(CGRect)frame ;
|
播放器父视图
亮度、音量、进度手势开关
1 2 3 4 5 6
| /**
亮度 音量,进度手势开关 @param enable YES 开启 */ - (void)setBrightnessVolumeAndProgressGestureEnabled:(BOOL)enable;
|
获取当前播放视频的进度
1
| - (CGFloat)currentPlayerTime;
|
获取当前正在播放 URL
1
| - (NSURL *)currentPlayingURL;
|
播放器的弹幕开关、弹幕信息、发送视图显示状态
1 2 3 4 5 6 7
| /** * @brief 播放器的弹幕开关、弹幕信息、发送视图显示状态 * @param showSwitch YES 显示弹幕开关按钮 * @param showDisplayer YES 显示弹幕信息视图 * @param showPublisher YES 显示弹幕发送视图 */ - (void)updateBarrageStateShowSwitch:(BOOL)showSwitch showDisplayer:(BOOL)showDisplayer showPublisher:(BOOL)showPublisher;
|
更新状态栏显示状态
1
| - (void)updateModelWithStatusBarShow:(BOOL)showStatusBar;
|
更新全屏转屏角度
1
| - (void)updateFullScreenDirection:(SWANPlayerFullScreenDirection)direction;
|
更新是否忽略系统转屏
1
| - (void)updateVideoIgnoreOrientation:(BOOL)ignoreOrientation;
|
添加视图组件
1 2 3 4 5 6 7
| /** 添加视图组件
@param component 视图组件 @param level 视图组件所处的层级 */ - (void)addComponent:(UIView *)component atLevel:(NSUInteger)level;
|
控制静音
1 2 3 4 5 6
| /** * @brief 控制静音 * * @param isMuted 是否静音 */ - (void)changeVideoPlayerMutedAndUtilMuted:(BOOL)isMuted;
|
更新控制层显示状态
1 2 3 4 5 6 7
| /** * @brief 根据屏幕样式更新控制层显示状态 * @param mode 屏幕样式 未定义:SWANPlayerModeNone = 0;全屏:SWANPlayerModeFull = 1;小窗:SWANPlayerModeMini = 2;自定义大小:SWANPlayerModeCustom = 3 */ - (void)updatePlayerControlWithMode:(SWANPlayerMode)mode; -
|
重载弹幕组件
1 2 3 4 5 6
| /** * @brief 重载弹幕组件 * */ - (void)reloadBarrage;
|
是否是活跃状态
1 2 3 4 5 6 7
| /** * @brief 是否是活跃状态 * * @return YES 是 */ - (BOOL)currentIsActive; -
|
1.3 播放回调事件
小程序 SDK 中在视频播放过程中,还需用到播放器的回调事件,通过 BBASMVideoHandleDelegate 委托宿主的播放器,将播放状态传递给前端。
play 事件
<span id=””event>
当视频开始播放时,宿主应该调用代理的此方法。
1 2
| // 当开始/继续播放时触发play事件回调 - (void)playerDidPlay:(NSString *)videoId;
|
play 成功事件
当视频播放成功时,宿主应该调用代理的此方法。
1 2
| // 播放器播放成功回调 - (void)playerDidPlaySuccess:(NSString *)videoId;
|
播放暂停事件
当视频暂停时候,宿主应该调用代理的此方法。
1 2
| // 当播放到末尾时触发 ended 事件回调 - (void)playerDidPause:(NSString *)videoId;
|
播放结束事件
当播放到末尾时,宿主应该调用代理此方法。
1 2
| // 当播放到末尾时触发 ended 事件回调 - (void)playerDidEnd:(NSString *)videoId;
|
播放器转屏
1 2 3 4 5
| // 播放器转屏回调 - (void)playerScreenChangeToNewMode:(SWANPlayerMode)newMode oldModel:(SWANPlayerMode)oldModel videoId:(NSString *)videoId frame:(CGRect)newFrame;
|
播放器更新进度
播放器更新进度后宿主需要调用此方法。
1 2 3 4
| //player更新播放进度 - (void)videoPlayerUpdateTimeProgress:(double)currentTime duration:(double)duration videoId:(NSString *)videoId;
|
弹幕开关状态更改回调
1
| - (void)playerBarrageBtnChange:(BOOL)barrageBtnEnabled videoId:(NSString *)videoId;
|
发送弹幕
宿主发送弹幕实现结束后,需要调用此方法。
1 2 3 4 5 6 7 8 9
| /** 全屏下播放器发送弹幕回调
@param content 输入的内容 @param playAtTime 发送的时间 */ - (void)playerSendBarrage:(NSString *)content playAtTime:(NSString *)playAtTime videoId:(NSString *)videoId;
|
小程序播放器是否安装弹幕组件
1 2 3
| ///小程序播放器是否安装弹幕组件 - (BOOL)playerShouldShowBarrageComponent:(SWANPlayerBarrageComponent)cmp withPlayerMode:(SWANPlayerMode)playerMode;
|
播放器弹幕是否需要根据视频播放进度从服务端动态拉取弹幕数据
1
| - (BOOL)isNeedUpdateBarrageListFromServer;
|
是否需要在点击发送按钮后清除草稿(无论弹幕发送成功与否)
1
| - (BOOL)isNeedClearDraftAfterSendClick;
|
播放器视图被添加到父视图
1
| - (void)playerViewDidAddedToSurperView:(UIView *)playerView vid:(NSString *)vid;
|
播放器视图从父视图里移除
1
| - (void)playerViewDidRemovedFromSurperView:(UIView *)playerView vid:(NSString *)vid;
|
播放器 delegate 将要改变
1
| - (void)playerDelegateWillChanged:(id<BBASMVideoHandleDelegate>)newDelegate vid:(NSString *)vid;
|
播放器 vid 将要改变
1
| - (void)playerVidWillChanged:(NSString *)oldVid;
|
全屏按钮点击是否由小程序框架控制
1
| - (BOOL)isPlayerCustomSwitchToFullScreenMode;
|
进入全屏事件
1 2
| - (void)playerCustomSwitchToFullScreenMode;
|
退出全屏事件
1
| - (void)playerExitCustomFullScreenMode;
|
播放器是否可以根据屏幕方向切换
1
| - (BOOL)playerShouldAutorotate;
|
1.4 示例
参考:BBASMVideoImplement