关于VideoView无法监听视频播放时缓冲或者卡顿状态的解决办法

Android Studio 实现播放本地/网络视频 Android Studio 实现播放本地/网络视频 目的工具及环境功能设计VideoView简介常用方法代码解释本地视频播放器activity_main.xmlMainActivity.java网络视频播放器AndroidManifest.xmlMainActivity.java完整代码activity_main.xmlAndroidManifest.xmlMainActivity.java最终效果本地视频播放器网络视频播放器暂停、停止视频拉动进度条关于VideoView的坑参考 目的 利用Android 阅读详情

首先在android使用系统自带播放器有三种实现方式:

1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。

 

2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。

 

3、使用MediaPlayer类和SurfaceView来实现。这种方式最灵活,也最复杂。


对于第一种和第三种都有办法实现对正在播放的视频进行缓冲监听,请自行谷歌。而对于第二种要实现对缓冲状态进行监听,复杂的方法就是重写VideoView,去继承写MediaPlayer中的方法,从而通过第3种方式实现监听。


对于只简单的使用了VideoView来播放视频的应用有没有其他简便的方法来实现对缓冲状态的监听呢?我们先简单的看下VideoView的API。


公共方法

public boolean canPause ()

(译者注:判断是否能够暂停播放视频)

 

public boolean canSeekBackward ()

(译者注:判断是否能够倒退)

 

public boolean canSeekForward ()

(译者注:判断是否能够快进)

 

public int getBufferPercentage ()

(译者注:获得缓冲区的百分比)

 

public int getCurrentPosition ()

(译者注:获得当前的位置)

 

public int getDuration ()

(译者注:获得所播放视频的总时间)

 

public boolean isPlaying ()

(译者注:判断是否正在播放视频)

 

public boolean onKeyDown (int keyCode, KeyEvent event)

KeyEvent.Callback.onKeyMultiple() 的默认实现。如果视图可用并可按, 当按下 KEYCODE_DPAD_CENTER 或 KEYCODE_ENTER 时执行视图的按下事件。

参数

keyCode   表示按下的键的、在 KEYCODE_ENTER 中定义的键盘代码

event        KeyEvent 对象,定义了按钮动作

返回值

如果处理了事件,返回真。如果允许下一个事件接受器处理该事件,可以返回假

 

public boolean onTouchEvent (MotionEvent ev)

实现该方法来处理触屏事件。

参数

event        触屏事件

返回值

如果事件已经处理返回True,否则返回false。

 

public boolean onTrackballEvent (MotionEvent ev)

实现这个方法去处理轨迹球的动作事件,轨迹球相对于上次事件移动的位置能用MotionEvent.getX() 和 MotionEvent.getY()函数取回。对应用户按下一次方向键, 他们通常作为一次移动处理(为了表现来自轨迹球的更小粒度的移动信息,他们返回小数)。

参数

ev     动作的事件

 

public void pause ()

(译者注:使得播放暂停)

 

public int resolveAdjustedSize (int desiredSize, int measureSpec)

(译者注:取得调整后的尺寸。如果measureSpec对象传入的模式是UNSPECIFIED那么返回的是desiredSize。如果measureSpec对象传入的模式是AT_MOST,返回的将是desiredSize和measureSpec对象的尺寸两者中最小的那个。如果measureSpec对象传入的模式是EXACTLY,那么返回的是measureSpec对象中的尺寸大小值。

关于MeasureSpec类的额外说明:MeasureSpec是一个android.view.View的内部类。它封装了从父类传送到子类的布局要求信息。每个MeasureSpec对象描述了控件的高度或者宽度。MeasureSpec对象是由尺寸和模式组成的,有3个模式:UNSPECIFIED、EXACTLY、AT_MOST,这个对象由MeasureSpec.makeMeasureSpec()函数创建。)

 

public void resume ()

(译者注:恢复挂起的播放器)

 

public void seekTo (int msec)

(译者注:设置播放位置)

 

public void setMediaController (MediaController controller)

(译者注:设置媒体控制器)

        

public void setOnCompletionListener (MediaPlayer.OnCompletionListener l)

注册在媒体文件播放完毕时调用的回调函数。

参数

l        要执行的回调函数

 

public void setOnErrorListener (MediaPlayer.OnErrorListener l)

注册在设置或播放过程中发生错误时调用的回调函数。如果未指定回调函数, 或回调函数返回假,VideoView 会通知用户发生了错误。

参数

l        要执行的回调函数

 

public void setOnPreparedListener (MediaPlayer.OnPreparedListener l)

注册在媒体文件加载完毕,可以播放时调用的回调函数。

参数

l        要执行的回调函数

        

public void setVideoPath (String path)

(译者注:设置视频文件的路径名)

 

public void setVideoURI (Uri uri)

(译者注:设置视频文件的统一资源标识符)

 

public void start ()

(译者注:开始播放视频文件)

 

public void stopPlayback ()

(译者注:停止回放视频文件)

 

public void suspend ()

(译者注:挂起视频文件的播放)


看完发现VideoView的方法的确比其他的少了很多。但是我们看到了

public int getBufferPercentage ()

(译者注:获得缓冲区的百分比)

 

public int getCurrentPosition ()

(译者注:获得当前的位置)

这2个方法。最开始的想法是通过比较当前位置和缓冲区的百分比是否相等,来判断是否卡顿或者是出于缓冲状态。但是后来在 http://stackoverflow.com/questions/7867233/detect-if-a-videoview-is-buffering 

这里看到了一个解决方法。

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    public void run() {
        int duration = videoView.getCurrentPosition();
        if (old_duration == duration && videoView.isPlaying()) {
            videoMessage.setVisibility(View.VISIBLE);
        } else {
            videoMessage.setVisibility(View.GONE);
        }
        old_duration = duration;

        handler.postDelayed(runnable, 1000);
    }
};
handler.postDelayed(runnable, 0);
只需要判断当前播放位置与下一秒播放位置是否相等即可。所以通过这个方法即可实现使用VideoView监听缓冲状态,来实现出现缓冲中的提示了。不过,响应还是有点慢的。(默认是1秒)可以更改这里的时间来缩短响应时间。我使用的是0.5秒。

handler.postDelayed(runnable, 500);

AndroidVideoCache (改成 okhttp 缓存) AdroidVideoCache是一个视频/音频缓存库,利用本地代理实现了边下边播,结合OKhttp 优点,进行缓存 立即下载

相关推荐

VideoView 缓冲/卡顿监听和处理Demo

这个Demo包括:播放网络视频卡顿监听、缓冲加载动画、实时下载速度、以及大小屏切换,略微实现了功能,还不够完善

【Android 实现VideoView开始和播放时缓冲监听动画(监听播放状态)】

在做一个项目时,大部分都会用到视频播放,使用VideoView就很方便好用,本文将介绍如何优化视频播放体验。

m0_44980493的博客 2534

9.9元ESP32-C3开发板实战:手把手教你用VSCode搭建RT-Thread最小系统(附避坑指南)

本文提供了一份详尽的实战指南,教你如何在售价仅9.9元的ESP32-C3开发板上,使用VSCode搭建RT-Thread最小系统。内容涵盖从ESP-IDF环境配置、BSP源码获取、内核补丁应用到编译下载与调试的全流程,并重点分享了版本选择、补丁应用等关键避坑技巧,旨在帮助开发者低成本、高效地启动嵌入式实时操作系统开发。

o4p5q6r7s的博客 226

关于android原生VideoView解决卡顿现象

自己公司的项目是webview嵌套h5的,,反正麻烦的很0.0 恩 不过这个解决卡顿还不错,直接上代码了,大部分都可以搜到的handler+Runnable,我只是重复了一下,稍微修改了一下而已 /** 1.获取当前的播放时间,与上一次记录的时间进行对比, 2.如果事件一样了,就说明卡顿了!!! 3.时间不一样,那就说明可能没有卡顿 0.0 (缓存了可就说明了) 4.根据 卡顿 和 不卡顿 来做相

ButtonXin的博客 9826

State of GPT (ChatGPT 原理及现状介绍)

要用 RLHF 的一个简单的原因就是 RLHF 模型效果更好,下面的图来源于 InstructGPT 论文,PPO (RLHF 算法) 后的模型生成的答案更被人类喜欢。karpathy 认为 RLHF 有用的原因是判别比生成更容易,让标注员去写一些 SFT 的 QA 数据对是比较难的,如果有一个 SFT 模型生成一些数据让标注员判断哪个更好就简单很多。,GPT4 最强,前三个都是 RLHF 模型,其他模型都是 SFT 模型。伯克利做的模型评测榜单。

kebijuelun的博客 3578

手把手教你用ComfyUI搭建高效AI绘画工作流:从基础到高级技巧

本文详细介绍了如何使用ComfyUI构建高效的AI绘画工作流,从基础配置到高级技巧全面覆盖。通过模块化设计,ComfyUI显著提升显存利用率和创作灵活性,适合从新手到专业用户。文章包含部署指南、工作流搭建、性能优化及行业应用案例,帮助读者快速掌握AI绘画核心技术。

7up55的博客 718

VideoView无法监听视频播放时缓冲或者卡顿状态

首先在android使用系统自带播放器有三种实现方式: 1、使用其自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。 2、使用VideoView来播放。在布局文件中使用VideoView结合MediaController来实现对其控制。 3、使用MediaPlayer类和SurfaceView来实现。这种方式最灵活,也最复杂。 对于第一种和...

AHAI1078766113的博客 2690

基于因果推理的LLM去毒:精准定位注意力头实现高效干预

在大型语言模型(LLM)的部署与应用中,模型安全与可控性是核心挑战之一。传统方法如全参数微调成本高昂,且可能损害模型通用能力。本文聚焦于一种基于因果推理的精准干预技术,其原理在于利用因果发现算法定位Transformer模型中与“毒性”输出存在强因果关联的特定注意力头。该技术通过分析注意力头的激活模式与生成文本毒性分数之间的因果关系,识别出关键责任单元,而非依赖传统的相关性分析。其技术价值在于实现了轻量级、高可解释性的模型行为修正,能以极低的参数改动代价有效降低模型在敏感话题上的有害输出。在应用场景上,该方

weixin_32667439的博客 313

VideoView视频大小屏切换/缓冲/卡顿监听和处理

走一张效果图 VideoView缓冲/卡顿检测和处理 import javax.swing.Timer; * 卡顿检测 * 卡顿处理 VideoView缓冲/卡顿检测 VideoView在播放网络视频的时候,由于网速原因,可能会出现卡顿情况,我们有2种方式进行检测。 使用VideoView的OnInfoListener监听 自定义监听 通过VideoView

6430

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 663

STM32外部中断与事件机制深度解析:从硬件触发到软件响应

本文深入解析STM32外部中断与事件机制,从硬件触发到软件响应的完整流程。通过对比中断和事件的应用场景、响应速度及配置方法,帮助开发者优化嵌入式系统设计,特别适合需要低功耗或高实时性的项目。

weixin_29175469的博客 409

android videoview 缓冲进度条,android Videoview 缓冲图标显示和进度条更新

VideoView缓冲图标的显示:1.用Handler时刻监听是否在播放:核心代码:VideoView mVideoView;View showPlayerLoading;//缓冲图标Handler handler = new Handler();Runnable runnable = new Runnable() {public void run() {if(!mVideoView.isPlay...

weixin_42160645的博客 1032

ROM和RAM在单片机程序运行理解

ROM和RAM是电子设备中两种核心存储组件,主要区别在于:ROM用于长期存储系统程序、用户文件等固定数据,断电后数据不丢失,但写入速度较慢;RAM则用于临时存储运行中的程序和数据,读写速度快但断电后数据会清空。在单片机中,ROM存储程序代码和常量,RAM存储运行时的变量和数据。两者协同工作,ROM如同"永久档案库"保存必要信息,RAM则像"临时工作台"支持高速运算,共同确保设备正常运行。

qq_37999850的博客 1620

android图标随着进度条动画,【转】android Videoview 缓冲图标显示和进度条更新

转自:http://m.blog.youkuaiyun.com/blog/u014728518/37809323VideoView缓冲图标的显示:1.用Handler时刻监听是否在播放:核心代码:VideoView mVideoView;View showPlayerLoading;//缓冲图标Handler handler = new Handler();Runnable runnable = new Ru...

weixin_42421710的博客 324

Android 11多窗口+分屏+APP窗口嵌套TaskView实现原理一

然而随着版本的迭代升级,google对分屏的定制差异化也越来越大,Androd 11的分屏用的是split-screen-primary和split-screen-secondary的方式,在systemui中去实现的,其定制化的灵活度不是很高,很多业务都是放到sustemui或者fw去实现,但是随着版本的升高,后面出现了TaskView来替代了老版本的分屏方式,但是Task的核心原理其实和之前的方式是一样的,TaskView来实现分屏。

qq_18420641的博客 2615

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android工具之判断uri字符串是否网络资源同时设置进度条第二进度,同时监听播放卡顿

/** * 判断传入数据是否网络资源 * @param uri * @return 是网络资源返回true(其中rtsp是网络直播),不是返回false */ public boolean isNetUri(String uri){ boolean result = true; if(uri!=null){ if(uri.toLowerCase().star

Lingbulei的博客 592

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【转】android Videoview&nbs…

转自:http://m.blog.youkuaiyun.com/blog/u014728518/37809323 VideoView缓冲图标的显示: 1.用Handler时刻监听是否在播放: 核心代码:   VideoView mVideoView; View showPlayerLoading;//缓冲图标  Handler handler = new Handler();

zhuzhixijiang 362

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android视频的操作

通过上面的内容我们已经了解到:SurfaceView 的工作方式是创建一个置于应用窗口之后的新窗口,这种方式的效率非常高,因为 SurfaceView 窗口刷新的时候不需要重绘应用程序的窗口。在之前的课程中,我们接触到的所有的UI控件或者布局都是View的子类,常用的View有布局组件 ConstraintLayout、RelativeLayout 与基本的显示组件ImageView、TextView 等。从API到硬件,再到厂商的兼容性问题,相机开发中需要格外注意的几个点首先要有心理准备。

关注我!带你一路 "狂飙" 到底! 1627

Android 视频播放器 (二):使用MediaPlayer播放视频

在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容。也知道VideoView内部封装的就是MediaPlayer,本文就介绍如何使用MediaPlayer播放视频。 一、简介 MediaPlayer是Android中的一个多媒体播放类,其提供的API能满足简单的大部分音视频的播放需求。 下面简单...

weixin_34235457的博客 839

Android在滚动列表中实现视频的播放(ListView & RecyclerView)

英文原文:Implementing video playback in a scrolled list (ListView & RecyclerView)  本文将讲解如何在列表中实现视频播放。类似于诸如 Facebook, Instagram 或者 Magisto这些热门应用的效果: Facebook:   Magisto:     Instagram...

既是过河之卒,惟有奋力向前。 220

Android视频开发必备:精选MP4测试地址与集成实战指南

在Android多媒体开发中,视频播放与下载是核心功能模块,其稳定性和兼容性直接影响用户体验。理解视频编码原理(如H.264/AAC)和网络传输协议是基础,这决定了播放器能否正确解码与渲染。从技术价值看,一个标准、稳定的测试视频源如同“标尺”,能高效隔离业务逻辑问题,验证播放器兼容性、网络加载及解码性能。在实际应用场景中,开发者常面临测试资源匮乏、格式不兼容或网络环境复杂等挑战。本文围绕Android视频开发,提供了多个亲测有效的MP4测试地址,涵盖不同分辨率、编码格式(如包含MP3音频的测试文件)和网络协

792

Android播放器开发基础(二)

Android播放器开发基础(二) 1. 播发器示例 2. 播放器开发小技巧播发器示例 在VideoView中有开启播放视频的代码修改后如下:注意 :MediaPlayer中没有提供当前播放位置的回调,要主动使用:getCurrentPosition()来获取;播放器状态:从Idle状态到init状态再到prepare或者preparing状态 /** * 开启视频播放

蜗牛壳 582

基于Eclipse的Android应用开发实战:从MVC架构到完整项目构建

Android应用开发的核心在于理解其架构模式与工程化实践。经典的MVC(Model-View-Controller)架构清晰地分离了数据、界面与逻辑,为应用的可维护性奠定了基础。通过模块化设计与异步处理机制,开发者能够构建响应迅速、用户体验良好的应用。在工程实践中,数据持久化方案如SQLite数据库与SharedPreferences,以及多媒体处理如VideoView的视频播放,是实现核心功能的关键技术。这些技术共同支撑了在线教育、内容消费等复杂场景的应用开发。本文以“博学谷”这一综合性学习应用为例,详

weixin_30628801的博客 308

Kotlin中MediaPlayer与ExoPlayer对比实战(性能优化终极指南)

掌握Kotlin视频播放性能优化关键,对比MediaPlayer与ExoPlayer在实际项目中的应用。涵盖缓冲策略、内存管理与格式支持等核心方法,解析ExoPlayer扩展优势与兼容性处理技巧。提升播放流畅度与用户体验的终极指南,值得收藏。

DebugLoom的博客 478

Android视频缓存终极指南:AndroidVideoCache vs 原生缓存谁更胜一筹?[特殊字符]

在移动应用开发中,视频播放体验直接影响用户留存率。AndroidVideoCache作为一款专为Android设计的视频缓存库,通过单行代码即可为任何视频播放器添加缓存支持,让您的应用告别卡顿,实现流畅播放!本文将深入解析AndroidVideoCache的核心优势、使用技巧,并与原生缓存方案进行全方位对比。 ## 为什么选择AndroidVideoCache?🤔 传统视频播放需要反复下载相

gitblog_00822的博客 1045
上一篇: Failed to install xx.apk on device ''xxx“: timeout 解决方法大全!保证有条适合你。
下一篇: Android 异步加载网络图片并缓存到本地
极客公园
博客等级 码龄15年 45粉丝 38原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值