1. 背景

今天TV产品优化,发现一个难以修改的问题,使用gsyVideoPlayer的时候,切换的是系统内核播放视频,然后遥控器在控制快进快退的时候会有进度条回退的问题,这对用户就不友好了啊。

2. 原因探究

调查了之后发现,是因为关键帧的问题,快进的时候是按照视频的关键帧来进行快进的,如果视频背压缩的过于严重会导致视频的关键帧比较少,那么就会出现以下这种情况:

现在播放到8秒,你要快进到18秒,但是视频的关键帧在第15秒,那么进度条就会从18退到15,因为进度条是按照真实的视频进度来进行走动的。

3. 解决方案

知道了原因之后那么有两种方案:

方案一:从系统内核切换到Exo内核,因为我发现三种内核都测试过之后,Exo内核对于关键帧的处理更好,基本上不会出现快进回退的问题。

方案二:维持原有的系统内核,禁用gsyVideoPlayer原有的进度条展示,自己实现进度条,时间的展示。

4. 实现

4.1 方案一测试(失败)

采用了之后播放.mp4视频一点问题没有,非常流畅,实现了我想要的效果,但是现网的视频后缀是.m3u8格式的,使用Exo内核播放之后,报了如下错误:

05-18 11:26:07.632: E/ExoPlayerImplInternal(10506): Source error.
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506): com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor) could read the stream.
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506):     at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:927)
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506):     at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:849)
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506):     at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:320)
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-18 11:26:07.632: E/ExoPlayerImplInternal(10506):     at java.lang.Thread.run(Thread.java:841)
05-18 11:26:07.632: E/EventLogger(10506): playerFailed [0.78]
05-18 11:26:07.632: E/EventLogger(10506): com.google.android.exoplayer2.ExoPlaybackException
05-18 11:26:07.632: E/EventLogger(10506):   at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:349)
05-18 11:26:07.632: E/EventLogger(10506):   at android.os.Handler.dispatchMessage(Handler.java:98)
05-18 11:26:07.632: E/EventLogger(10506):   at android.os.Looper.loop(Looper.java:136)
05-18 11:26:07.632: E/EventLogger(10506):   at android.os.HandlerThread.run(HandlerThread.java:61)
05-18 11:26:07.632: E/EventLogger(10506): Caused by: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor) could read the stream.
05-18 11:26:07.632: E/EventLogger(10506):   at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:927)
05-18 11:26:07.632: E/EventLogger(10506):   at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:849)
05-18 11:26:07.632: E/EventLogger(10506):   at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:320)
05-18 11:26:07.632: E/EventLogger(10506):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-18 11:26:07.632: E/EventLogger(10506):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-18 11:26:07.632: E/EventLogger(10506):   at java.lang.Thread.run(Thread.java:841)
05-18 11:26:07.632: D/EventLogger(10506): loading [false]

这个报错看了半天,主要意思是说Exoplayer中没有可用的解析器,然后我去找了解决办法,说是需要设置如下代码:

//EXOPlayer内核,支持格式更多
PlayerFactory.setPlayManager(Exo2PlayerManager.class);//exo缓存模式,支持m3u8,只支持exo
CacheFactory.setCacheManager(ExoPlayerCacheManager.class);

试了并不行,不知道是我的问题还是播放器的问题,最后也没找到解决办法,直接放弃。

4.2 方案二测试(可行)

首选我继承StandardGSYVideoPlayer创建了一个新的Player,然后重写其中的 setTextAndProgress方法,将super.setTextAndProgress(secProgress);方法注释掉即可,运行发现进度条不走,当前时间跟总时间一直在00:00.,然后只需要自己写一个计时器,让进度条每隔1s刷新一次将当前时间跟进度更新掉就好。写到这我就在想另外一个问题,它本身已经写了一个计时器了在更新进度了,我在写一个控制岂不是多余了嘛?本着不重复造轮子的态度,我进行了如下改动:

 /*** 处理快进快退问题* @param isForward*/public void step(boolean isForward) {if (!getGSYVideoManager().isPlaying()) {PLog.i("fastForward is not playing");getStartButton().callOnClick();}int videoLength = (int) getGSYVideoManager().getDuration();if (videoLength == -1) {return;}int size = videoLength / LENGTH;// LENGTH快进快退的步长final int[] postion = new int[size + 2];postion[size + 1] = videoLength;for (int i = 0; i <= size; i++) {postion[i] = LENGTH * i;}mBottomContainer.setVisibility(VISIBLE);if (isForward) { // 快进if (mCurrentPosition == videoLength) {setProgress(videoLength, videoLength);return;}for (int i = 0; i < postion.length; i++) {if (postion[i] - mCurrentPosition > 0) {PLog.i("forwart postion=" + postion[i]);setProgress(postion[i], videoLength);getGSYVideoManager().seekTo(mCurrentPosition);break;}}} else { // 快退if (mCurrentPosition == 0) {setProgress(0, videoLength);return;}for (int i = 0; i < postion.length; i++) {if (postion[i] - mCurrentPosition >= 0) {setProgress(postion[i - 1], videoLength);getGSYVideoManager().seekTo(mCurrentPosition);break;}}}}/*** 快进快退 自己控制 进度条 避免快进 回退问题** @param position* @param videoLength*/public void setProgress(int position, int videoLength) {mCurrentPosition = position;int progress = (int) (mCurrentPosition / (videoLength / 100));mProgressBar.setProgress(progress);mTotalTimeTextView.setText(CommonUtil.stringForTime(videoLength));mCurrentTimeTextView.setText(CommonUtil.stringForTime(position));mHadler.postDelayed(new Runnable() {@Overridepublic void run() {mBottomContainer.setVisibility(GONE);}}, 500);}@Overrideprotected void setTextAndProgress(int secProgress) { // 避免关键帧 回退的问题if (!mProgressBar.isShown()) {super.setTextAndProgress(secProgress);}}

我做了一个假象,在进度条展示的时候,我会按照自己分割的关键帧去快进快退,这样控制强行让进度条永远按照你想要的方向走,但是当500ms进度条消失之后,我让进度条按照gsyVideoPlayer原有的计时器进行更新,这样我不仅省了一个计时器并且实现了了想要的效果,进度条在显示的时候永远不会回退,消失之后可能会有稍微回退,但是用户看不到了,问题应该不大。

5. 总结

最后还是希望不要将视频压缩的太过严重,关键帧太少,视频清晰度降低,对用户的体验更不好,在用户能看到的地方一定要将体验做好,可以在看不到的地方做优化,本次优化主要针对于遥控器控制的快进快退,手机开发的小伙伴可以借鉴下思路。

6. 参考

1. https://blog.csdn.net/yhroppo/article/details/104494850

2. github地址 :https://github.com/CarGuo/GSYVideoPlayer

3. https://github.com/CarGuo/GSYVideoPlayer/issues/1302

Android TV使用gsyVideoPlayer快进操作视频会回退相关推荐

  1. android 仿 tv 菜单,Android TV 开发之仿泰捷视频最新 TV 版 Metro UI 效果

    Some Android TV related Sample 更多TV相关,欢迎关注公众号: Android TV开发交流群:135622564 1.Imitation of tai jie late ...

  2. html5怎么设置视频快进,如何在剪映APP中给视频设置快进效果

    如何在剪映APP中给视频设置快进效果 今天给大家介绍一下如何在剪映APP中给视频设置快进效果的具体操作步骤. 1. 打开手机上的剪映APP,进入主页面后,点击页面上的开始创作,然后选择想要设置的视频导 ...

  3. html5、微信 无法快进、video currentTime 设定失效、重头开始播放。

    本地资源无法快进 今天工作中根据需求要求将本地视频,快进到一定时间再播放.结果发现了一个坑 问题: 无法快进 <!DOCTYPE html> <html><head> ...

  4. Android tv 导航页面,android6.0 TV 添加自定义导航栏

    Android TV 通常是用遥控器操作的,系统导航栏都是关闭的,但带触摸的TV就很有必要加上导航栏了. 1. 修改base/core/res/res/values/config.xml base/c ...

  5. Android TV 快进帧预览

    前言 入职新公司,刚接手的AndroidTV项目,初次接触TV开发,被各种骚东西搞得头皮发麻,写点东西记录一下. 正文 MediaMetadataRetriever 1. 获取视频帧的关键类:Medi ...

  6. Android播放视频快进帧预览图完美解決方案

    播放视频快进预览图完美解決方案,使用方法如下,使用FFmpeg,不影响原有播放器, 就是先截取缩略图保存下来,快进时选用图片显示,最优方案,播放性能最好,体验完美. 参考github: https:/ ...

  7. 笔记:android TV开发 长按 连续快进, 长按结束停止快进

    最近做播放器,有个需求,当焦点在一个按钮上,长按确认键执行连续快进,长按结束停止快进 private boolean isLongPress; private ScheduledExecutorSer ...

  8. 腾讯视频客户端如何设置快进速度

    今天小编给大家分享"腾讯视频客户端如何设置快进速度".大家都知道腾讯视频作为中国最大的视频分享网站,它有非常全面的视频资源.而我们只要通过下载这个客户端,就可以完全的将这些视频尽收 ...

  9. 腾讯视频app官方下载_腾讯视频怎么快进

    腾讯视频pc端和手机端都支持通过频道推荐.观看历史.加入看单.搜索功能快速找到想看的视频.腾讯视频客户端支持边下载边观看.云同步记录等贴心功能,腾讯视频给您带来更高品质享受.腾讯视频播放器精致小巧且免 ...

  10. 小程序禁止左右拖动_网课视频快进小技巧

    目前很多网课教程网站都是采取播放内嵌Flash视频课件进行教学的方式,且绝大部分屏蔽了视频快进(倍进)播放功能,只能等待整段视频缓冲完成后才可对视频时间轴进度条进行拖拽操作,加上网站课件视频缓冲速度较 ...

最新文章

  1. Python setup.py开发与安装
  2. C++实现N选R的实现算法(附完整源码)
  3. HDU_4014 Discont (water~)
  4. C++11遍历map
  5. 快速的找出元素是否在list中 python
  6. jvm 安装位置_简单了解JVM
  7. Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)...
  8. 结对项目——数独扩展
  9. 远程管理 Mac OSX 设备
  10. Node.js入门(二)
  11. 信息安全实训——神奇的木马
  12. 生物信息学:根据PDB名称、爬虫PDB数据库的信息、保存到Excel里
  13. python C语言加速
  14. Android8怎么格式化内存卡,安卓手机怎么格式化内存卡
  15. 如何删除windows 10系统桌面的所有快捷图标
  16. CANopen协议 学习笔记
  17. java模拟微博登录_Python模拟微博登陆,亲测有效
  18. html模块 码工助手,码工助手在线布局使用注意事项
  19. python实现简单的声音文件读写
  20. HTML学习(—..—)

热门文章

  1. 2018计算机专硕学硕,2018年考研要弄清学硕与专硕的区别
  2. jquery 校验中国身份证号码
  3. 教你来使用雪碧图(CSS sprite)
  4. 关于IDEA中使用git更新代码,会覆盖掉未提交的新代码解决问题
  5. 【译】UI 的黑暗面!暗色背景的优势
  6. 对d3d9里面的函数挂钩实现透视
  7. DFS(深度优先搜索)和BFS(广度优先搜索)求迷宫路径问题的总结
  8. 可涂抹什么让指纹加深_碘熏显现指纹纹路的操作方法
  9. 实现js尾递归优化的代码
  10. linux网络测试工具