[英]Applying TextureView to MediaPlayer after MediaPlayer.prepare causes black screen
I'd like to switch the video method in MediaPlayer
to TextureView
's Surface
at some point during playback. 我想在播放过程中将MediaPlayer
的视频方法切换到TextureView
的Surface
。 But all I get is a black screen (the sound is playing). 但是我得到的只是一个黑屏(声音正在播放)。 I made sure the size of the TextureView
is ok, so it's not the case. 我确保TextureView
的大小是可以的,所以不是这样。
If I set the Surface
of TextureView
before calling prepare
on MediaPlayer
, than the video is shown. 如果在MediaPlayer
上调用prepare
之前设置TextureView
的Surface
, TextureView
显示视频。
So it seems that the order of calling prepare
and applying the surface is crucial. 因此,似乎调用prepare
和应用表面的顺序至关重要。
What's interesting, in case of SurfaceView
everything works fine (no matter when I set the holder of SurfaceView
: before or after the preparing is done). 有趣的是,在使用SurfaceView
情况下,一切正常(无论何时设置SurfaceView
的持有者:在准备工作之前或之后)。
Is there a way to set TextureView to MediaPlayer during playback? 有没有一种方法可以在播放过程中将TextureView设置为MediaPlayer? Calling MediaPlayer.release()
and recreating it again while having to take care of progress would be very inconvenient. 调用MediaPlayer.release()
并在必须照顾进度的情况下重新创建它非常不便。
@Override
public void onSurfaceTextureAvailable(final SurfaceTexture surface, final int width, final int height) {
s = new Surface(surface);
Thread play = new Thread(new Runnable() {
@Override
public void run() {
try {
player = new MediaPlayer();
player.setSurface(s);
player.setDataSource(vidAddress);
player.prepare();
player.setOnPreparedListener(MainActivity.this);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnCompletionListener(MainActivity.this);
player.setScreenOnWhilePlaying(true);
Log.e("mediaplayer", "true");
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
play.start();
}
And your onPrepared listener like this 而您的onPrepared监听器是这样的
public void onPrepared(MediaPlayer mp) {
if (!player.isPlaying()) {
player.start();
}
}
setSurfaceTextureListener like this at onCreate setSurfaceTextureListener像这样在onCreate
mTextureView.setSurfaceTextureListener(MainActivity.this);
I hope this will help :) 我希望这个能帮上忙 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.