使用VideoView无法播放完整流视频的技术求助
解决VideoView无法完整播放流媒体视频的问题
嘿,我来帮你搞定VideoView没法完整播放流媒体视频的问题!结合你给出的代码片段,咱们一步步排查和解决:
先补全并优化你的现有代码
首先,你的代码缺少了错误监听和缓冲状态的处理,这很可能是你没发现播放中断原因的关键。我把代码补全并优化了下:
final MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); Uri uri = Uri.parse("http://mirrors.standaloneinstaller.com/video-sample/star_trails.mp4"); videoView.setMediaController(mediaController); videoView.setVideoURI(uri); videoView.requestFocus(); ProgressDialog progressDialog = new ProgressDialog(this); progressDialog.setMessage("Loading video....."); progressDialog.show(); // 视频准备完成后的处理 videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // 准备好就关掉加载弹窗 if (progressDialog.isShowing()) { progressDialog.dismiss(); } mp.setLooping(false); // 不需要循环的话保持false videoView.start(); } }); // 监听播放错误,捕获中途中断的原因 videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Toast.makeText(getApplicationContext(), "播放出错啦:错误码" + what + ", 额外信息" + extra, Toast.LENGTH_SHORT).show(); if (progressDialog.isShowing()) { progressDialog.dismiss(); } return true; } }); // 监听缓冲状态,网络波动时给用户反馈 videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { case MediaPlayer.MEDIA_INFO_BUFFERING_START: // 开始缓冲,重新显示加载弹窗 if (!progressDialog.isShowing()) { progressDialog.show(); } return true; case MediaPlayer.MEDIA_INFO_BUFFERING_END: // 缓冲结束,关掉弹窗 if (progressDialog.isShowing()) { progressDialog.dismiss(); } return true; case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: // 视频开始渲染,确保弹窗关闭 if (progressDialog.isShowing()) { progressDialog.dismiss(); } return true; } return false; } });
常见问题排查&解决方案
- 缓存不够导致中途停播:VideoView默认的缓存机制对长流媒体支持有限,要是视频比较长,很容易因为缓存不足中断。你可以试试用反射修改MediaPlayer的缓存大小(不过这是非官方方法,风险略高);更稳妥的是直接换ExoPlayer——Google官方推的流媒体播放库,不管是缓存还是协议支持都比VideoView强太多。
- 网络波动没处理:上面加的
OnInfoListener能帮你监听缓冲状态,网络卡的时候给用户显示加载提示,既避免用户误解,也能让你知道是不是网络问题搞的鬼。 - 视频编码/格式不兼容:有些流媒体的编码格式不在Android默认支持列表里,你先试试用浏览器或者其他播放器打开这个视频链接,如果别的播放器也播不完,那大概率是视频源本身的问题;如果别的播放器没问题,那换ExoPlayer基本能解决兼容性问题,它支持的编码格式多得多。
- 权限没加全:别忘了在
AndroidManifest.xml里加网络权限,不然连不上视频源:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
终极建议
要是折腾完VideoView还是有问题,别犹豫直接转ExoPlayer吧,它就是专门为流媒体播放设计的,稳定性和功能都甩VideoView一条街,官方文档也很全,上手不难。
内容的提问来源于stack exchange,提问作者Kieran Lyons
相关产品推荐
相关产品推荐

