android seekto实现_关于Android VideoView seekTo不准确的问题
本文章为原创,转载时请注明出处
Android播放视频
实现Android的视频播放器,通常有以下几种方式:
1、使用自带的播放器,指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
2、使用VideoView来播放,在布局文件中使用VideoView结合MediaController来实现对其控制。
3、使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。
通过VideoView播放视频的步骤:
1、在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件
2、调用VideoView的如下两个方法来加载指定的视频
setVidePath(String path):加载path文件代表的视频
setVideoURI(Uri uri):加载uri所对应的视频
3、调用VideoView的start()、stop()、psuse()方法来控制视频的播放
4、VideoView通过与MediaController类结合使用,开发者可以不用自己控制播放与暂停
下面针对使用VideoView播放视频时seekTo跳转不准的问题进行解析
使用VideoView
当用户从后台恢复播放时,需要跳转到之前退出的时间点继续播放。
整个控制逻辑大致上是:
在暂停时保存CurrantPosition进度
恢复播放时,调用seekTo方法,传入currantPosition作为参数
但是还是遇到了恢复播放时位置不准的问题,而且甚至有重头开始播放的现象。
问题定位
VideoView的seekTo是异步执行的,会有seek未完成但播放已经开始的现象。需要消除seekTo对恢复播放的影响,应该在seek操作完成的seekComplete回调方法中执行start方法。
VideoView是基于MediaPlayer实现的,但没提供setOnSeekCompleteListener方法
//设置videoview的OnPrepared监听
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//设置MediaPlayer的OnSeekComplete监听
mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
if(isPause){
videoView.start();
isPause = false;
}
}
});
}
});
根本原因
其实seekTo跳转的位置其实并不是参数所带的position,而是离position最近的关键帧。关于视频的关键帧建议大家可以去了解一下相关知识,大致上就是视频播放时需要从一个关键帧的位置开始。
当视频在相应的position位置缺少关键帧的情况下,调用seekTo方法是无法在当前位置开始播放。这时会寻找离指定position最近的关键帧位置开始播放。
解决措施
如何确认是视频源造成的问题,可以采取以下解决措施:
1、替换成满足需求的视频源文件(寻找合格的视频文件)。
2、对视频源文件进行处理,增加其关键帧数量,比如可以1s设置一个关键帧(基于目前已有的视频文件进行处理)。
如果选择第二种方式,要增加视频的关键帧数量,可以推荐大家使用FFmpeg进行增加关键帧的处理工作。 http://ffmpeg.org/
FFmpeg工具相关命令行语句:
ffmpeg.exe -i "D:\in.mp4" -c:v libx264 -preset superfast -x264opts keyint=25 -acodec copy -f mp4 "D:\out.mp4"
命令语句大致意思是:在D盘路径下把in.mp4视频文件每隔25帧设置一个关键帧,音轨保持原视频参数,其余使用FFmpeg提供的default值,最后保存为out.mp4文件到D盘。
总结
在深究问题的原因时不可浅尝而止,也不要一味的怀疑是不是代码造成了问题。很多情况下都选择盲目地替换不同的视频组件出实现,而忽略了视频源文件本身的问题。
不积跬步无以至千里,从当下开始就得养成好的习惯,一点一滴的积累经验。厚积薄发,技术由点汇聚成面,总结很重要,后面会开始很多的文章产出。
android seekto实现_关于Android VideoView seekTo不准确的问题相关推荐
- android edittext不可复制_精选Android中高级面试题:性能优化,JNI,设计模式
性能优化 1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 参考回答:首先我们要清楚图片的三级缓存是如何的: 如果内存足够时不回收.内存不够时就回收软引用对象 2.内存中 ...
- android实例教程_改造Android示例教程
android实例教程 Welcome to Retrofit Android Example Tutorial. Today we'll use the Retrofit library devel ...
- android bp文件_理解Android.bp
介绍Android最新的编译系统 一.简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp.很明显Android.bp的出现 ...
- android seekto实现_关于Android VideoView seekTo不准确的解决方案
本文章为原创,转载时请注明出处 实现 Android 的视频播放,通常有以下几种方式 1.使用自带的播放器,指定 Action 为 ACTION_VIEW,Data 为 Uri,Type 为其 MIM ...
- android安全开发_现代android安全开发
android安全开发 第一次(错误)练习 (1st (Mistake) Practice) Given the "find out how to en-decrypt data in An ...
- java实时获取android网速_获取Android网速的另一种方法
之前,在LOSP4.2上使用的是Android自带的接口来实现获取网速并显示在通知栏,可是到了4.3以后发现这个接口无论如何,返回值都是-1,无奈之下只得另寻办法 功夫不负有心人,我还是找到了一个方法 ...
- android token机制_对Android 中的 ANR 进行详解
前言 关于ANR,以前只知道Activity.BroadCastReceiver.Service三种组件的ANR时限.一般采用哪些方式避免ANR.以及通过data/anr/traces.txt去分析A ...
- android模糊检索_【android学习笔记】ormlite学习之模糊搜索like
[目标]实现表中多个字段模糊搜索. [方法]ormlite like方法 :like(columnName,pattern) 使用%通配符来匹配,指定行数据,返回匹配到的结果 使用示范:mDao ...
- android获取ro._修改Android序列号(Serial Number)
文档说明 本文档以SC806-CN-00-71(msm8909平台 Android7系统)为例,描述如何修改Android Serial Number. Serial Number说明 菜单 Abou ...
最新文章
- 100%的程序员都想挑战的算法趣题!| 码书
- 深入浅出HTTPS基本原理
- 趣谈网络协议笔记-二(第十六讲上)
- 全面改用HTML5+CSS3来架构
- Navicat for Oracle实现连接Oracle
- 为什么回归问题用MSE?
- 将python中的小数直接进位的函数_python保留小数位的三种实现方法
- 使用struct与typedef定义结构体
- 管理新语:会议与问题的关系
- 面向对象编程(OOP)的基本思想
- 一张图让你掌握测试人员能力模型及研发测试流程规范
- IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
- Matlab学习报告 20-12-08
- 浅析独角兽企业为什么备受资本青睐?
- 迁移学习(Transfer Learning)-- 概念理解
- 为何泽塔云GPU云能做到“云端的图形工作站,本地一致的使用体验”?
- 【Arduino】APDS9960S手势模块控制馨品窗帘电机并在5110屏中显示指令
- 次短路(两种方式) 第K短路
- 如何创业系列1:创业四要素
- 评选最牛群主v1.0
热门文章
- 【 使用 Arduino 和 L293D 电机驱动器 IC 控制直流电机】
- mac计划启动事件-alarm.user-visible-Weekly Usage Report
- java面试题 英文_JAVA面试题和答案(英文版).pdf
- ffmpeg格式转换之MP4转mov
- 当Kotlin完美邂逅设计模式之单例模式(一)
- 软件工程师适合去芯片公司吗?
- JavaBean下的注册和登录实现——Web开发
- 如何删除桌面上的回收站?
- [Professor麦]浅谈Mybatis内置数据源
- 四叶草的python代码_驾校一点通2021科目四_科目四安全文明驾驶_科目四模拟考试2021...