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

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不准确的问题相关推荐

  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 的视频播放,通常有以下几种方式 1.使用自带的播放器,指定 Action 为 ACTION_VIEW,Data 为 Uri,Type 为其 MIM ...

  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. 100%的程序员都想挑战的算法趣题!| 码书
  2. 深入浅出HTTPS基本原理
  3. 趣谈网络协议笔记-二(第十六讲上)
  4. 全面改用HTML5+CSS3来架构
  5. Navicat for Oracle实现连接Oracle
  6. 为什么回归问题用MSE?
  7. 将python中的小数直接进位的函数_python保留小数位的三种实现方法
  8. 使用struct与typedef定义结构体
  9. 管理新语:会议与问题的关系
  10. 面向对象编程(OOP)的基本思想
  11. 一张图让你掌握测试人员能力模型及研发测试流程规范
  12. IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
  13. Matlab学习报告 20-12-08
  14. 浅析独角兽企业为什么备受资本青睐?
  15. 迁移学习(Transfer Learning)-- 概念理解
  16. 为何泽塔云GPU云能做到“云端的图形工作站,本地一致的使用体验”?
  17. 【Arduino】APDS9960S手势模块控制馨品窗帘电机并在5110屏中显示指令
  18. 次短路(两种方式) 第K短路
  19. 如何创业系列1:创业四要素
  20. 评选最牛群主v1.0

热门文章

  1. 【 使用 Arduino 和 L293D 电机驱动器 IC 控制直流电机】
  2. mac计划启动事件-alarm.user-visible-Weekly Usage Report
  3. java面试题 英文_JAVA面试题和答案(英文版).pdf
  4. ffmpeg格式转换之MP4转mov
  5. 当Kotlin完美邂逅设计模式之单例模式(一)
  6. 软件工程师适合去芯片公司吗?
  7. JavaBean下的注册和登录实现——Web开发
  8. 如何删除桌面上的回收站?
  9. [Professor麦]浅谈Mybatis内置数据源
  10. 四叶草的python代码_驾校一点通2021科目四_科目四安全文明驾驶_科目四模拟考试2021...