未优化短视频 | 优化后短视频 |
| |
// 如果您使用的是专业版本的SDK,则用:api 'com.tencent.liteav:LiteAVSDK_Professional:latest.release'api 'com.tencent.liteav:LiteAVSDK_Player:latest.release'implementation (name:'tuiplayercore-release_x.x.x', ext:'aar')implementation (name:'tuiplayershortvideo-release_x.x.x', ext:'aar')implementation 'androidx.appcompat:appcompat:1.0.0'implementation 'androidx.viewpager2:viewpager2:1.0.0'
tuiplayercore-release
和tuiplayershortvideo-release
中的x.x.x
为版本号,注意2个 aar 的版本号必须一致。<uses-permission android:name="android.permission.INTERNET" />
-keep class com.tencent.** { *; }
TUIPlayerConfig config = new TUIPlayerConfig.Builder().enableLog(true).licenseKey("Your license key").licenseUrl("Your license url").build();TUIPlayerCore.init(context, config);
<com.tencent.qcloud.tuiplayer.shortvideo.ui.view.TUIShortVideoViewandroid:id="@+id/my_video_view"android:layout_height="match_parent"android:layout_width="match_parent"/>
mSuperShortVideoView.setActivityLifecycle(getLifecycle());
mSuperShortVideoView.setListener(new TUIShortVideoListener() {@Overridepublic void onPageChanged(int index, TUIVideoSource videoSource) {if (index >= mSuperShortVideoView.getCurrentDataCount() - 1) {// append next page datamSuperShortVideoView.appendModels(data);}}@Override public void onCreateVodLayer(TUIVodLayerManager layerManger, int viewType) {// add your vod layer to here layerManger.addLayer(new TUICoverLayer()); } @Override public void onCreateLiveLayer(TUILiveLayerManager layerManager, int viewType) {// add your live layer to here }@Override public void onCreateCustomLayer(TUICustomLayerManager layerManager, int viewType) {// add your custom layer to here }@Overridepublic void onNetStatus(TUIVideoSource model, Bundle bundle) {}});
onPageChanged
方法,此处可以做类似分页加载的能力。onCreateVodLayer
、onCreateLiveLayer
或者onCreateCustomLayer
方法。onCreateVodLayer
,如果是 TUILiveSource 类型的,将会回调onCreateLiveLayer
,如果是继承 TUIPlaySource 实现的自定义数据类型,将会回调onCreateCustomLayer
。TUIPlayerSource
中的extViewType
回调到这里,用于业务根据 viewType 区分不同的 layer 组,layer 的创建会在自定义图层中讲到。setModels
可以设置数据,并清空掉原本的数据,视频也会从设置的数据源的第一个视频开始重新播放,使用 appendModels
可以追加数据,用于分页操作,当填充完数据之后,会自动从第一个视频开始播放,如果不需要自动播放,可以将第一个视频调用 setAutoPlay
设置为 false。// 点播 TUIVideoSource videoSource = new TUIVideoSource(); videoSource.setCoverPictureUrl(model.placeholderImage); // fileId填写,fileId和url只需要填写一个 videoSource.setAppId(model.appid); videoSource.setPSign(model.pSign); videoSource.setFileId(model.fileid); // url填写 videoSource.setVideoURL(model.videoURL); shortVideoData.add(videoSource); // 直播 TUILiveSource liveSource = new TUILiveSource(); // 直播资源url liveSource.setUrl(liveUrl); liveSource.setCoverPictureUrl(coverUrl); shortVideoData.add(liveSource); // 自定义,DemoImgSource继承自TUIPlaySource,自定义数据,此处可根据业务需求定制不同的数据 DemoImgSource imgSource = new DemoImgSource("imgUrl"); shortVideoData.add(imgSource);// 设置数据mSuperShortVideoView.setModels(shortVideoData);// 如果是分页操作,可选择追加数据mSuperShortVideoView.appendModels(shortVideoData);
TUIVodLayer
、TUILiveLayer
和TUICustomLayer
。可以按照需求来继承不同的 layer。不同的 layer 基类都针对其场景提供了符合场景的接口和回调。onBindData
绑定数据的时候,对界面UI进行重置或者重新设置新值。生命周期名称 | 含义 |
onBindData | 代表当前Layer已经绑定数据,可以在该生命周期中,做一些静态UI的数据初始化工作。 |
onControllerBind | 该页面已经是当前短视频列表正在展示的页面,除了自定义页面 TUICustomLayer 以外,此时调用getPlayer() 和 getController() 将不再为空,可以对播放器、页面容器进行操作。 |
onControllerUnBind | 页面被划走,该生命周期之后将无法再获得到播放器和 videoView,该生命周期可以做一些资源的回收、界面重置工作。 |
onViewRecycled | 页面被回收,会用到其他数据和播放器上,建议在该生命周期中重置界面所有数据,回收相关资源。 |
onShortVideoDestroyed | TUI 组件被销毁,即 TUIShortVideoView 被调用了release 方法。 |
@Overridepublic View createView(ViewGroup parent) {LayoutInflater inflater = LayoutInflater.from(parent.getContext());View view = inflater.inflate(R.layout.player_video_info_layer, parent, false);mSeekBar = view.findViewById(R.id.vsb_tui_video_progress);mTvProgress = view.findViewById(R.id.tv_tui_progress_time);mIvPause = view.findViewById(R.id.iv_tui_pause);mSeekBar.setListener(this);return view;}@Overridepublic String tag() {return "TUIVideoInfoLayer";}
@Overridepublic void onBindData(TUIVideoSource videoSource) {show();}
onCreateView
中赋值,随后在播放器事件,例如暂停按钮的显示和隐藏,以及播放进度的回调,参见如下代码。@Overridepublic void onPlayBegin() {super.onPlayBegin();if (null != mIvPause) {mIvPause.setVisibility(View.GONE);}}@Overridepublic void onPlayPause() {super.onPlayPause();if (null != mIvPause) {mIvPause.setVisibility(View.VISIBLE);}}@Overridepublic void onPlayProgress(long current, long duration, long playable) {videoDuration = duration;if (null != mSeekBar) {// ensure a refresh at every percentage pointint progressInt = (int) (((1.0F * current) / duration) * 100);if(lastProgressInt != progressInt) {setProgress(progressInt / 100F);lastProgressInt = progressInt;}}}
@Overridepublic void onDragDone(VideoSeekBar seekBar) {TUIPlayerController controller = getPlayerController();if (null != controller && videoDuration > 0) {controller.seekTo((int) ((videoDuration * seekBar.getBarProgress()) / 1000));}if (null != mTvProgress) {mTvProgress.setVisibility(View.GONE);}}
@Override public void onViewRecycled(TUIBaseVideoView videoView) { // release your resource }
onControllerBind
的时候,该 layer 被 controller 绑定,代表该 layer 的页面即将展示出来开始播放,当触发onControllerUnBind
的时候,controller 发生解绑,代表页面被划走。@Overridepublic void onControllerUnBind(TUIPlayerController controller) {super.onControllerUnBind(controller);show();}
onRecFileVideoInfo
将视频的信息回调出来,参见如下代码:@Overridepublic void onRecFileVideoInfo(TUIFileVideoInfo params) {if(isShowing()) {TUIBaseVideoView videoView = getVideoView();if (null != videoView && null != params) {String coverUrl = params.getCoverUrl();if (!TextUtils.isEmpty(coverUrl)) {ImageView imageView = getView();Glide.with(videoView).load(coverUrl).centerCrop().into(imageView);coverUrlFromServer = coverUrl;}}}}
@Overridepublic void onRcvFirstIframe() {hidden();}
mSuperShortVideoView.setListener(new TUIShortVideoListener() {// ......@Override public void onCreateVodLayer(TUIVodLayerManager layerManger, int viewType) { layerManger.addLayer(new TUIVideoInfoLayer(mShortVideoView, ShortVideoFragment.this)); layerManger.addLayer(new TUICoverLayer()); layerManger.addLayer(new TUILoadingLayer()); layerManger.addLayer(new TUIErrorLayer()); } @Override public void onCreateLiveLayer(TUILiveLayerManager layerManager, int viewType) { layerManager.addLayer(new TUILiveEntranceLayer(mShortVideoView, ShortVideoFragment.this)); layerManager.addLayer(new TUILiveLoadingLayer()); layerManager.addLayer(new TUILiveErrorLayer()); } @Override public void onCreateCustomLayer(TUICustomLayerManager layerManager, int viewType) { if (viewType == SVDemoConstants.CustomSourceType.SINGLE_IMG_TYPE) { layerManager.addLayer(new PicDisplayLayer()); } }});
viewType
为当前 page 的视频类型,如果你在TUIPlayerSource
中自定义了extViewType
,这里的viewType
将会是你定义的,如果没有定义,将会根据页面类型返回ITEM_TYPE_VOD
、ITEM_TYPE_LIVE
或者ITEM_TYPE_CUSTOM
。unBindLayerManager
方法。layerManger.removeLayer(layer);
layerManger.indexOfLayer(layer);
public class DemoImgSource extends TUIPlaySource { private String mImgUrl; public DemoImgSource(String imgUrl) { mImgUrl = imgUrl; // 你可以指定不同的viewType来区分自定义页面类型 setExtViewType(SVDemoConstants.CustomSourceType.SINGLE_IMG_TYPE); } public String getImgUrl() { return mImgUrl; } public void setImgUrl(String imgUrl) { this.mImgUrl = imgUrl; } }
TUICustomLayer
实现layer。public class PicDisplayLayer extends TUICustomLayer { private ImageView mDisplayImgView; @Override public View createView(ViewGroup parent) {// 创建页面view LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View view = inflater.inflate(R.layout.tuiplayer_img_display_layer, parent, false); mDisplayImgView = view.findViewById(R.id.iv_img_display); return view; } @Override public void onBindData(TUIPlaySource videoSource) { super.onBindData(videoSource);// 数据与页面发生绑定,可以拿到该页面对应的数据源 if (videoSource.getExtViewType() == SVDemoConstants.CustomSourceType.SINGLE_IMG_TYPE) { DemoImgSource source = (DemoImgSource) videoSource; Glide.with(mDisplayImgView).load(source.getImgUrl()) .into(mDisplayImgView); } } @Override public String tag() { return "PicDisplayLayer"; } }
mSuperShortVideoView.setListener(new TUIShortVideoListener() {// ......@Override public void onCreateCustomLayer(TUICustomLayerManager layerManager, int viewType) {// custom layer if (viewType == SVDemoConstants.CustomSourceType.SINGLE_IMG_TYPE) { layerManager.addLayer(new PicDisplayLayer()); } }});
// 自定义,DemoImgSource继承自TUIPlaySource,自定义数据,此处可根据业务需求定制不同的数据 DemoImgSource imgSource = new DemoImgSource("imgUrl"); shortVideoData.add(imgSource);// 设置数据mSuperShortVideoView.setModels(shortVideoData);
TUIPlayerConfig config = new TUIPlayerConfig.Builder().enableLog(true).licenseKey(LICENCE_KEY).licenseUrl(LICENCE_URL).build();TUIPlayerCore.init(getApplicationContext(), config);
mSuperShortVideoView.setActivityLifecycle(getLifecycle());
mSuperShortVideoView.setListener(new TUIShortVideoListener() {@Override public void onCreateVodLayer(TUIVodLayerManager layerManger, int viewType) { layerManger.addLayer(new TUIVideoInfoLayer(mShortVideoView, ShortVideoFragment.this)); layerManger.addLayer(new TUICoverLayer()); layerManger.addLayer(new TUILoadingLayer()); layerManger.addLayer(new TUIErrorLayer()); } @Override public void onCreateLiveLayer(TUILiveLayerManager layerManager, int viewType) { layerManager.addLayer(new TUILiveEntranceLayer(mShortVideoView, ShortVideoFragment.this)); layerManager.addLayer(new TUILiveLoadingLayer()); layerManager.addLayer(new TUILiveErrorLayer()); } @Override public void onCreateCustomLayer(TUICustomLayerManager layerManager, int viewType) { if (viewType == SVDemoConstants.CustomSourceType.SINGLE_IMG_TYPE) { layerManager.addLayer(new PicDisplayLayer()); } } @Override public void onPageChanged(int index, TUIPlaySource videoSource) { if (index >= mShortVideoView.getCurrentDataCount() - 1) { mShortViewRefresh.setRefreshing(true); ShortVideoModel.getInstance().loadMore(false); } } @Override public void onNetStatus(TUIPlaySource model, Bundle bundle) { }});
函数 | 描述 |
setPreloadCount | 设置预加载最大并发数量,默认3。 |
setPreDownloadSize | 设置预下载缓存大小,默认1MB,单位 MB。 |
setPreLoadBufferSize | 设置预播放缓存大小,默认0.5MB,单位 MB。 |
setMaxBufferSize | 设置播放时视频缓存大小,默认10MB,单位 MB。 |
setPreferredResolution | 设置视频播放的偏好分辨率,默认720 x 1280。 |
setProgressInterval | 播放进度回调间隔,默认500毫秒,单位毫秒。 |
setRenderMode | 渲染平铺模式,默认0。liteavPlayer 中,0代表全屏屏幕,1代表按照视频实际比例渲染,可能会有黑边。 |
setExtInfo | 设置额外信息。 |
setMediaType | 当提前知道播放的媒资类型时,可以通过该接口设置媒资类型,减少播放器 SDK 内部播放类型探测,提升启播速度。 |
enableAutoBitrate | 设置是否启用码率自适应。 |
setResumeMode | 设置续播模式,分为三种模式: TUIConstants.TUIResumeMode.NONE:不续播。 TUIConstants.TUIResumeMode.RESUME_LAST:续播最近一次播放。 TUIConstants.TUIResumeMode.RESUME_PLAYED:续播所有播放过的视频。 |
setDisplayViewFactory | 设置自定义视频图层,可通过实现 IDisplayViewFactory 来自定义视频图层 |
setEnableAccurateSeek | 设置是否开启精准 seek,开启精准 seek 之后,seek 的精准度会大幅提升,但是 seek 会有耗时,关闭之后,实际的seek 时间可能跟预期的有差距,差距根据视频的关键帧分布而定,但是 seek 耗时会变短。 |
setAudioNormalization | 设置音量均衡,响度范围:-70~0 (LUFS),同时支持自定义数值。注意:播放器高级版 11.7 版本开始支持。 可填预设值,相关常量类 TXVodConstants,
关:AUDIO_NORMALIZATION_OFF
开: AUDIO_NORMALIZATION_STANDARD(标准) AUDIO_NORMALIZATION_LOW (低) AUDIO_NORMALIZATION_HIGH(高) |
setIsRetainPreVod | 是否保留上一个播放器,以加快上一个播放器的起播速度 |
setRetryCount | 设置弱网下的点播重试次数,设置为 0 则不进行重试 |
mSuperShortVideoView.setModels(shortVideoBeanList);
mSuperShortVideoView.appendModels(shortVideoBeanList);
参数/函数 | 参数类型 | 描述 |
setVideoURL | String | 视频链接,建议填充该字段,会加快预加载速度。 |
setCoverPictureUrl | String | 视频封面,会回调到 layer,由客户自行处理。 |
setAppId | int | 视频 appId。 |
setFileId | String | 视频 fileId。 |
setPSign | String | 视频加密 pSign。 |
setExtViewType | int | 自定义页面类型,该值会通过 Layer 创建回调的第二个参数回调出来,供业务区分不同类型的页面。 |
setExtInfoAndNotify | Object | 用于业务自行扩展额外参数,使用该方法可以实时向界面已存在的 layer 进行消息通知。该方法必须通过 TUIDataManager 获取到之后的 Source 调用才会有效。 |
setVideoConfig | TUIPlayerVideoConfig | 视频独立配置。 |
setExternalSubtitle | List<TUISubtitleSource> | 设置外挂字幕,会自行加载到点播播放器中,必须要播放器高级版支持。 |
setAutoPlay | boolean | 设置该视频是否自动播放 |
参数 | 类型 | 描述 |
setPreloadBufferSizeInMB | float | 设置视频单独的预播放缓存大小,可选。 |
setPreferredResolution | long | 设置视频单独的起播和预加载分辨率,可选。 |
setPreDownloadSize | float | 设置视频单独的预下载缓存大小,可选。 |
参数/函数 | 参数类型 | 描述 |
setUrl | String | 直播链接 |
setCoverPictureUrl | String | 封面,会回调到 layer,由客户自行处理。 |
setExtViewType | int | 自定义页面类型,该值会通过 Layer 创建回调的第二个参数回调出来,供业务区分不同类型的页面。 |
setExtInfoAndNotify | Object | 用于业务自行扩展额外参数,使用该方法可以实时向界面已存在的 layer 进行消息通知。该方法必须通过 TUIDataManager 获取到之后的 Source 调用才会有效。 |
setLiveConfig | TUIPlayerLiveConfig | 独立配置。 |
setAutoPlay | boolean | 设置是否自动播放,直播设置改字段为 false 时,一开始会没有画面,需要使用封面图遮盖 |
参数 | 类型 | 描述 |
setCacheMinTime | float | 缓存自动调整的最小时间,取值需要大于0。【默认值】:1。 |
setCacheMaxTime | float | 缓存自动调整的最大时间,取值需要大于0。【默认值】:5 |
参数/函数 | 参数类型 | 描述 |
setExtViewType | int | 自定义页面类型,该值会通过 Layer 创建回调的第二个参数回调出来,供业务区分不同类型的页面。 |
setExtInfoAndNotify | Object | 用于业务自行扩展额外参数,使用该方法可以实时向界面已存在的 layer 进行消息通知。该方法必须通过 TUIDataManager 获取到之后的 Source 调用才会有效。 |
TUIShortVideoView
的 getDataManager()
方法获取数据操作对象,如下所示:// 获取数据操作对象 TUIShortVideoDataManager dataManager = mSuperShortVideoView.getDataManager();
函数名称 | 返回参数 | 传入参数 | 描述 |
removeData | void | index:需要移除的页面位置 | 移除对应的页面和数据 |
removeRangeData | void | index:需要移除页面的起始位置 count:从起始位置开始要移除的数量,不包括 count 的最后一位 | 移除一个范围的页面和数据 |
removeDataByIndex | void | removeIndexList:需要移除的页面的位置集合 | 按照传入的索引,移除索引集合内所有的页面和数据 |
addData | void | source:需要插入的数据 index:插入数据的位置 | 根据插入数据的位置,将传入的数据插入到指定位置 |
addRangeData | void | sources:需要插入的数据集合 startIndex:插入数据的起始位置 | 根据传入的起始位置,将数据集合插入到指定位置 |
replaceData | void | source:需要替换的数据 index:需要被替换的位置 | 根据传入的位置,把指定位置的数据替换为传入的数据 |
replaceRangeData | void | sources:需要替换的数据集合 startIndex:替换的起始位置 | 根据传入的起始位置,将传入的数据集合替换到指定位置 |
getDataByPageIndex | TUIVideoSource | index:页面位置 | 根据传入的位置,获得指定位置的页面数据 |
getCurrentDataCount | int | - | 获得当前列表所有数据的总数 |
getCurrentIndex | int | - | 获得当前正在显示页面的位置 |
getCurrentModel | TUIVideoSource | - | 获得当前正在显示页面的数据 |
mSuperShortVideoView.getCurrentModel()
mSuperShortVideoView.pause()
// index 为指定的页面位置mSuperShortVideoView.startPlayIndex(index);// index 为需要前往的位置,true 为需要平滑切换,默认为false mSuperShortVideoView.startPlayIndex(index, true);
TUIVideoConst.ListPlayMode.MODE_LIST_LOOP
,当前视频播放完毕之后会自动播放下一个,播放到最后一个之后,会自动回到首个视频继续播放。以及单个视频循环播放 TUIVideoConst.ListPlayMode.MODE_ONE_LOOP
,会一直重复播放当前视频直到用户手动去滑动翻页,也可以设置为 TUIVideoConst.ListPlayMode.MODE_CUSTOM
由业务接管播放逻辑。当不设置的时候,默认为MODE_ONE_LOOP
,设置方式如下:// set to MODE_ONE_LOOP mSuperShortVideoView.setPlayMode(TUIVideoConst.ListPlayMode.MODE_ONE_LOOP);
mSuperShortVideoView.release()
mSuperShortVideoView.resume()
mSuperShortVideoView.switchResolution(720 * 1080, TUIConstants.TUIResolutionType.CURRENT);
TUIResolutionType
以外,也可以直接指定需要切换的视频的 index 来切换视频分辨率。参数 | 描述 |
GLOBAL | 设置全局分辨率 |
CURRENT | 设置当前视频分辨率 |
其他大于等于0的值 | 设置指定位置的分辨率 |
// pause all preloadmSuperShortVideoView.pausePreload();// start preload from current video indexmSuperShortVideoView.resumePreload();
参数 | 类型 | 描述 |
layerManger | TUIVodLayerManager、 TUILiveLayerManager 和 TUICustomLayerManager | 图层管理对象 |
viewType | int | 当前视频播放类型 TUIVideoConst.ItemType.ITEM_TYPE_VOD:点播 TUIVideoConst.ItemType.ITEM_TYPE_LIVE:直播 TUIVideoConst.ItemType.ITEM_TYPE_CUSTOM:自定义界面 其他由PlayerSource传入的自定义类型 |
layerManger.addLayer(new TUICoverLayer());layerManger.addLayer(new TUIVideoInfoLayer());layerManger.addLayer(new TUILoadingLayer());layerManger.addLayer(new TUIErrorLayer());
layerManger.removeLayer(layer);
layerManger.removeAllLayer();
layerManger.indexOfLayer(layer);
TUIShortVideoView
的 setPageScroller
方法来实现,示例如下:mSuperShortVideoView.setPageScroller(new LinearSmoothScroller(getContext()){ @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { // 返回滑行每一个像素所用的时间,单位:毫秒 return 25f/displayMetrics.densityDpi; } });
TUIShortVideoView
的 setUserInputEnabled
方法来禁止或者允许列表滑动。示例如下:// false 禁止用户滑动 mSuperShortVideoView.setUserInputEnabled(false);
ITUILayer
回调、播放器事件通知,以及来自 videoView 的组件事件,继承 TUIVodLayer
、TUILiveLayer
和 TUICustomLayer
后,可以根据功能需要来接收视频播放的回调,目前回调函数如下:函数 | 返回类型 | 参数 | 描述 |
isShowing | boolean | - | 当前图层是否正在显示。 |
createView | View | parent:图层容器 | 抽象方法,需要自己实现,用于创建图层的 View。 |
tag | String | - | 图层的 tag,用于区分不同的图层。 |
unBindLayerManager | void | - | 图层与管理器发生解绑,一般发生在图层被移除的时候。 |
show | void | - | 显示当前图层。 |
hidden | void | - | 隐藏当前图层。 |
getView | T extends View | - | 获得当前图层的 View。 |
getVideoView | TUIBaseVideoView | - | 获得当前 VideoView,如果 layerManager 与 VideoView 还未绑定会返回空。 |
getPlayerController | TUIPlayerController | - | 获得当前播放 Controller,如果还未与 Controller 发生绑定,会返回空。 |
getPlayer | ITUIVodPlayer | - | 获得当前播放器,如果还未与 Controller 发生绑定,会返回空。 |
getRenderMode | int | - | 获得当前播放器画面渲染填充模式。 |
onControllerBind | void | controller:当前视频播放控制器 | 当前 VideoView 与播放控制器发生绑定,即当前视频变为列表中正在播放的视频。 |
onControllerUnBind | void | controller:当前视频播放控制器 | VideoView 与播放控制器发生解绑,一般代表该 page 滑出界面。 |
onBindData | void | videoSource:视频数据 | 当前 VideoView 绑定了视频数据。 |
onViewRecycled | void | videoView: 当前播放器 view 容器 | 当前 videoView 被回收。 |
onExtInfoChanged | void | videoSource: 变化后的视频源 | 当通过 TUIPlaySource 设置 extInfo 之后,layer 中将通过该回调进行事件通知。 |
onShortVideoDestroyed | void | - | 当整个短视频组件被销毁,会通过该回调通知到 layer中,供 layer 释放资源。 |
函数 | 返回类型 | 参数 | 描述 |
isShowing | boolean | - | 当前图层是否正在显示。 |
createView | View | parent:图层容器 | 抽象方法,需要自己实现,用于创建图层的 View。 |
tag | String | - | 图层的 tag,用于区分不同的图层。 |
unBindLayerManager | void | - | 图层与管理器发生解绑,一般发生在图层被移除的时候。 |
show | void | - | 显示当前图层。 |
hidden | void | - | 隐藏当前图层。 |
getView | T extends View | - | 获得当前图层的 View。 |
getVideoView | TUIBaseVideoView | - | 获得当前 VideoView,如果 layerManager 与 VideoView 还未绑定会返回空。 |
getPlayerController | TUIPlayerController | - | 获得当前播放 Controller,如果还未与 Controller 发生绑定,会返回空。 |
getPlayer | ITUILivePlayer | - | 获得当前播放器,如果还未与 Controller 发生绑定,会返回空。 |
getRenderMode | int | - | 获得当前播放器画面渲染填充模式。 |
onControllerBind | void | controller:当前视频播放控制器 | 当前 VideoView 与播放控制器发生绑定,即当前视频变为列表中正在播放的视频。 |
onControllerUnBind | void | controller:当前视频播放控制器 | VideoView 与播放控制器发生解绑,一般代表该 page 滑出界面。 |
onBindData | void | videoSource:直播数据 | 当前 VideoView 绑定了视频数据。 |
onViewRecycled | void | videoView: 当前播放器 view 容器 | 当前 videoView 被回收。 |
onExtInfoChanged | void | source: 变化后的数据 | 当通过 TUIPlaySource 设置 extInfo 之后,layer 中将通过该回调进行事件通知 |
onShortVideoDestroyed | void | - | 当整个短视频组件被销毁,会通过该回调通知到 layer 中,供 layer 释放资源 |
函数 | 返回类型 | 参数 | 描述 |
isShowing | boolean | - | 当前图层是否正在显示。 |
createView | View | parent:图层容器 | 抽象方法,需要自己实现,用于创建图层的 View。 |
tag | String | - | 图层的 tag,用于区分不同的图层。 |
unBindLayerManager | void | - | 图层与管理器发生解绑,一般发生在图层被移除的时候。 |
show | void | - | 显示当前图层。 |
hidden | void | - | 隐藏当前图层。 |
getView | T extends View | - | 获得当前图层的 View。 |
onControllerBind | void | - | 当前 VideoView 与播放控制器发生绑定,即当前视频变为列表中正在显示。 |
onControllerUnBind | void | - | VideoView 与播放控制器发生解绑,一般代表该 page 滑出界面。 |
onBindData | void | videoSource:数据 | 当前 VideoView 绑定了视频数据。 |
onViewRecycled | void | videoView: 当前view 容器 | 当前 videoView 被回收。 |
onExtInfoChanged | void | source: 变化后的数据 | 当通过 TUIPlaySource 设置 extInfo 之后,layer 中将通过该回调进行事件通知 |
onShortVideoDestroyed | void | - | 当整个短视频组件被销毁,会通过该回调通知到 laye r中,供 layer 释放资源 |
函数 | 返回类型 | 参数 | 描述 |
onPlayPrepare | void | - | 视频准备完毕 |
onPlayBegin | void | - | 视频开始播放 |
onPlayPause | void | - | 视频暂停 |
onPlayStop | void | - | 视频停止 |
onPlayLoading | void | - | 视频开始加载 |
onPlayLoadingEnd | void | - | 视频加载结束 |
onPlayProgress | void | current:当前视频播放进度,单位毫秒,long 类型。 duration:当前视频总时长,单位毫秒,long 类型。 playable:当前视频可播放时长,单位毫秒,long 类型 | 视频播放进度 |
onSeek | void | position:跳转到的视频进度。单位秒,int 类型。 | 视频进度发生跳转 |
onError | void | code:视频错误码 message:错误描述 | 视频播放发生错误 |
onRcvFirstIframe | void | - | 收到首帧事件 |
onRcvTrackInformation | void | infoList:视频轨道 | 收到视频轨道信息 |
onRcvSubTitleTrackInformation | void | infoList:视频字幕信息 | 收到视频字幕信息 |
onRecFileVideoInfo | void | params:视频文件信息 | 收到视频文件信息,一般只使用 fileId 播放才会触发该回调。 |
onResolutionChanged | void | width:视频宽度 height:视频高度 | 当前视频分辨率发生变化 |
onPlayEvent | void | player:播放器 event:事件id bundle:事件内容 | 播放器所有事件通知 |
onPlayEnd | void | - | 当前视频播放结束 |
函数 | 参数 | 描述 |
onError | player: 当前直播播放器 code:错误码 msg:错误信息 extraInfo:附加消息 | 播放发生错误 |
onWarning | player: 当前直播播放器
code:错误码
msg:警告信息
extraInfo:附加消息 | 播放器发生警告 |
onVideoResolutionChanged | player: 当前直播播放器
width: 视频宽度 height: 视频高度 | 播放器分辨率发生变化 |
onConnected | player: 当前直播播放器 extraInfo: 附加信息 | 数据流连接成功 |
onVideoPlaying | player: 当前直播播放器
firstPlay: 是否是首次播放,可以用来判断首帧 extraInfo: 附加信息 | 视频开始播放 |
onAudioPlaying | player: 当前直播播放器
firstPlay: 是否是首次播放
extraInfo: 附加信息 | 音频开始播放 |
onVideoLoading | player: 当前直播播放器
extraInfo: 附加信息 | 视频开始加载 |
onAudioLoading | player: 当前直播播放器
extraInfo: 附加信息 | 音频开始加载 |
onPlayoutVolumeUpdate | player: 当前直播播放器
volume: 变化后的音量 | 播放器音量大小回调 |
onStatisticsUpdate | player: 当前直播播放器
statistics: 数据详情 | 直播播放器统计数据回调 |
onSnapshotComplete | player: 当前直播播放器
image: 截图的图片 | 截图回调 |
onRenderVideoFrame | player: 当前直播播放器
videoFrame: 图像帧 | 自定义视频渲染回调,调用enableObserveVideoFrame后开启回调 |
onPlayoutAudioFrame | player: 当前直播播放器
audioFrame: 音频帧 | 自定义音频数据回调,调用enableObserveAudioFrame开启回调 |
onReceiveSeiMessage | player: 当前直播播放器
payloadType: 回调数据的SEI payloadType。 data:数据 | 收到 SEI 消息的回调,发送端通过 V2TXLivePusher中的sendSeiMessage来发送 SEI 消息 |
onStreamSwitched | player: 当前直播播放器
url: 切换的url code:状态码,0:成功,-1:切换超时,-2:切换失败,服务端错误,-3:切换失败,客户端错误。 | 分辨率无缝切换回调 |
onLocalRecordBegin | player: 当前直播播放器 code: 状态码。
0:录制任务启动成功。
-1:内部错误导致录制任务启动失败。
-2:文件后缀名有误(比如不支持的录制格式)。
-6:录制已经启动,需要先停止录制。
-7:录制文件已存在,需要先删除文件。
-8:录制目录无写入权限,请检查目录权限问题。 storagePath: 录制的文件地址。 | 录制任务开始的事件回调 |
onLocalRecording | player: 当前直播播放器 durationMs: 录制时长 storagePath: 录制的文件地址。 | 录制任务正在进行中的进展事件回调 |
onLocalRecordComplete | player: 当前直播播放器 code: 状态码。
0:结束录制任务成功。
-1:录制失败。
-2:切换分辨率或横竖屏导致录制结束。
-3:录制时间太短,或未采集到任何视频或音频数据,请检查录制时长,或是否已开启音、视频采集。 storagePath: 录制的文件地址。 | 录制任务已经结束的事件回调 |
getPlayer
获得播放器对象,播放器 ITUIVodPlayer 和 ITUILivePlayer 的接口函数如下:函数 | 返回类型 | 参数 | 描述 |
prePlay | void | model:视频数据,类型 TUIVideoSource | 对视频进行预播放,内部会有判重机制。 |
resumePlay | void | - | 继续播放当前视频。 |
seekTo | void | time:需要跳转的时间点,单位秒,int 类型。 | 跳转到指定播放位置。 |
isPlaying | boolean | - | 当前视频是否正在播放。 |
startPlay | void | model:视频数据,类型 TUIVideoSource。 | 播放视频 |
pause | void | - | 暂停播放 |
stop | void | needClearLastImg:可选参数,是否清除当前画面 | 停止播放 |
getCurrentPlayTime | float | - | 获得当前播放时间,单位:秒。 |
setDisplayView | void | videoView:视频渲染 View,类型TUIVideoRenderView。 | 设置播放器要渲染的 View。 |
setSurface | void | surface:画布 | 设置视频要渲染的 surface。 |
addPlayerObserver | void | observer:播放器监听,类型 PlayerObserver。 | 设置播放器监听。 |
removePlayerObserver | void | observer:播放器监听,类型 PlayerObserver。 | 移除播放器监听。 |
setConfig | void | config:视频配置,类型 TXVodPlayConfig。 | 设置视频配置。 |
setRenderMode | void | renderMode:渲染模式, FULL_FILL_SCREEN:保持宽高比且铺满 ADJUST_RESOLUTION:保持宽高比展示视频 | 设置平铺模式。 |
setStartTime | void | startTime:开始播放时间,单位:秒。float 类型 | 设置开始播放时间,在播放前调用有效,只会生效一次。循环播放后会从头开始。 |
setLoop | void | isLoop:是否循环 | 设置视频是否循环播放 |
setBitrateIndex | void | index:码率角标 | 设置当前码率 |
switchResolution | void | resolution:分辨率,即宽 × 高 | 设置改播放器的分辨率,如果有对应分辨率就会进行切换,仅对本次播放生效 |
getSupportResolution | List<TUIPlayerBitrateItem> | - | 获取当前正在播放视频的分辨率列表 |
getBitrateIndex | int | - | 获取当前正在播放视频的码率角标 |
setRate | void | rate:视频速率,正常速率为1.0 | 设置当前播放器播放速率 |
getCurrentPlaybackTime | float | - | 获取当前播放器已播放时间,单位 秒 |
getBufferDuration | float | - | 获取当前视频已经缓冲的时间,单位 秒 |
getDuration | float | - | 获取当前视频的总时长,单位 秒 |
getPlayableDuration | float | - | 获取当前视频可播放的事件,单位 秒 |
getWidth | int | - | 获取当前正在播放视频的宽度 |
getHeight | int | - | 获取当前正在播放视频的高度 |
setRenderRotation | void | rotation:角度 | 设置当前视频旋转角度 |
enableHardwareDecode | boolean | enable:是否开启硬解 | 设置当前播放器是否开启硬解 |
setMute | void | mute:是否静音 | 设置当前播放视频是否静音 |
setAudioPlayoutVolume | void | volume:视频音量,0到100 | 设置当前视频的输出音量 |
setRequestAudioFocus | boolean | requestFocus:是否获取音频焦点 | 设置当前播放器是否获取音频焦点 |
snapshot | void | listener:TXLivePlayer.ITXSnapshotListener类型,截图回调 | 对当前播放器正在播放的视频进行截图 |
setMirror | void | mirror:是否镜像 | 设置当前视频是否镜像播放 |
setToken | void | token:加密 HLS 的 token | 设置加密 HLS 的 token |
isLoop | boolean | - | 当前播放器是否是循环播放 |
attachTRTC | void | trtcCloud:trtc服务对象 | |
detachTRTC | void | - | 点播解绑 TRTC 服务。 |
setStringOption | void | key:业务参数键值 value:业务参数值 | 设置播放器业务参数 |
setSubtitleView | void | subtitleView:字幕组件 | 设置视频字幕的组件 |
addSubtitleSource | void | url:字幕链接 name:字幕名称 mimeType:字幕格式 | 向视频添加字幕源 |
selectTrack | void | trackIndex:音视频轨道 | 添加选择音视频轨道,目前常用于多音轨、字幕的选择 |
deselectTrack | void | trackIndex:音视频轨道 | 移除选择音视频轨道 |
setAudioNormalization | void | value: 响度范围:-70~0 (LUFS),同时支持自定义数值。注意:播放器高级版 11.7 版本开始支持。可填预设值,相关常量TXVodConstants,
关: AUDIO_NORMALIZATION_OFF
开: AUDIO_NORMALIZATION_STANDARD(标准)
AUDIO_NORMALIZATION_LOW (低)
AUDIO_NORMALIZATION_HIGH(高) | 设置音量均衡 |
setSubtitleStyle | void | renderModel: 字幕格式 | 设置字幕格式 |
getSubtitleTrackInfo | List<TXTrackInfo> | - | 获取导入的字幕轨道信息,prepare 事件之后调用才有效 |
getAudioTrackInfo | List<TXTrackInfo> | - | 获取导入的音频轨道信息,prepare 事件之后调用才有效 |
函数 | 返回类型 | 描述 |
getIndex | int | 当前分辨率的码率角标 |
getWidth | int | 当前分辨率的视频宽度 |
getHeight | int | 当前分辨率的视频高度 |
getBitrate | int | 当前分辨率的视频码率 |
函数 | 返回类型 | 参数 | 描述 |
prePlay | void | model:视频数据,类型 TUILiveSource | 对直播进行预播放,内部会有判重机制。 |
resumePlay | void | - | 继续播放当前视频。 |
setConfig | void | config:直播配置 | 设置播放器配置 |
addLiveObserver | void | observer: 直播事件观察者 | 订阅直播事件 |
removeLiveObserver | void | observer: 直播事件观察者 | 移除直播事件订阅 |
switchStream | int | model:需要切换的数据源 | 切换当前直播源的其他分辨率流,返回0代表成功 |
setRenderRotation | int | rotation:旋转方向 | 设置当前画面旋转方向 |
setPlayoutVolume | int | volume:音量大小,取值范围0 - 100。【默认值】: 100 | 设置当前音量大小 |
getStreamList | ArrayList<V2TXLiveDef.V2TXLiveStreamInfo> | - | 获取当前码流信息 |
enableVolumeEvaluation | int | value:决定了 onPlayoutVolumeUpdate 回调的触发间隔,单位为ms,最小间隔为100ms,如果小于等于0则会关闭回调,建议设置为300ms;【默认值】:0,不开启 | 启用播放音量大小提示 |
snapshot | int | - | 截取播放过程中的视频画面。
返回值:V2TXLiveCode。
V2TXLIVE_OK:成功。
V2TXLIVE_ERROR_REFUSED:播放器处于停止状态,不允许调用截图操作。 |
enableReceiveSeiMessage | int | enable: true: 开启接收 SEI 消息; false: 关闭接收 SEI 消息。【默认值】: false。 payloadType: 指定接收 SEI 消息的 payloadType,支持 5、242,请与发送端的 payloadType 保持一致。 | 开启接收 SEI 消息 |
showDebugView | void | isShow: 是否显示。【默认值】:false。 | 是否显示播放器状态信息的调试浮层 |
setProperty | int | key: 高级 API 对应的 key。 value: 调用 key 所对应的高级 API 时,需要的参数。 | 调用 V2TXLivePlayer 的高级 API 接口 |
startLocalRecording | int | params:本地录制音视频配置 | 开始录制音视频流。 返回值 V2TXLiveCode。
V2TXLIVE_OK:成功。
V2TXLIVE_ERROR_INVALID_PARAMETER:参数不合法,比如 filePath 为空。
V2TXLIVE_ERROR_REFUSED:API被拒绝,拉流尚未开始。 |
stopLocalRecording | void | - | 停止录制音视频流。当停止拉流后,如果视频还在录制中,SDK 内部会自动结束录制。 |
mShortVideoView.setItemAnimator(new DefaultItemAnimator());
TUIPreloadApi.getInstance().addObserver(new TUIPreloadObserver() { @Override public void onVodPreloadStatusChanged(TUIVideoSource vodSource, int state, long resolution) { } });
TUIConstants#TUIPreLoadState
。// get data controller TUIShortVideoDataManager dataManager = mSuperShortVideoView.getDataManager(); // get dataSource TUIPlaySource videoSource = dataManager.getDataByPageIndex(0); Map<String, String> data = new HashMap<>(); data.put("key1", "data1"); // set extInfo and notify to layer videoSource.setExtInfoAndNotify(data);
onExtInfoChanged
回调中会受到该通知,从而对当前页面进行 UI 修改,示例如下:@Override public void onExtInfoChanged(TUIVideoSource videoSource) { super.onExtInfoChanged(videoSource); Map<String, String> data = (Map<String, String>) videoSource.extInfo; Log.i("tag", "get data:" + data); }
onExtInfoChanged
只会在 onBindData
绑定数据之后才会触发。/* * 支持自定义数值,响度范围:-70~0(LUFS) * 预设值 关:TXVodConstants#AUDIO_NORMALIZATION_OFF * 开(低):TXVodConstants#AUDIO_NORMALIZATION_LOW * 开(标准):TXVodConstants#AUDIO_NORMALIZATION_STANDARD * 开(高):TXVodConstants#AUDIO_NORMALIZATION_HIGH */ TUIPlayerVodStrategy vodStrategy = new TUIPlayerVodStrategy.Builder() .setAudioNormalization(TXVodConstants.AUDIO_NORMALIZATION_STANDARD) .build(); mShortVideoView.setVodStrategy(vodStrategy);
computeVerticalScrollOffset
:当前垂直滚动的偏移量(像素)。computeVerticalScrollRange
:RecyclerView 的垂直滚动范围(总高度,像素)。computeVerticalScrollExtent
:当前滚动视图中可见项的总高度(像素)。computeVerticalScrollOffset
方法如果小于等于 0,则代表滑动到最顶部,此时可将触摸事件传递给外层布局来进行下拉刷新。computeVerticalScrollExtent
加上已经划过的距离 computeVerticalScrollOffset
之和,如果大于等于 computeVerticalScrollRange
总高度来判断是否滑动到最底部,代码如下:int verticalScrollOffset = recyclerView.computeVerticalScrollOffset();int verticalScrollRange = recyclerView.computeVerticalScrollRange();int verticalScrollExtent = recyclerView.computeVerticalScrollExtent();boolean isAtBottom = verticalScrollOffset + verticalScrollExtent >= verticalScrollRange;
本页内容是否解决了您的问题?