
>我有两个VIDeoVIEw实例.
>在给定时间只会显示一个VIDeoVIEw,占据手机的整个屏幕.
>目的是在从VIDeoVIEw A和VIDeoVIEw B切换时减少“黑屏”.
>该应用程序一个接一个地播放视频列表.
在2015年1月19日添加了以下代码
下面的代码抓取每个玩家的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 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)); }解决方法 假设您使用MediaPlayer在VIDeoVIEw中处理视频的播放,您可以使用prepareAsync()方法来实现这一点. prepareAsync()方法基本上执行与prepare()相同的功能,该功能用于缓冲和准备视频,但它可以在后台异步完成. 编辑
我做了类似的事情,但实际上我使用的是SurfaceVIEw.要处理另一个流,只需创建另一个MediaPlayer实例.以下示例将创建两个MediaPlayer实例并缓冲第一个视频.在准备好第一个视频后,第二个视频将被异步缓冲.然后将第一个MediaPlayer绑定到SurfaceVIEw,并启动第一个视频.当第一个视频播放完毕后,将释放相应的MediaPlayer实例,附加辅助实例,并自动启动第二个视频.以下示例代码已经过测试并且工作正常:
public class StreamingActivity extends Activity implements SurfaceHolder.Callback,MediaPlayer.OnPreparedListener,MediaPlayer.OnCompletionListener{ MediaPlayer mediaPlayerPrimary; MediaPlayer mediaPlayerSecondary; SurfaceHolder surfaceHolder; SurfaceVIEw surfaceVIEw; String vIDeoSourcePrimary = "vIDeoSourcePrimaryURL"; String vIDeoSourceSecondary = "vIDeoSourceSecondaryURL"; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.streaming_activity_layout); /** Create SurfaceVIEw */ surfaceVIEw = (SurfaceVIEw) findVIEwByID(R.ID.surface_vIEw); surfaceHolder = surfaceVIEw.getHolder(); surfaceHolder.addCallback(this); } @OverrIDe public voID surfaceCreated(SurfaceHolder arg0) { try { /** Create MediaPlayer(s) */ mediaPlayerPrimary = new MediaPlayer(); mediaPlayerSecondary = new MediaPlayer(); /** Attach primary MediaPlayer to SurfaceVIEw */ mediaPlayerPrimary.setdisplay(surfaceHolder); /** Set sources */ mediaPlayerPrimary.setDataSource(vIDeoSourcePrimary); mediaPlayerSecondary.setDataSource(vIDeoSourceSecondary); /** Prepare MediaPlayer(s) */ mediaPlayerPrimary.prepare(); mediaPlayerSecondary.prepareAsync(); /** Set Listeners */ mediaPlayerPrimary.setonPreparedListener(this); mediaPlayerPrimary.setonCompletionListener(this); mediaPlayerSecondary.setonPreparedListener(this); mediaPlayerSecondary.setonCompletionListener(this); /** Set audio stream type */ mediaPlayerPrimary.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayerSecondary.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { e.printstacktrace(); } } @OverrIDe public voID surfaceChanged(SurfaceHolder arg0,int arg1,int arg2,int arg3) { } @OverrIDe public voID surfaceDestroyed(SurfaceHolder arg0) { } @OverrIDe public voID onPrepared(MediaPlayer mp) { if (mp == mediaPlayerPrimary) { /** First vIDeo ready,start playback */ mediaPlayerPrimary.start(); } else if (mp == mediaPlayerSecondary) { /** Second vIDeo is ready */ } } @OverrIDe public voID onCompletion(MediaPlayer mp) { /** First vIDeo is completed,start second vIDeo */ mediaPlayerPrimary.release(); mediaPlayerSecondary.setdisplay(surfaceHolder); mediaPlayerSecondary.start(); } @OverrIDe public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.streaming_activity_menu,menu); return true; } @OverrIDe public boolean onoptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button,so long // as you specify a parent activity in AndroIDManifest.xml. int ID = item.getItemID(); //noinspection SimplifiableIfStatement if (ID == R.ID.action_settings) { return true; } return super.onoptionsItemSelected(item); }} 总结 以上是内存溢出为你收集整理的如何在播放另一个VideoView B时预播视频视频 – Android全部内容,希望文章能够帮你解决如何在播放另一个VideoView B时预播视频视频 – Android所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)