androidTV在html中集成饺子播放器并播放m3u8格式视频
饺子播放器的默认引擎是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格式视频相关推荐
- Android中调用系统已安装的播放器来播放网络流媒体视频
2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定,在界面放一个Button或者带有播放图标的imageview,点击事件中调用本地播放器来播 ...
- 网络摄像头无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?
EasyPlayer播放器系列项目提供了非常简单易用的SDK及API接口,用户通过API调用就可以非常快速地开发出属于自己的应用程序,进行第二次开发.新版的EasyPlayer因为支持H265网页播放 ...
- 视频在html不能播放器,网页无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?...
原标题:网页无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理? EasyPlayer播放器系列项目提供了非常简单易用的SDK及API接口,用户通过API调用就可以非常快速 ...
- 计算机无法播放视频,电脑播放器无法播放视频怎么处理
没有安装,或者安装的FLASH播放器版本低于8.0 症状: 1.播放器位置空白. 2.播放器左上角显示方块. 3.能播放Youku片头,但不能播放视频. 4.能够播放视频,但播放器按钮显示不正常. 5 ...
- 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )
文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...
- C# 视频监控系列(13):H264播放器——控制播放和截图
C# 视频监控系列(13):H264播放器--控制播放和截图 前言 本该把这部分和上一篇合成一篇的,无奈挣扎半天,还是想对称起来,客户端3篇.服务器端3篇--所有播放器也勉强凑3篇吧(封装API的文章 ...
- 使用 阿里云 播放器播放 .flv 和 hls(.m3u8) 格式的视频流
一.使用 阿里云 播放器播放 .flv 和 hls(.m3u8) 格式的视频流 官方教程:https://help.aliyun.com/document_detail/125570.htm?spm= ...
- Android实现控制第三方音乐播放器暂停/播放
实现控制第三方音乐播放器思路: 1.参考方法:可能实现第三方音乐播放器暂停/播放/下一曲/上一曲 思路:android模拟发送键值,就像蓝牙耳机等远程设备切换歌曲操作,但是行不通.原因是现在Andro ...
- jsp网页嵌入PHP网页,JSP_(jsp/html)网页上嵌入播放器(常用播放器代码整理),这个其实很简单,只要在HTML上 - phpStudy...
(jsp/html)网页上嵌入播放器(常用播放器代码整理) 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 还有更多的的播放器和设置可供选 ...
最新文章
- 1小时教你做360度全景“小星球”效果图 Skillshare – Create a Panoramic ‘Little Planet’ from Anywhere
- 贷还是不贷:如何用Python和机器学习帮你决策?
- 董小姐的空调不一定能当发电站,但牛放屁确实可以发电
- python3.6安装scrapy-python3.6 安装scrapy
- 【Android 逆向】ARM CPU 架构体系 ( ARM 内存模型 | ARM 架构堆的实现 | ARM 架构栈的实现 )
- Linux根文件系统的制作
- 我的编程学习日志(1)--进制转换
- 单继承-继承的概念和语法
- 【RK3399Pro学习笔记】十六、ROS中的常用可视化工具
- 前端学习(2450):页面布局制作
- oracle 01589,ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
- python中难的算法_Python算法很难吗?python神书《算法图解》PDF电子版分享给你
- 阿里云经典网络与Rancher VXLAN兼容性问题
- 原版英文书籍《Linux命令行》阅读记录4 | 操作文件和目录
- DeFi巨鲸0xb1向DeBank打赏5 ETH
- java即时聊天系统_基于Java技术的即时聊天系统实现(含源文件).doc
- 微信js-sdk+JAVA实现分享接口
- Backtrader量化平台教程-跟踪止损单(十)
- java栈里储存的是什么_JVM中的堆和栈到底存储了什么
- 【毕业设计】总结、展望及参考文献