饺子播放器的默认引擎是MediaPlayer,只能播放一些常见格式的视频。想要播放m3u8格式,需要切换引擎

jzvdStd.setUp("http://youku.cdn-iqiyi.com/20180523/11112_b1fb9d8b/index.m3u8"," ",SCREEN_NORMAL, JZMediaExo.class);

我在第一次尝试的时候最后面那个参数用的是JZMediaIjk.class,可以播放m3u8格式的视频,但是没有声音,搞不懂。

第二次尝试用的是JZMediaExo.class,需要将这两个类拷到本地。并且需要导入exo的依赖

//饺子视频
api 'cn.jzvd:jiaozivideoplayer:7.2.3'
implementation 'com.google.android.exoplayer:exoplayer:2.9.3'

在打正式包的时候,我开启了混淆,由于JZMediaExo.class与JZMediaIjk.class是需要拷到本地的,所以这俩个类需要我们手动添加防止被混淆。

-keep class com.example.xxx.JZMediaIjk {*; }
-keep class com.example.xxx.JZMediaExo {*; }

此时播放是没有问题了,但在androidTV端,是使用遥控控制的,播放、暂停、快进、快退,都需要重新写一下。一开始我想直接用GSYVideoPlayer来播放m3u8的视频来着,但是发现不能很好的来实现这些功能,很多需要用到的方法都是private、protected的,而JiaoZiVideoPlayer就比较开放,很多需要用到的方法都是public的。

当这套播放逻辑没有问题,但是还是播放不了,很有可能你关闭了硬件加速
在<application下添加android:hardwareAccelerated=“true”

自己记录下用JiaoZiVideoPlayer控制播放、暂停、快进、快退等

onKeyDown()

 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {LogUtils.d("main-onKeyDown");if (keyCode == KeyEvent.KEYCODE_BACK) {//是全屏if (jzvdStd.screen == SCREEN_FULLSCREEN) {jzvdStd.setFocusable(false);//失去焦点setVideoSize(bean);//缩小视频jzvdStd.screen = SCREEN_NORMAL;//设置为小屏状态return true;}if (mType) {//是否是首页secondBack();//两次点击退出return true;}} else if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {if (jzvdStd.screen == SCREEN_FULLSCREEN) {//全屏状态下按ok键,设置为暂停jzvdStd.startButton.performClick();}} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {if (isFirst) {jzvdStd.cancelProgressTimer();jzvdStd.bottomContainer.setVisibility(View.VISIBLE);//底部进度整体控件显示}isFirst = false;maxTime = jzvdStd.getDuration();stepTime += 5000;whenTime = jzvdStd.getCurrentPositionWhenPlaying() + stepTime;LogUtils.d("main_快进=" + whenTime + "," + maxTime);if (whenTime <= maxTime) {//底部进度条跟着变化jzvdStd.progressBar.setProgress((int) (whenTime * 100 / (maxTime == 0 ? 1 : maxTime)));//底部进度条旁的时间跟着变化jzvdStd.currentTimeTextView.setText(JZUtils.stringForTime(jzvdStd.progressBar.getProgress() * maxTime / 100));} else {whenTime = maxTime;}} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {if (isFirst) {jzvdStd.cancelProgressTimer();jzvdStd.bottomContainer.setVisibility(View.VISIBLE);}isFirst = false;maxTime = jzvdStd.getDuration();stepTime += 5000;whenTime = jzvdStd.getCurrentPositionWhenPlaying() - stepTime;LogUtils.d("main_快退=" + whenTime);if (whenTime > 0) {jzvdStd.progressBar.setProgress((int) (whenTime * 100 / (maxTime == 0 ? 1 : maxTime)));jzvdStd.currentTimeTextView.setText(JZUtils.stringForTime(jzvdStd.progressBar.getProgress() * maxTime / 100));} else {whenTime = 0;}}return super.onKeyDown(keyCode, event);}

onKeyUp()

@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {LogUtils.d("main-onKeyUp");if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT || keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {jzvdStd.bottomContainer.setVisibility(View.INVISIBLE);//底部进度整体控件隐藏jzvdStd.mediaInterface.seekTo(whenTime);jzvdStd.startProgressTimer();}whenTime = stepTime = 0;isFirst = true;return super.onKeyUp(keyCode, event);}

setVideoSize()方法

private void setVideoSize(VideoSizeBean bean) {FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) llPanJzvdStd.getLayoutParams();lp.width = DimenUtils.dp2px(this, bean.getWidth());lp.height = DimenUtils.dp2px(this, bean.getHeight());int x = DimenUtils.dp2px(this, bean.getX());int y = DimenUtils.dp2px(this, bean.getY());lp.setMargins( x, y, 0, 0);llPanJzvdStd.setLayoutParams(lp);}

DimenUtils ()方法

public class DimenUtils {private DimenUtils() {throw new UnsupportedOperationException("cannot be instantiated");}public static int dp2px(Context context, float dpVal) {DisplayMetrics metrics = new DisplayMetrics();float scale = metrics.density;int px = (int) (dpVal * scale);return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal, context.getResources().getDisplayMetrics());}public static int sp2px(Context context, float spVal) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal, context.getResources().getDisplayMetrics());}public static float px2dp(Context context, float pxVal) {final float scale = context.getResources().getDisplayMetrics().density;return (pxVal / scale);}public static float px2sp(Context context, float pxVal) {return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);}/*** 获取字体高度*/public static float getTextHeight(Paint p) {Paint.FontMetrics fm = p.getFontMetrics();// 获取字体高度return (float) ((Math.ceil(fm.descent - fm.top) + 2) / 2);}public static int getTextWidth(String str, Paint paint) {Rect bounds = new Rect();paint.getTextBounds(str, 0, str.length(), bounds);return bounds.width();}public static int getTextWidth(String str, TextView tvText) {Rect bounds = new Rect();TextPaint paint = tvText.getPaint();paint.getTextBounds(str, 0, str.length(), bounds);return bounds.width();}/*** 获取屏幕宽度* */public static int getScreenWidth(Context context){final Resources resources = context.getResources();final DisplayMetrics metrics = resources.getDisplayMetrics();return metrics.widthPixels;}/*** 获取屏幕高度* */public static int getScreenHeight(Context context){final Resources resources =context.getResources();final DisplayMetrics metrics = resources.getDisplayMetrics();return metrics.heightPixels;}/*** 获取状态栏高度* */public static int getStatusBarHeight(Context context) {int result = 0;int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {result = context.getResources().getDimensionPixelSize(resourceId);}return result;}
}

androidTV在html中集成饺子播放器并播放m3u8格式视频相关推荐

  1. Android中调用系统已安装的播放器来播放网络流媒体视频

    2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定,在界面放一个Button或者带有播放图标的imageview,点击事件中调用本地播放器来播 ...

  2. 网络摄像头无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?

    EasyPlayer播放器系列项目提供了非常简单易用的SDK及API接口,用户通过API调用就可以非常快速地开发出属于自己的应用程序,进行第二次开发.新版的EasyPlayer因为支持H265网页播放 ...

  3. 视频在html不能播放器,网页无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?...

    原标题:网页无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理? EasyPlayer播放器系列项目提供了非常简单易用的SDK及API接口,用户通过API调用就可以非常快速 ...

  4. 计算机无法播放视频,电脑播放器无法播放视频怎么处理

    没有安装,或者安装的FLASH播放器版本低于8.0 症状: 1.播放器位置空白. 2.播放器左上角显示方块. 3.能播放Youku片头,但不能播放视频. 4.能够播放视频,但播放器按钮显示不正常. 5 ...

  5. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

  6. C# 视频监控系列(13):H264播放器——控制播放和截图

    C# 视频监控系列(13):H264播放器--控制播放和截图 前言 本该把这部分和上一篇合成一篇的,无奈挣扎半天,还是想对称起来,客户端3篇.服务器端3篇--所有播放器也勉强凑3篇吧(封装API的文章 ...

  7. 使用 阿里云 播放器播放 .flv 和 hls(.m3u8) 格式的视频流

    一.使用 阿里云 播放器播放 .flv 和 hls(.m3u8) 格式的视频流 官方教程:https://help.aliyun.com/document_detail/125570.htm?spm= ...

  8. Android实现控制第三方音乐播放器暂停/播放

    实现控制第三方音乐播放器思路: 1.参考方法:可能实现第三方音乐播放器暂停/播放/下一曲/上一曲 思路:android模拟发送键值,就像蓝牙耳机等远程设备切换歌曲操作,但是行不通.原因是现在Andro ...

  9. jsp网页嵌入PHP网页,JSP_(jsp/html)网页上嵌入播放器(常用播放器代码整理),这个其实很简单,只要在HTML上 - phpStudy...

    (jsp/html)网页上嵌入播放器(常用播放器代码整理) 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 还有更多的的播放器和设置可供选 ...

最新文章

  1. 1小时教你做360度全景“小星球”效果图 Skillshare – Create a Panoramic ‘Little Planet’ from Anywhere
  2. 贷还是不贷:如何用Python和机器学习帮你决策?
  3. 董小姐的空调不一定能当发电站,但牛放屁确实可以发电
  4. python3.6安装scrapy-python3.6 安装scrapy
  5. 【Android 逆向】ARM CPU 架构体系 ( ARM 内存模型 | ARM 架构堆的实现 | ARM 架构栈的实现 )
  6. Linux根文件系统的制作
  7. 我的编程学习日志(1)--进制转换
  8. 单继承-继承的概念和语法
  9. 【RK3399Pro学习笔记】十六、ROS中的常用可视化工具
  10. 前端学习(2450):页面布局制作
  11. oracle 01589,ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
  12. python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你
  13. 阿里云经典网络与Rancher VXLAN兼容性问题
  14. 原版英文书籍《Linux命令行》阅读记录4 | 操作文件和目录
  15. DeFi巨鲸0xb1向DeBank打赏5 ETH
  16. java即时聊天系统_基于Java技术的即时聊天系统实现(含源文件).doc
  17. 微信js-sdk+JAVA实现分享接口
  18. Backtrader量化平台教程-跟踪止损单(十)
  19. java栈里储存的是什么_JVM中的堆和栈到底存储了什么
  20. 【毕业设计】总结、展望及参考文献

热门文章

  1. 青龙面板 扩展功能 B站脚本
  2. 以老王老王为题,作为一首搞笑的押韵的诗
  3. 书论40 欧阳修《试笔》
  4. 关于楼板和梁分割的基本内容
  5. 华安财险规范经营战略
  6. C语言实现输出前n项Fibonacci数列
  7. Random随机小游戏 结合scanner
  8. 12月19日绝地求生服务器维护公告,绝地求生吃鸡停机维护更新公告内容汇总 绝地求生正式服12.18更新时间...
  9. 编码速度非常慢_非 iPhone12 用户谨慎购买苹果无线充电器,速度非常慢
  10. 浏览器数据库 indexDB、webSQL