【问题标题】:Render video on white SurfaceView在白色 SurfaceView 上渲染视频
【发布时间】:2014-03-28 04:15:06
【问题描述】:

我有闲置代码:

 public class MainActivity extends Activity {
        MediaPlayer player;
        Button playBtn;
        FrameLayout frame;
        boolean plaing = false;
        Uri uri;
        volatile boolean surfaceReady;

        boolean drawCanvas = true;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            playBtn = (Button) findViewById(R.id.play);
            playBtn.setOnClickListener(new CKL());
            frame = (FrameLayout) findViewById(R.id.FrameForVideo);
            createSurfaceView(frame);
            player = new MediaPlayer();
            player.setLooping(true);
            String urri = "android.resource://com.example.videoplayer/raw/id_1_l_belen";
            uri = Uri.parse(urri);
            Log.d("atf", urri);
        }

        @Override
        protected void onPause() {
            player.stop();
            player.reset();
            player.release();
            super.onPause();
        }

        private class CKL implements OnClickListener{
            @Override
            public void onClick(View v) {
                if (!plaing)
                {
                    try 
                    {
                        player.setDataSource(MainActivity.this, uri);
                        player.setLooping(true);
                        player.prepare();
                        player.start();
                        plaing = true;
                        Log.d("atf", "Player started");
                    } catch (Throwable e) {
                        Error er = new Error(e);
                        throw er;
                    }
                }
                else
                {
                    surfaceReady = false;
                    player.stop();
                    player.reset();
                    plaing = false;
                    createSurfaceView(frame);
                }


            }

        }

        private class SurfaceCreationLisatener implements SurfaceHolder.Callback{

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                player.setDisplay(holder);
            }
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {}

        }

        private void createSurfaceView(FrameLayout frame){
            frame.removeAllViews();
            SurfaceView surfaceView = new SurfaceView(MainActivity.this);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            surfaceView.setLayoutParams(lp);
            surfaceView.getHolder().addCallback(new SurfaceCreationLisatener());        
            frame.addView(surfaceView);
        }
    }

基本上,我使用 MediaPlayer 在 SurfaceView 上呈现视频。问题是这个 SurfaceView 是黑色的,设置背景颜色是没有用的,因为它的行为不像普通的 View。

基本上,我需要使视图的黑色背景不可见。在不播放视频时使整个表面不可见等变通方法不适合我。 我需要将表面放在 ListView 中,即使视频正在播放,滚动时黑色表面也会闪烁。 (看起来很丑) 我也尝试使用 TextureView 但还有另一个问题: 当一次播放多个视频时,此视频会出现故障,因为在 TextureView 上渲染会消耗更多资源。

对我来说,一个解决方案是将 SurfaceView 着色为白色,以便 MediaPlayer 可以将其内容呈现在白色表面上,但我不知道该怎么做。 以下代码不起作用。

@Override
public void surfaceCreated(SurfaceHolder holder) {
    Canvas cnvs = holder.lockCanvas();
    cnvs.drawColor(Color.WHITE);
    holder.unlockCanvasAndPost(cnvs);
    player.setDisplay(holder);
}

绘制表面后,MediaPlayer 没有显示任何内容。看起来它没有使用表面。为什么?...不知道。

如果您提出任何想法,我将不胜感激。 谢谢。

【问题讨论】:

    标签: java android eclipse


    【解决方案1】:

    也许你可以试试这个:把你的表面视图放在一个框架布局上(它可以是你已经在你的 createSurfaceView 上使用的那个),在你的表面视图顶部有另一个视图。这个新视图可以只是一个带有白色背景的按钮(或者更好的是,视频的缩略图或静止帧),并将其设置为与表面视图相同的宽度和高度。然后,在单击此按钮时将其隐藏以显示表面视图并播放视频。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多