最近工作中碰到一个问题,关于播放器播放一段视频的需求,因此查找了一些方案,在此记录一下。

背景介绍

客户在设备上把一段视频(好了,就是广告了)当作屏保进行播放,但是点击屏幕进入系统时时要退出屏保播放,进入我们的应用,然后再次进入屏保时继续进行视频播放,并且要从上次退出时播放的位置顺序播放向后循环播放。

这样一段需要,本身用Android自带的MediaPlayer或者MediaCodec进行即可播放,但是涉及到再次进入屏保应用时,还要seekto到上次播放的位置,这里就出现一个seekto不准的小问题,客户无法接受。接触音视频比较多的童鞋都知道,当要seekto到一个位置时,当前帧可能不是关键帧。所以要从该位置播放时就需要从该帧之后最近的一个关键帧开始,这时播放的位置可能不是客户想要的。假设上次播放退出时是00:00:57的位置,但是离这个位置最近是在00:00:59的位置,这时MediaPlayer播放的位置是从00:00:59开始的,客户说这个差距太大了,无法接受。那既然是恰饭人,只能想办法满足客户的需求了。那就从Seekto开始一次冒险之旅吧。

SeekTo介绍

Android播放器自己维护一个状态机,如下图:

如果不熟悉的,建议自行补救(https://developer.android.com/reference/android/media/MediaPlayer)

官网描述:播放时,可以通过seekto调整播放的位置,API 26之前只需要一个参数int msec,但是API 26之后则需要传入两个参数(long msec, int mode)。两个参数分别为时间戳和跳转模式。

Tips:查看MediaPlayer的状态图可以看到seekTo可以在其他状态下调用,例如Prepared,Paused和PlaybackCompleted状态。 在这些状态下调用seekTo时,如果流中有视频并且请求的位置有效,则将显示一个视频帧。

关键帧

学习过视频压缩概念的都知道:在视频压缩概念中,视频序列的每帧都代表一幅未压缩的静止图像。而在传输或者存储时,会采取各种算法或者标准进行数据压缩,以便能够最大可能的减少数据的冗余容量。而在播放的时候就是解压缩或者解码过程。其中涉及到视频帧的类型有I帧、P帧、B帧,这些就是最常见的,最基本的概念。

简单地说,I帧是关键帧,一般属于帧内压缩、帧内编码,独立主义者,不依赖其他视频帧。而P帧是向前搜索的意思,它需要向前找离它最近的I帧作为参考后进行解码。B是双向搜索,就是需要向前、向后两个方向进行参考再进行解码。P帧和B帧都是基于I帧来压缩数据。

参考别的大牛画的图:

其他相关概念大家自行补充,不再累述。

解决方案

现在大家基本上对该问题有一点了解了,剩下就是解决掉他,盘他。

方案一:

最初,我们查找谷歌的官网,看是否有足够的api可以调用,最小化的代价解决该问题,就查到了seekto的不同模式切换的描述,选择SEEK_CLOSEST进行尝试,有效果,但是给客户看了一下,客户点了一下头,但是略有不甘,是否可以更好呢?

方案二:

只能再查资料,重新确定方案了,Google过程中有发现以下大佬做的优化,

https://blog.csdn.net/u012963909/article/details/50457087

我们也进行尝试,但是如果仅仅针对一个文件,到时还可以进行FFMPEG转换,增加I帧的方式进行提升,但是屏保广告,客户定期会更换的呀。总不能每次都进行转换吧?

客户点了半下头转摇头了。

方案三:

这时我们重新分析流程,查看客户使用场景,分析我们应用之间的调用关系,然后整理思路。。。。

噔 噔噔噔(windows XP开机了)

因为屏保进入和退出都是由我们自己控制的,无非退出时将屏保activity放置后台了,那我们可以将MediaPlayer尽心pause动作,再次进入时进行restart操作,就实现原地暂停、原地播放的效果了?如果后台activity被回收、或者异常退出,则用第一种方案seekto到比较近的地方进行播放。这样既可以实现快速进入快速查看,异常退出也可以比较近的位置查看效果。

之后我们紧急做了demo,并演示给客户看,客户点了三下头。貌似接受了。

到此这个问题就处理完成。

总结

作为职场恰饭人,客户就是上帝,这个句话属于被迫的,也是我们前进的动力,当我们无法改变时,只能快速排查,寻找最优的解决方案。

碰到问题时:

第一,先查官网,毕竟类似问题可能官网已经有解决方案了。

第二,无法满足时,及时分析使用场景,查看是否用其他的方案来绕过该难点问题,不断切割使之变成新的更小、更容易的问题,这样处理难度就会降低。

音视频问题汇总--播放器seekto功能优化相关推荐

  1. 【音视频】ijkplayer播放器参数说明文档

    [音视频]ijkplayer播放器参数说明文档 pragma mark - IJKMediaPlayback #pragma mark 通知IJKMPMediaPlaybackIsPreparedTo ...

  2. Qt音视频开发26-ffmpeg播放器

    一.前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件 ...

  3. 知识付费音视频和直播播放器

    知识付费音视频播放和直播业务是使用基于浏览器环境的阿里云Web播放器SDK(Web Aliplayer SDK)为技术载体. 阿里云Web播放器SDK,支持Flash和H5两种播放技术,Flash模式 ...

  4. 微信小程序,分享如何封装一个全局支持暂停,拖动等各类操作的音视频等多媒体管理器

    不知不觉埋头于业务已许久,距离上一篇分享应该很久很久以前,具体何时,已无从知晓.慢慢的开始觉得锅有点热,感觉呼吸有点困难,温水里面的青蛙趁着腿还没完全麻木的时候,也想着开始重拾旧梦,稍微往上蹬蹬,好了 ...

  5. Elmedia Player - Mac 上最好用的音视屏媒体播放器

    Elmedia Player - Mac 上最好用的音视屏媒体播放器 Elmedia是macOS的富媒体播放器,支持多种文件格式,包括大多数视频和音频.一些支持的文件类型包括FLV, SWF, WMV ...

  6. Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频 ...

  7. html5仿抖音全屏播放,仿抖音视频全屏播放滑动切换

    1 前言 随着移动技术的快速迭代,数据流量费用的快速下降,视频.直播正成为全民的媒体盛宴,我司必然也不会缺席此次盛宴,这里讲述的是通过h5实现仿抖音视频全屏播放&滑动切换的效果,供我司直播鉴定 ...

  8. 音视至尊MP5播放器

    此音视至尊MP5播放器是一款可以直接播放RM,RMVB等格式在内的所有网络电影,支持电子书阅读,支持SD/MMC/MS/XD CARD扩展的3.0寸宽大高清晰MP5播放器,画质流畅动感,音质原汁原味, ...

  9. Android开源音乐播放器之播放器基本功能

    系列文章 Android开源在线音乐播放器--波尼音乐 Android开源音乐播放器之播放器基本功能 Android开源音乐播放器之高仿云音乐黑胶唱片 Android开源音乐播放器之自动滚动歌词 An ...

最新文章

  1. 在析构函数中delete this指针问题
  2. SAP MM 采购申请中的物料组字段改成Optional
  3. c语言115写成16进制,C语言指针问题
  4. 书店POS机--细化迭代1--测试
  5. HTML5之placeholder属性以及如何更改placeholder属性中文字颜色大小位置
  6. HDU - 5978 To begin or not to begin(简单博弈)
  7. 使用Angular可重用Component思路实现一个自带图标(icon)的input控件
  8. C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
  9. console java_Java Console format()方法与示例
  10. datatables 配套bootstrap样式使用小结(2) ajax篇
  11. Google 又有新动作了
  12. 中兴网管无法连接服务器怎么办,中兴传输网管系统问答
  13. 计算机专业初试,2019初试-计算机专业基础综合-考试大纲
  14. IP地址的定义及分类
  15. 奇安信前三季营收31.9亿:同比增19% 扣非后净亏13.6亿
  16. 数据库和SpringBoot
  17. Go: 内置net/http库解析
  18. Windows Filtering Platform Windows筛选平台
  19. 东野圭吾《解忧杂货店》读后感
  20. FileZilla Server源码分析--大漠落日5节

热门文章

  1. C语言判断(条件)语句基础入门教学
  2. Unity 客户端简单框架(手游)
  3. 《微信小程序商城开发实战》笔者的新书,欢迎各位粉丝上京东购买
  4. WinForm开发(74)——contextMenuStrip(3)——contextMenuStrip开发笔记
  5. behave java_BDD模式-Python behave的简单使用
  6. IntelliJ IDEA Live Temlates功能使用举例介绍
  7. Java 获取两个月份之间的所有月份(含跨年)
  8. 杭电oj2201 熊猫阿波的故事题解
  9. 给大家推荐一本Java教程(《Java语言程序设计》清华大学出版社 2006年1月第一版)
  10. 中兴AC2746 usb接口的3G上网卡