Android端播放器SDK进阶功能使用示例

您所在的位置:网站首页 索爱s138播放器使用说明视频 Android端播放器SDK进阶功能使用示例

Android端播放器SDK进阶功能使用示例

2024-07-10 03:48| 来源: 网络整理| 查看: 265

修改渲染View。

低版本的Android播放器SDK全局使用一个渲染View,在每次切换播放源时,先从布局中remove前一个View,再添加下一个View到当前界面上。从5.5.2.0版本开始,支持使用多个渲染View,在RecyclerView.ViewHolder的布局中添加多个View,在切换播放源时,可以预加载下一个播放源,以提升切换的顺畅度。您需要删除低版本的渲染View的代码,并添加新版本添加多个渲染View的代码,示例代码如下:

展开查看代码

/* 删除如下代码 如下几行代码为低版本添加渲染View的代码。会将渲染View添加到FrameLayout中,然后在切换播放源时,会将mPlayerViewContainer移除、添加。 */ private void initPlayer() { //... mPlayerViewContainer = View.inflate(getContext(), R.layout.layout_player_view, null); FrameLayout frameLayout = mPlayerViewContainer.findViewById(R.id.framelayout); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); View renderView = createRenderView(Common.RENDER_VIEW_NAME); frameLayout.addView(renderView, 0, params); //... } /* 添加或修改如下代码以添加多个渲染View 修改RecyclerView的item布局,以及对应的ViewHolder */ public final class MyHolder extends RecyclerView.ViewHolder { //... private Surface mSurface; MyHolder(@NonNull View itemView) { super(itemView); //... TextureView mTextureView = itemView.findViewById(R.id.texture_view); mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { mSurface = new Surface(surface); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { mSurface = null; return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) {} }); } //... //对外呈现获取Surface的接口 public Surface getSurface() { return mSurface; } }

修改RecyclerView中的item布局的示例代码如下:

展开查看代码

修改切换播放源的逻辑。

从Android播放器SDK 5.5.2.0版本开始,在调用moveToNext时,会增加对preRenderPlayer的调用,因此需要单独对渲染View(Surface)进行设置。其中,moveToNext、moveToPre、moveTo的逻辑有所差异。示例代码如下:

展开查看代码

/* 说明:mQuickPlayer是AlivcQuickPlayer类的实例对象,封装了ListPlayer的接口。 */ private void startPlay(int position, boolean isInitComplete) { //... //根据position获取ViewHolder实例对象 LittleVideoListAdapter.MyHolder holder = (LittleVideoListAdapter.MyHolder) recycler.findViewHolderForLayoutPosition(position); //... //1.moveToPre时,先设置Surface,再调用moveToPre if (holder != null) { mQuickPlayer.setSurface(holder.getSurface()); } mQuickPlayer.moveToPrev(video, position, mVideoSourceType); //2.moveTo时,先设置Surface,再调用moveTo if (holder != null) { mQuickPlayer.setSurface(holder.getSurface()); } //mQuickPlayer.startPlay()内部最终会调用moveTo()接口 mQuickPlayer.startPlay(video, position, mVideoSourceType); //3.moveToPre时,需要增加一个参数,将Surface传递进去 mQuickPlayer.moveToNext(video, position, mVideoSourceType, holder.getSurface()); //... }

修改AlivcQuickPlayer类的示例代码如下:

展开查看代码

//修改moveToPre方法 public void moveToPrev(AlivcVideoInfo.Video source, final int position, VideoSourceType videoSourceType) { //... //增加如下代码 mVideoListPlayer.clearScreen(); if (videoSourceType == VideoSourceType.TYPE_STS) { mVideoListPlayer.moveToPrev(createStsInfo(source)); } else { mVideoListPlayer.moveToPrev(); } } //增加moveToNext的重载方法 public void moveToNext(AlivcVideoInfo.Video source, int position, VideoSourceType videoSourceType, Surface surface) { //... //moveToNext时,可以获取preRenderPlayer对象,并使用该Player播放 IPlayer preRenderPlayer = mVideoListPlayer.getPreRenderPlayer(); if (preRenderPlayer != null) { preRenderPlayer.clearScreen(); preRenderPlayer.setSurface(surface); preRenderPlayer.start(); mVideoListPlayer.setSurface(null); } else { mVideoListPlayer.clearScreen(); mVideoListPlayer.setSurface(surface); } //STS播放方式 if (videoSourceType == VideoSourceType.TYPE_STS) { //当preRenderPlayer不为null时候,调用moveToNextWithPrerendered进行播放 if (preRenderPlayer != null) { mVideoListPlayer.moveToNextWithPrerendered(createStsInfo(source)); } else { mVideoListPlayer.moveToNext(createStsInfo(source)); } } else { //URL播放方式 if (preRenderPlayer != null) { mVideoListPlayer.moveToNextWithPrerendered(); } else { mVideoListPlayer.moveToNext(); } } }

可选:修改滑动播放的逻辑。

支持通过修改滑动播放的逻辑,实现在滑动切换视频时,当滑动到下一个视频的一半画面出现时,开始播放下一个视频。通过修改PagerLayoutManager类中的代码实现,即当RecyclerView的item出现在屏幕一半时,切换播放源,示例代码如下:

展开查看代码

recyclerView.addOnScrollListener(new OnScrollListener() { private int measuredHeight; private int mScrollDiff; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { measuredHeight = recyclerView.getMeasuredHeight(); mScrollDiff = 0; } if (newState == RecyclerView.SCROLL_STATE_IDLE) { mScrollDiff = 0; View viewIdle = mPagerSnapHelper.findSnapView(PagerLayoutManager.this); if (viewIdle == null) { return; } int positionIdle = getPosition(viewIdle); if (mOnViewPagerListener != null && getChildCount() == 1 && mOldPosition != positionIdle) { mOnViewPagerListener.onPageSelected(positionIdle, positionIdle == getItemCount() - 1, viewIdle); mOldPosition = positionIdle; } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (measuredHeight > 0 && mOnViewPagerListener != null) { mScrollDiff += dy; changeVideoAfterScrolled(recyclerView, dy >= 0); } } private void changeVideoAfterScrolled(RecyclerView recyclerView, boolean isNext) { if (Math.abs(mScrollDiff) >= measuredHeight / 2) { View snapView = mPagerSnapHelper.findSnapView(PagerLayoutManager.this); if (snapView != null) { int position = getPosition(snapView); if (mOldPosition != position) { if (isNext) { mOnViewPagerListener.onPageHideHalf(position - 1); } else { mOnViewPagerListener.onPageHideHalf(position + 1); } mOnViewPagerListener.onPageSelected(position, false, snapView); mOldPosition = position; recyclerView.smoothScrollToPosition(position); mScrollDiff = 0; } } } } });


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3