我有休耕代码:渲染视频白色SurfaceView
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没有显示任何东西。看起来它不使用表面。为什么?......不知道。
我会很感激任何来自你的想法。 谢谢。