SuperPlayer:基于 IjkPlayer 的播放器
ldffkal
8年前
<h2><strong>超级播放器</strong></h2> <p>SuperPlayer是一个基于IjkPlayer的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换,亲测可用,废话少说,先上图</p> <h2><strong>Screenshots</strong></h2> <p style="text-align:center"><img src="https://simg.open-open.com/show/fa018ac1eec3da938616e5acc8d20aed.gif"> <img src="https://simg.open-open.com/show/000a0fd842733a332da7f6fccfe4c5ff.gif"> <img src="https://simg.open-open.com/show/5d99961eb89e35deb9e45182ba20123b.gif"></p> <h2><strong>How to User</strong></h2> <p>gradle</p> <pre> <code class="language-java">ps:还有时间上传到maven,过几天在上传上去,喜欢的可以直接Clone or download</code></pre> <h2><strong>视频点播(直播)功能(播放网络视频,或者视频直播)</strong></h2> <p>设置视频源(视频地址)是否是直播还是点播</p> <pre> <code class="language-java">player.setLive(true);//true:表示直播地址;false表示点播地址</code></pre> <p>设置播放过程中是否监听网络的变化</p> <pre> <code class="language-java">player.setNetChangeListener(true);//true : 表示监听网络的变化;false : 播放的过程中不监听网络的变化</code></pre> <p>设置播放过程中的视频开始播放</p> <pre> <code class="language-java">player.onPrepared(new SuperPlayer.OnPreparedListener() { @Override public void onPrepared() { /** * 监听视频是否已经准备完成开始播放。(可以在这里处理视频封面的显示跟隐藏) */ } })</code></pre> <p>设置视频是否已经播放完成</p> <pre> <code class="language-java">player.onComplete(new Runnable() { @Override public void run() { /** * 监听视频是否已经播放完成了。(可以在这里处理视频播放完成进行的操作) */ } })</code></pre> <p>设置视频播放失败的监听</p> <pre> <code class="language-java">player.onError(new SuperPlayer.OnErrorListener() { @Override public void onError(int what, int extra) { /** * 监听视频播放失败的回调 */ } })</code></pre> <p>设置视频播放的信息</p> <pre> <code class="language-java">player.onInfo(new SuperPlayer.OnInfoListener() { @Override public void onInfo(int what, int extra) { /** * 监听视频的相关信息。 */ } })</code></pre> <p>设置视频播放的标题</p> <pre> <code class="language-java">player.setTitle(url)//设置视频的titleName</code></pre> <p>设置视频播放大小</p> <pre> <code class="language-java">player.setScaleType(SuperPlayer.SCALETYPE_FITXY); 其中可以设置 /** * fitParent:scale the video uniformly (maintain the video's aspect ratio) * so that both dimensions (width and height) of the video will be equal to * or **less** than the corresponding dimension of the view. like * ImageView's `CENTER_INSIDE`.等比缩放,画面填满view。 */ public static final String SCALETYPE_FITPARENT = "fitParent"; /** * fillParent:scale the video uniformly (maintain the video's aspect ratio) * so that both dimensions (width and height) of the video will be equal to * or **larger** than the corresponding dimension of the view .like * ImageView's `CENTER_CROP`.等比缩放,直到画面宽高都等于或小于view的宽高。 */ public static final String SCALETYPE_FILLPARENT = "fillParent"; /** * wrapContent:center the video in the view,if the video is less than view * perform no scaling,if video is larger than view then scale the video * uniformly so that both dimensions (width and height) of the video will be * equal to or **less** than the corresponding dimension of the view. * 将视频的内容完整居中显示,如果视频大于view,则按比例缩视频直到完全显示在view中。 */ public static final String SCALETYPE_WRAPCONTENT = "wrapContent"; /** * fitXY:scale in X and Y independently, so that video matches view * exactly.不剪裁,非等比例拉伸画面填满整个View */ public static final String SCALETYPE_FITXY = "fitXY"; /** * 16:9:scale x and y with aspect ratio 16:9 until both dimensions (width * and height) of the video will be equal to or **less** than the * corresponding dimension of the view.不剪裁,非等比例拉伸画面到16:9,并完全显示在View中。 */ public static final String SCALETYPE_16_9 = "16:9"; /** * 4:3:scale x and y with aspect ratio 4:3 until both dimensions (width and * height) of the video will be equal to or **less** than the corresponding * dimension of the view.不剪裁,非等比例拉伸画面到4:3,并完全显示在View中。 */ public static final String SCALETYPE_4_3 = "4:3";</code></pre> <p>设置视频播放的手势操作</p> <pre> <code class="language-java">/** * 设置小屏幕是否支持手势操作(默认false) * @param isSupportGesture * true : 支持(小屏幕支持,大屏幕支持) * false :不支持(小屏幕不支持,大屏幕支持) * @return */ public SuperPlayer setSupportGesture(boolean isSupportGesture){ this.isSupportGesture = isSupportGesture; return this; }</code></pre> <p>还有很多的相关设置,就不一一的列出。具体的请看SuperPlayer.class</p> <h2><strong>列表播放器</strong></h2> <p>很多的设置跟点播直播的一致。但是比较应该注意的地方</p> <p>其一:初始化适配器</p> <pre> <code class="language-java">private void initAdapter() { mAdapter = new SuperVideoAdapter(this,dataList); superRecyclerView.setAdapter(mAdapter); mAdapter.setPlayClick(new SuperVideoAdapter.onPlayClick() { @Override public void onPlayclick(int position, RelativeLayout image) { image.setVisibility(View.GONE); if (player.isPlaying() && lastPostion == position){ return; } postion = position; if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) { if (position != lastPostion) { player.stopPlayVideo(); player.release(); } } if (lastPostion != -1) { player.showView(R.id.adapter_player_control); } View view = superRecyclerView.findViewHolderForAdapterPosition(position).itemView; FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video); frameLayout.removeAllViews(); player.showView(R.id.adapter_player_control); frameLayout.addView(player); player.play(dataList.get(position).getVideoUrl()); lastPostion = position; } }); /** * 播放完设置还原播放界面 */ player.onComplete(new Runnable() { @Override public void run() { ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove if (last != null && last.getChildCount() > 0) { last.removeAllViews(); View itemView = (View) last.getParent(); if (itemView != null) { itemView.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE); } } } }); /*** * 监听列表的下拉滑动 */ superRecyclerView.addOnChildAttachStateChangeListener(new SuperRecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(View view) { int index = superRecyclerView.getChildAdapterPosition(view); View controlview = view.findViewById(R.id.adapter_player_control); if (controlview == null) { return; } view.findViewById(R.id.adapter_player_control).setVisibility(View.VISIBLE); if (index == postion) { FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video); frameLayout.removeAllViews(); if (player != null && ((player.isPlaying()) || player.getVideoStatus() == IjkVideoView.STATE_PAUSED)) { view.findViewById(R.id.adapter_player_control).setVisibility(View.GONE); } if (player.getVideoStatus() == IjkVideoView.STATE_PAUSED) { if (player.getParent() != null) ((ViewGroup) player.getParent()).removeAllViews(); frameLayout.addView(player); return; } } } @Override public void onChildViewDetachedFromWindow(View view) { int index = superRecyclerView.getChildAdapterPosition(view); if ((index) == postion) { if (true) { if (player != null) { player.stop(); player.release(); player.showView(R.id.adapter_player_control); } } } } }); }</code></pre> <p>其二:重写onConfigurationChanged</p> <pre> <code class="language-java">@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (player != null) { player.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { fullScreen.setVisibility(View.GONE); fullScreen.removeAllViews(); superRecyclerView.setVisibility(View.VISIBLE); if (postion <= mLayoutManager.findLastVisibleItemPosition() && postion >= mLayoutManager.findFirstVisibleItemPosition()) { View view = superRecyclerView.findViewHolderForAdapterPosition(postion).itemView; FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.adapter_super_video); frameLayout.removeAllViews(); ViewGroup last = (ViewGroup) player.getParent();//找到videoitemview的父类,然后remove if (last != null) { last.removeAllViews(); } frameLayout.addView(player); } int mShowFlags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; fullScreen.setSystemUiVisibility(mShowFlags); } else { ViewGroup viewGroup = (ViewGroup) player.getParent(); if (viewGroup == null) return; viewGroup.removeAllViews(); fullScreen.addView(player); fullScreen.setVisibility(View.VISIBLE); int mHideFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ; fullScreen.setSystemUiVisibility(mHideFlags); } } else { fullScreen.setVisibility(View.GONE); } }</code></pre> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>来自:https://github.com/supercwn/SuperPlayer</p> <p> </p>