You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:36:27