有时候我们在播放视频的时候需要对视频进行seekTo处理。通过videoPlayer或者mediaPlayer的seekTo方法理论上是可以简单的实现。

public native void seekTo(int msec) throws IllegalStateException;

可以看出我们只需要传入一个视频对应的毫秒数就可以直接对视频进行seek。

但是实际上通过一个seekBar来进行测试时发现效果和想象中完全不一致,感觉有严重的跳帧,简单说就是只会seek到很少的特定帧数上而不是能seek到视频的每一帧,于是开始各种百度。最后发现了原因。

在每次seekTo方法调用后,MediaCodec必须从关键帧开始解码。因此seekTo方法只会seek到最近的/上一个/下一个关键帧,也

就是I-Frame(key frame = I frame = sync frame)。之所以要从关键帧开始解码,是因为每一帧不一定是单独编码的,只有I frame才是

帧内编码,而P, B frame都是要参考别的帧来进行编码,因此单独拿出来是不完整的一帧。

因为一般视频都是隔几秒存在一个关键帧,而一秒有24以上的帧数,这样就会导致seekTo效果相当不好。

那么问题来了,应该怎么解决呢。

办法一:seekTo到某一个帧而不是关键帧,需要自己解码渲染图片,而且不确定是否有效。执行效率也不稳定,成本高。

办法二:从源头上解决,增加视频的关键帧。但是会增加视频容量大小。

这两个方法显而易见在自己提供资源的情况下,办法二还简单粗暴很多。我在这里采用的就是这种方法。至于增加关键帧的方法有很多现成的软件可以使用,这里推荐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盘。

关于关键帧,我还遇到了另外一种情况。

如果你想从视频中获得到一张缩略图,系统同样提供了现成的API,只需要传入一个对应的毫秒数就可以了,但是和猜想的一样,这个缩略图同样也只能从关键帧中进行获取。以下是对应的工具类。

private static ExecutorService executor = Executors.newFixedThreadPool(1);private static MediaMetadataRetriever retriever;public static void AsyncGetBitmapsFromVideo(final Handler handler, String path, final int position, final ImageView imageView) {retriever = new MediaMetadataRetriever();retriever.setDataSource(path);/*** OPTION_PREVIOUS_SYNC,在给予的时间戳之前获取同步帧OPTION_NEXT_SYNC,在给予的时间戳之后获取同步帧OPTION_CLOSEST_SYNC,在给予的时间戳附近OPTION_CLOSEST,可能返回一个同步或者不同步的帧,但是是在这个时间戳附近,并且对于系统性能的开销比较大*/executor.execute(new Runnable() {@Overridepublic void run() {final Bitmap bitmap = retriever.getFrameAtTime(position * 1000 * 1000, MediaMetadataRetriever.OPTION_NEXT_SYNC);int px40 = PublicUtils.dip2px( 20);final Bitmap newBitmap = ThumbnailUtils.extractThumbnail(bitmap, px40, px40);if (bitmap!=null)handler.post(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(newBitmap);}});}});}

这里使用了多线程是为了提高性能,最主要的是为了不阻塞UI,由于需要截取多张图片,因此图片的顺序很重要,所以这里才用了线程池来进行操作,并且设置最大线程数为1,经过测试如果同时开启多根线程进行操作会导致截出的图片丢失或者顺序错乱。

Android笔记之seekTo相关推荐

  1. Android 笔记之 R 文件

    Android笔记之R文件 阅读目录 介绍 R 文件的内容 介绍 通过 R 文件引用资源 一.R 文件的内容 在 Android Studio 中 R 文件位于 app -> build -&g ...

  2. Android笔记 fragment的生命周期

    demo执行顺序 10-22 20:38:10.281: I/System.out(26337): onAttach     附加到Activity  10-22 20:38:10.281: I/Sy ...

  3. android listview替代,Android笔记——RecyclerView替代ListView

    ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...

  4. Android笔记:触摸事件的分析与总结----多点触控

       其他相关博文:    Android笔记:触摸事件的分析与总结----MotionEvent对象    Android笔记:触摸事件的分析与总结----TouchEvent处理机制     An ...

  5. Android笔记:判断是否为模拟器(实测夜神通过)

    因为不确定因素太多,最近公司需要禁止本程序在虚拟机上运行. 我网上找了好多,各种方法什么设备号,拨打电话,蓝牙设备,模拟器的检测往往是防作弊中的重要一关,这里把这两天收集到的代码写在这偏文章里,和大家 ...

  6. Android笔记【3】---多媒体播放/广播与服务

    Android笔记[3]-多媒体播放/广播与服务 1.音乐播放 (1)创建MediaPlayer媒体播放器 存储在应用程序的res资源中的音乐文件,使用create()方法创建MediaPlayer对 ...

  7. Android 笔记:识别银行卡,获取银行卡卡号

    这个demo是用的card.io 提供的SDK,识别准确率比较高 先看一下效果图: 扫描界面: 识别成功界面 开始界面 在这里说一下集成的两种方式, 1.直接把途中的文件解压开复制到工程目录下的lib ...

  8. Android 笔记:BroadcastReceiver

    1 是什么 2 怎么用 3 两种注册方式 4 两种类型 5 生命周期 6 注意事项 复制代码 前言 BroadcastReceiver是什么? --- 广播(通知消息)接收器 在Android的API ...

  9. Android笔记:防反编译、代码混淆中,解决第三方jar包不被混淆的一些心得,及gson防混淆方法...

    为了防止代码被反编译,一般在签名导出前需要对代码进行混淆.最近发现自己的一个项目工程在代码混淆后,使用中出现了异常.以下是自己这几天在解决代码混淆以及引入第三方jar包导致混淆出现的问题处理的一些心得 ...

最新文章

  1. 图像的亮度和对比度区别
  2. axios 登录后设置header_axios如何利用promise无痛刷新token
  3. PyTorch基础(part8)--LSTM
  4. 从业务需求抽象成模型解决方案
  5. Codeforces 343D Water Tree(DFS序 + 线段树)
  6. 吸收塔如何提高吸收率_缺钙了该如何补钙?饮食补钙更健康
  7. 数据库基础(2):简单查询和连接查询
  8. 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。
  9. JavaScript - textarea 滚动至顶部或底部
  10. win7电脑网站服务器,Win7系统
  11. Java 识别读取pdf中的二维码信息
  12. SRE稳定性指标:MTBF、MTTR
  13. asuswrt 单臂路由_Padavan(老毛子) 最简单臂路由组网 VLAN 设置
  14. 初创公司几个投资人,各占多少股份合适?
  15. 下载链接在微信中无法打开的解决方案
  16. python 山脊图_纯Python绘制艺术感满满的山脊地图,创意满分
  17. Python--几种set集合去重的方法
  18. c语言数码管中断器,数码管动态显示 定时器中断 数码管动态显示不正常
  19. 根据数据库中的出生年份计算年龄
  20. fiddler如何看

热门文章

  1. 麦满分免费早餐力挺高考考生
  2. python定义变量参数_Python变量定义与使用
  3. 三步搞定esxi硬盘直通(RDM)
  4. 小心 MSHTA漏洞为黑客大开远程控制之门
  5. 将一下 prototype 是什么东西,原型链的理解,什么时候用 prototype
  6. 代码调试技巧小集合(雨中飞燕出品)
  7. 520到了还有人不会表白吗——Python GUI实现爆火抖音的弹窗表白
  8. 编程猫python课程结束后哪里再学更高级别的_编程猫“敏于新,精于质”课程迭代比赛结束,离更有价值的教育又近一步...
  9. 微型计算机5 GT 3,GT simulator3手册.pdf
  10. 腾讯云对象存储功能的使用