在白色SurfaceView上渲染视频

时间:2014-02-25 18:15:26

标签: java android eclipse

我有以下代码:

 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未显示任何内容。看起来它不使用表面。为什么?......不知道。

我很感激您的任何想法。 感谢。

1 个答案:

答案 0 :(得分:0)

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