2017年5月14日 星期日

EXOPlayer's surface view


  /**
   * Sets the {@link SurfaceView} onto which video will be rendered. The player will track the
   * lifecycle of the surface automatically.
   *
   * @param surfaceView The surface view.
   */
  public void setVideoSurfaceView(SurfaceView surfaceView) {
    setVideoSurfaceHolder(surfaceView.getHolder());
  }



https://developer.android.com/reference/android/media/MediaCodec.html#setOutputSurface(android.view.Surface)

 // Create a surface view and insert it into the content frame, if there is one.
    if (contentFrame != null && surfaceType != SURFACE_TYPE_NONE) {
      ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
          ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
      surfaceView = surfaceType == SURFACE_TYPE_TEXTURE_VIEW ? new TextureView(context)
          : new SurfaceView(context);
      surfaceView.setLayoutParams(params);
      contentFrame.addView(surfaceView, 0);
    } else {
      surfaceView = null;
    }


 

Preview seek bar

    @Override
    public void loadPreview(long currentPosition, long max) {
        float offset = (float) currentPosition / max;
        int scale = player.getDuration() >= ROUND_DECIMALS_THRESHOLD ? 2 : 1;
        float offsetRounded = roundOffset(offset, scale);
        player.setPlayWhenReady(false);
        previewPlayer.seekTo((long) (offsetRounded * previewPlayer.getDuration()));
        previewPlayer.setPlayWhenReady(false);
        View view = previewPlayerView.getVideoSurfaceView();
        if (view instanceof SurfaceView) {
            view.setVisibility(View.VISIBLE);
        }
    }

2017年5月7日 星期日

exoplayer佈局原理

exo_simple_player_view.xml

  <View android:id="@id/exo_controller_placeholder"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

-------------------------


    View controllerPlaceholder = findViewById(R.id.exo_controller_placeholder);
    if (controllerPlaceholder != null) {
      // Note: rewindMs and fastForwardMs are passed via attrs, so we don't need to make explicit
      // calls to set them.
      this.controller = new PlaybackControlView(context, attrs);
      controller.setLayoutParams(controllerPlaceholder.getLayoutParams());
      ViewGroup parent = ((ViewGroup) controllerPlaceholder.getParent());
      int controllerIndex = parent.indexOfChild(controllerPlaceholder);
      parent.removeView(controllerPlaceholder);
      parent.addView(controller, controllerIndex);
    } else {
      this.controller = null;
    }

-------------------------

exo_controller_placeholder

--------------------------




http://fecbob.pixnet.net/blog/post/35999655-%5Bandroid%5D-expandablelistview%E7%B0%A1%E5%96%AE%E7%94%A8%E6%B3%95

意圖和意圖篩選器


https://developer.android.com/guide/components/intents-filters.html?hl=zh-tw


















好的說明範例!!!

[Andriod] 透過setContentView轉換layout


https://dotblogs.com.tw/psjhuo/2013/04/18/101805



---------------------------------------
























https://developer.android.com/reference/android/content/Intent.html#ACTION_VIEW










    // Playback control view.
    View controllerPlaceholder = findViewById(R.id.exo_controller_placeholder);
    if (controllerPlaceholder != null) {
      // Note: rewindMs and fastForwardMs are passed via attrs, so we don't need to make explicit
      // calls to set them.
      this.controller = new PlaybackControlView(context, attrs);
      controller.setLayoutParams(controllerPlaceholder.getLayoutParams());
      ViewGroup parent = ((ViewGroup) controllerPlaceholder.getParent());
      int controllerIndex = parent.indexOfChild(controllerPlaceholder);
      parent.removeView(controllerPlaceholder);
      parent.addView(controller, controllerIndex);
    } else {
      this.controller = null;
    }



Step 1:
Intent intent = new Intent(context, PlayerActivity.class);


Step 2:
    @Override
    public Intent buildIntent(Context context) {
      return super.buildIntent(context)
          .setData(Uri.parse(uri))
          .putExtra(PlayerActivity.EXTENSION_EXTRA, extension)
          .setAction(PlayerActivity.ACTION_VIEW);
    }

Step 3:
    @Override
    protected void onPostExecute(List<SampleGroup> result) {

      Log.d(TAG1, "onPostExecute() thread = " + Thread.currentThread().getId()); 
 
      onSampleGroups(result, sawError);
    }
如何從SampleChooserActivity 轉到 PlayerActivity











Q1: SimpleExoPlayerView怎麼來的?