zoukankan      html  css  js  c++  java
  • Android 视频播放器切换到下个视频时残留上个视频画面的解决办法

    最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面。
     
    这是怎么回事?
     
    我在网上找了很多资料,终于找到了原因:我是用自定义一个surfaceview来显示画面的,切换视频时并没有将surfaceview显示的
    内容做处理。
     
    怎么解决?
     
    知道原因,那就很好解决了。
     
    首先,视频切换时,不再显示视频,及播放器不显示视频内容。
    我找到了我代码中的这个方法:mVideoView.setRender(0);

    public void setRender(int render) {
    switch (render) {
    case RENDER_NONE:
    setRenderView(null);
    break;
    case RENDER_TEXTURE_VIEW: {
    TextureRenderView renderView = new TextureRenderView(getContext());
    if (mMediaPlayer != null) {
    renderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer);
    renderView.setVideoSize(mMediaPlayer.getVideoWidth(),
    mMediaPlayer.getVideoHeight());
    renderView.setVideoSampleAspectRatio(
    mMediaPlayer.getVideoSarNum(),
    mMediaPlayer.getVideoSarDen());
    renderView.setAspectRatio(mCurrentAspectRatio);
    }
    setRenderView(renderView);
    break;
    }
    case RENDER_SURFACE_VIEW: {
    SurfaceRenderView renderView = new SurfaceRenderView(getContext());
    setRenderView(renderView);
    break;
    }
    default:
    Log.e(TAG, String.format(Locale.getDefault(),
    "invalid render %d ", render));
    break;
    }
    }

    public void setRenderView(IRenderView renderView) {
    if (mRenderView != null) {
    if (mMediaPlayer != null)
    mMediaPlayer.setDisplay(null);

    View renderUIView = mRenderView.getView();
    mRenderView.removeRenderCallback(mSHCallback);
    mRenderView = null;
    removeView(renderUIView);
    }

    if (renderView == null)
    return;

    mRenderView = renderView;
    renderView.setAspectRatio(mCurrentAspectRatio);
    if (mVideoWidth > 0 && mVideoHeight > 0)
    renderView.setVideoSize(mVideoWidth, mVideoHeight);
    if (mVideoSarNum > 0 && mVideoSarDen > 0)
    renderView.setVideoSampleAspectRatio(mVideoSarNum, mVideoSarDen);

    View renderUIView = mRenderView.getView();
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
    FrameLayout.LayoutParams.WRAP_CONTENT,
    FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
    renderUIView.setLayoutParams(lp);
    addView(renderUIView);

    mRenderView.addRenderCallback(mSHCallback);
    mRenderView.setVideoRotation(mVideoRotationDegree);
    }

    然后,视频准备好后,再显示视频:initRenders();
     

    public void initRenders() {
    mAllRenders.clear();

    if (mSettings.getEnableSurfaceView())
    mAllRenders.add(RENDER_SURFACE_VIEW);
    if (mSettings.getEnableTextureView()
    && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    mAllRenders.add(RENDER_TEXTURE_VIEW);
    if (mSettings.getEnableNoView())
    mAllRenders.add(RENDER_NONE);

    if (mAllRenders.isEmpty())
    mAllRenders.add(RENDER_SURFACE_VIEW);
    mCurrentRender = mAllRenders.get(mCurrentRenderIndex);
    setRender(mCurrentRender);
    }

    根据这个逻辑,解决这一问题。
  • 相关阅读:
    关于FPGA设计16位乘法器的两…
    const int *pi与int&nbs…
    HTML5基础学习
    html5基础!!
    正确分析结构使用正确的HTML标签。CSS样式写一起。
    开发经验以及方法
    布局设计
    position定位
    浏览器的兼容性
    float浮动的世界
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/4885744.html
Copyright © 2011-2022 走看看