我有兴趣能够在VideoView B 播放的同时"prebuffer" VideoView A . 这可能吗?
-
我有两个VideoView实例 .
-
在给定时间仅显示一个VideoView,占据手机的整个屏幕 .
-
目的是在从VideoView A和VideoView B切换时减少"black screen" .
-
该应用程序一个接一个地播放视频列表 .
Added Below Code on Jan 19, 2015
下面的代码抓取每个玩家的MediaPlayer的引用 . 当MediaPlayer A开始渲染时,MediaPlayer B将调用stop(),release(),setDataSource(url),prepareAsync() . 当MediaPlayer A完成时,Media Player B将调用start() .
public class PrebufferingActivity extends Activity {
private VideoView player1;
private VideoView player2;
private MediaPlayer mediaPlayer1;
private MediaPlayer mediaPlayer2;
public static final String URL_1 = "sample1.mp4";
public static final String URL_2 = "sample2.mp4";
public boolean FIRST_TIME = true;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prebuffering);
player1 = (VideoView) findViewById(R.id.videoPlayer1);
player2 = (VideoView) findViewById(R.id.videoPlayer2);
player1.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
});
player2.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
});
player1.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer2.start();
// Toggle visibility. Player1 is completed. Hide Player1. Show Player2.
player2.setVisibility(View.VISIBLE);
player1.setVisibility(View.INVISIBLE);
}
});
player1.setOnInfoListener(new OnInfoListener(){
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra)
{
if(what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)
{
mediaPlayer2.stop();
mediaPlayer2.release();
try {
mediaPlayer2.setDataSource(URL_2);
mediaPlayer2.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
});
player1.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer1 = mp;
if(FIRST_TIME == true) {
mediaPlayer1.start();
player1.requestFocus();
FIRST_TIME = false;
}
}
});
player2.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer1.start();
player1.requestFocus();
// Toggle visibility. Player2 is completed. Hide Player2. Show Player1.
player1.setVisibility(View.VISIBLE);
player2.setVisibility(View.INVISIBLE);
}
});
player2.setOnInfoListener(new OnInfoListener(){
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra)
{
if(what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)
{
// Prepare Player 2
mediaPlayer1.stop();
mediaPlayer1.release();
try {
mediaPlayer1.setDataSource(PrebufferingActivity.URL_1);
mediaPlayer1.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
});
player2.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer2 = mp;
}
});
// Player 1
player1.setMediaController(new MediaController(this));
player1.setVideoURI(Uri.parse(URL_1));
// Player 2
player2.setMediaController(new MediaController(this));
player2.setVideoURI(Uri.parse(URL_2));
}
1 回答
假设您正在使用
MediaPlayer
来处理VideoView
中视频的播放,您可以使用prepareAsync()
方法来实现此目的 .prepareAsync()
方法基本上执行与prepare()
相同的功能,该功能用于缓冲和准备视频,但可以在后台异步完成 .EDIT
我做了类似的事情,但实际上我使用了
SurfaceView
. 要处理另一个流,只需创建MediaPlayer
的另一个实例 . 以下示例将创建MediaPlayer
的两个实例并缓冲第一个视频 . 在准备好第一个视频后,第二个视频将被异步缓冲 . 然后将第一个MediaPlayer
绑定到SurfaceView
,并启动第一个视频 . 当第一个视频播放完毕后,将释放相应的MediaPlayer
实例,附加辅助实例,并自动启动第二个视频 . 以下示例代码已经过测试并且工作正常: