本文章为原创,转载时请注明出处

实现 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.调用 start()、stop()、pause()方法来控制视频的播放

4.通过与 MediaController 类结合使用,开发者可以不用自己控制播放与暂停

调用 seekTo 方法跳转不准的问题

典型场景:

当用户从后台恢复播放界面时,需要跳转到之前退出的时间点继续播放原来的视频。其实现逻辑大致上是:

在暂停时保存当前 VideoView 的 currantPosition 进度

恢复播放时,调用 seekTo 方法,传入 currantPosition 作为跳转参数

按照官方提供的 API 来看,这是最合理的使用方式。但在某些情况下,我们会遇到视频恢复播放时进度位置不准的问题,甚至有些会重头开始播放。

下面就针对使用 VideoView 播放视频时 seekTo 跳转不准的问题进行分析。

问题定位

1. 消除方法异步执行的影响

首先明确一点: *** VideoView 的 seekTo 方法是异步执行的***,因此会有 seek 未完成但播放已经开始的现象。需要消除 seekTo 对恢复播放的影响,应该在 seek 操作完成的 seekComplete 回调方法中执行 ViedeoView 的 start 方法。

Tip: seekComplete 属于 MediaPlayer 类的 OnPreparedListener 监听器的一个回调方法。虽然 VideoView 是基于 MediaPlayer 实现的,但没提供 setOnSeekCompleteListener 设置监听器的方法,所以我们要拿到 VideoView 内部持有 MediaPlayer 对象。

// 设置 VideoView 的 OnPrepared 监听,拿到 MediaPlayer 对象。

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

@Override

public void onPrepared(MediaPlayer mp) {

//设置 MediaPlayer 的 OnSeekComplete 监听

mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {

@Override

public void onSeekComplete(MediaPlayer mp) {

// seekTo 方法完成时的回调

if(isPause){

videoView.start();

isPause = false;

}

}

});

}

});

2. 消除视频源的问题

其实 seekTo 跳转的位置其实并不是参数所带的 position,而是离 position 最近的视频关键帧。

关于视频关键帧建议大家可以去了解一下相关知识,大致上就是视频播放时需要从一个关键帧的位置开始。

所以当视频在跳转到相应的 position 位置缺少关键帧的情况下,调用 seekTo 方法是无法在当前位置开始播放。这时会寻找离指定 position 最近的关键帧位置开始播放。

关于视频源造成的问题,可以采取以下解决措施:

替换成满足需求的视频源文件(寻找合格的视频文件)

对视频源文件进行处理,增加其关键帧数量,比如可以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不准确的解决方案相关推荐

  1. android edittext不可复制_精选Android中高级面试题:性能优化,JNI,设计模式

    性能优化 1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 参考回答:首先我们要清楚图片的三级缓存是如何的: 如果内存足够时不回收.内存不够时就回收软引用对象 2.内存中 ...

  2. android实例教程_改造Android示例教程

    android实例教程 Welcome to Retrofit Android Example Tutorial. Today we'll use the Retrofit library devel ...

  3. android bp文件_理解Android.bp

    介绍Android最新的编译系统 一.简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp.很明显Android.bp的出现 ...

  4. android seekto实现_关于Android VideoView seekTo不准确的问题

    本文章为原创,转载时请注明出处 Android播放视频 实现Android的视频播放器,通常有以下几种方式: 1.使用自带的播放器,指定Action为ACTION_VIEW,Data为Uri,Type ...

  5. android安全开发_现代android安全开发

    android安全开发 第一次(错误)练习 (1st (Mistake) Practice) Given the "find out how to en-decrypt data in An ...

  6. java实时获取android网速_获取Android网速的另一种方法

    之前,在LOSP4.2上使用的是Android自带的接口来实现获取网速并显示在通知栏,可是到了4.3以后发现这个接口无论如何,返回值都是-1,无奈之下只得另寻办法 功夫不负有心人,我还是找到了一个方法 ...

  7. android token机制_对Android 中的 ANR 进行详解

    前言 关于ANR,以前只知道Activity.BroadCastReceiver.Service三种组件的ANR时限.一般采用哪些方式避免ANR.以及通过data/anr/traces.txt去分析A ...

  8. android模糊检索_【android学习笔记】ormlite学习之模糊搜索like

    [目标]实现表中多个字段模糊搜索. [方法]ormlite like方法 :like(columnName,pattern)    使用%通配符来匹配,指定行数据,返回匹配到的结果 使用示范:mDao ...

  9. android获取ro._修改Android序列号(Serial Number)

    文档说明 本文档以SC806-CN-00-71(msm8909平台 Android7系统)为例,描述如何修改Android Serial Number. Serial Number说明 菜单 Abou ...

最新文章

  1. 仅需1/5成本:TPU是如何超越GPU,成为深度学习首选处理器的
  2. DinnerNow - 如何安装部署
  3. MySql乱码解决(五)
  4. PyQt5 技术篇-设置窗口置顶不生效问题原因,setWindowFlags()设置参数后不生效解决办法
  5. 4.1.1 初识文件管理
  6. 二叉树的建立与遍历_51、二叉树遍历-重建二叉树JZ4
  7. 创建一个Django项目
  8. httphandler防图片盗链
  9. qt编写mysql导出excel_Qt编写数据导出到Excel及Pdf和打印数据
  10. python 文本转excel_如何使用python将txt文件中的数据转换为Excel文件
  11. C语言里程序编译无误但运行会弹出程序已停止运行是为什么?
  12. 服务器显示504,帮您解决win7系统访问nginx服务器提示504 Gateway Time-out错误的修复技巧...
  13. 网络游戏(MMORPG) 好玩的原因
  14. 《苏菲的世界》读书笔记之一:自然派哲学家
  15. [JSOI2009]有趣的游戏
  16. 面试官问:浏览器输入 URL 回车之后发生了什么?
  17. 计算机系统结构复习(四):Pipelining流水线
  18. 法国英语计算机硕士,法国留学 |无须法语成绩,巴黎高等电信学院2021年入学英文授课项目盘点~...
  19. 成都东软学院2016年ACM冬季校赛正式赛 - 题解
  20. 混合云——企业的最佳解决方案?

热门文章

  1. 润达软件恭祝大家2018春节快乐!
  2. 商务旅行,保护个人信息安全,需要遵守的基本原则
  3. Tensorflow 2.x(keras)源码详解之第七章:keras中的tf.keras.layers
  4. c语言脸型图案,终于知道自己是什么脸型了,太实用了!
  5. Running Being
  6. php添加一维数组,PHP将多维数组数组键附加到一维数组
  7. 此对象非彼对象(面向对象)1
  8. 网站策划常识[转载]
  9. Linux expr 命令
  10. 修改亮度、对比度、色调、饱和度,达到预期效果