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>