开发

视频

1.1 协议名

BBASMVideoAdapterProtocol

功能说明

小程序 SDK 内部基于播放器严重依赖宿主播放器(准确来说播放内核 ffmpeg),没有提供具体播放器的实现,只提供了调用播放相关接口以及委托事件,这样以来,宿主方需按照定义的接口进行实现、委托处理相关事件。

  • 智能小程序提供了视频播放能力,通过实现 video 抽象接口就可以轻松让您的小程序拥有定制化的视频播放器,让小程序的的产品体验及产品功能更加完善。
  • 开发者通过 swan.createVideoContext 来创建一个播放器实例,后续有关播放器的操作均在此对象上完成。

1.2 接口列表

协议介绍

BBASMVideoAdapterProtocol 为多实例播放器协议。

接入方法

  • 遵循 BBASMVideoAdapterProtocol 协议,实现相关接口。
  • 在相应时机调用 BBASMVideoHandleDelegate 代理方法。
接口 接口 接口 接口 接口 接口
播放视频 开始播放 暂停播放 继续播放 停止播放 重新播放
跳到指定时间播放 进入全屏 退出全屏 播放器代理 播放器当前播放模式 发送弹幕信息
更新弹幕信息 外部更新弹幕信息 更新播放器的数据 当前播放状态 是否正在播放 是否全屏模式
更新播放器 frame 播放器父视图 亮度、音量、进度手势开关 获取当前播放视频的进度 获取当前正在播放 URL 播放器的弹幕开关、弹幕信息、发送视图显示状态
更新状态栏显示状态 更新全屏转屏角度 更新是否忽略系统转屏 添加视图组件 控制静音 更新控制层显示状态
重载弹幕组件 是否是活跃状态

播放视频

  • 播放视频基本能力的接口。
  • 小程序框架会提供父视图让宿主 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
- (void)startPlay;

暂停播放


1
+ (void)pause;

继续播放


1
- (void)resume;

停止播放


1
2
3
4
5
6
7
8
9
/**
* @brief 停止播放器,内核释放 (destroy) - 默认不向外部发送停止声音事件
*/
- (void)stop;
/**
* @brief 停止播放器,内核释放 (destroy)
* @param isReport 是否向外部app发送停止声音事件
*/
- (void)stopPlayerReportDeactiveAudioSession:(BOOL)isReport;

重新播放


1
+ (void)replay;

跳到指定时间播放


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
- (id)delegate;

播放器当前播放模式


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
- (UIView *)replayView;

亮度、音量、进度手势开关

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 事件 play 成功事件 播放暂停事件 播放结束事件 播放器转屏 播放器更新进度
弹幕开关状态更改回调 发送弹幕 小程序播放器是否安装弹幕组件 播放器弹幕是否需要根据视频播放进度从服务端动态拉取弹幕数据 是否需要在点击发送按钮后清除草稿(无论弹幕发送成功与否) 播放器视图被添加到父视图
播放器视图从父视图里移除 播放器 delegate 将要改变 播放器 vid 将要改变 全屏按钮点击是否由小程序框架控制 进入全屏事件 退出全屏事件

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