Android TV 快进帧预览
前言
入职新公司,刚接手的AndroidTV项目,初次接触TV开发,被各种骚东西搞得头皮发麻,写点东西记录一下。
正文
MediaMetadataRetriever
1. 获取视频帧的关键类:MediaMetadataRetriever
(1) 属于在android api的那个包下:android.media.MediaMetadataRetriever
(2) 类简单介绍: MediaMetadataRetriever类提供了用于从输入媒体文件检索帧和元数据的统一接口。
(3) 这个是android提供的类,用来获取本地和网络media相关文件的信息。
2. 大概使用:
public void getThumbs(SipaTvPlayer player, String url) {long duration = player.getDuration();int divisor = 0;if (duration > 1000 * 60 * 2) {//如果视频时长超过两分钟divisor = 10;} else {divisor = 2;}int finalDivisor = divisor;io.reactivex.Observable<Bitmap> observable = io.reactivex.Observable.create(new ObservableOnSubscribe<Bitmap>() {@Overridepublic void subscribe(ObservableEmitter<Bitmap> e) throws Exception {mRetriever = new MediaMetadataRetriever();if (Build.VERSION.SDK_INT >= 14) {mRetriever.setDataSource(url, new HashMap<String, String>());} else {mRetriever.setDataSource(url);}for (int i = 1 * 1000; i < duration; i += finalDivisor * 1000) {//获取每隔divisor秒的视频帧预览图Bitmap bitmap = mRetriever.getFrameAtTime(i * 1000, MediaMetadataRetriever.OPTION_CLOSEST);e.onNext(bitmap);Log.i(TAG, "bitmap---i: " + i / 1000);}}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());observable.subscribe(new Consumer<Bitmap>() {@Overridepublic void accept(Bitmap bitmap) throws Exception {if (bitmap != null) {mThumbs.add(bitmap);mAdapter.notifyDataSetChanged();}}});}
复制代码
注意: 使用MediaMetadataRetriever在移动端能获取到本地或网络视频的对应微秒值的帧截图,但过程相当耗时,很有可能会ANR,所以一般异步方式获取,因为过于耗时(能力有限,不知道能不能解决这个问题),所以不建议用于TV开发中的快进帧预览功能,可用于视频列表获取关键帧预览等对实时性要求不高的使用场景。
后台截取返回组图
- 经过尝试,MediaMetadataRetriever获取帧耗时emmm...真的慢,然后观察鹅厂还有Yk等主流TV的快进帧预览效果那叫一个流畅,后面通过抓包发现YK的请求返回的数据里面包含一张10*10的小图组成的大图,对比视频帧预览图发现跟小图一直,然后猜想其实现方式就是后台返回帧预览组图,然后TV端将大图截成100张小图,也就是帧预览图然后列表展示。真相大白,大鹅厂还是吊,各种加密,能力有限看不出来,估计也差不多。
2. 明白了过程那剩下的就是后台返回组图(那边怎么搞不管),TV端获取图片,截成小图,列表展示。
(1) 将网络图片转Bitmap(网上随便找的)
public class BitmapUtils {/*** 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如:* <p>* A.网络路径: url="http://blog.foreverlove.us/girl2.png" ;* <p>* B.本地路径:url="file://mnt/sdcard/photo/image.png";* <p>* C.支持的图片格式 ,png, jpg,bmp,gif等等** @param url* @return*/public static Bitmap GetLocalOrNetBitmap(String url) {Bitmap bitmap = null;InputStream in = null;BufferedOutputStream out = null;try {// 说明:Constant.IO_BUFFER_SIZE 是一个常量而已,可以改成常数,比如2*1024,其实取决于你的图片大小,自己根据图片的大小自己设定吧。。。。in = new BufferedInputStream(new URL(url).openStream(), Constant.IO_BUFFER_SIZE);final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();out = new BufferedOutputStream(dataStream, Constant.IO_BUFFER_SIZE);copy(in, out);out.flush();byte[] data = dataStream.toByteArray();bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);data = null;return bitmap;} catch (IOException e) {e.printStackTrace();return null;}}}
复制代码
(2)截取小图
/**** @param bitmap 源图(要截取的帧预览组图)* @return 截取的图片列表*/private List<Bitmap> getThumbBitmaps(Bitmap bitmap) {//MAX_COLUMNS 列数 MAX_LINES 行数 一般10*10 跟后台定好int width = bitmap.getWidth() / MAX_COLUMNS;int height = bitmap.getHeight() / MAX_LINES;ArrayList<Bitmap> bitmaps = new ArrayList<>();for (int y = 0; y < MAX_LINES; y++) {for (int x = 0; x < MAX_COLUMNS; x++) {bitmaps.add(Bitmap.createBitmap(bitmap, x * width, y * height, width, height));}}return bitmaps;}
复制代码
好了,关于AndroidTV帧预览,就发现这么点东西,水平有限,代码不好就凑合看吧。
Android TV 快进帧预览相关推荐
- Android播放视频快进帧预览图完美解決方案
播放视频快进预览图完美解決方案,使用方法如下,使用FFmpeg,不影响原有播放器, 就是先截取缩略图保存下来,快进时选用图片显示,最优方案,播放性能最好,体验完美. 参考github: https:/ ...
- Android用MediaCodec将相机预览帧编码成MP4视频
文章目录 知识预备 实现思路 获取图像数据帧 编码视频 初始化编码器 编码转换 编码视频 问题记录 最近项目中,有一个在扫码同时录视频的需求.扫码框架是通过摄像头 onPreviewFrame方法获取 ...
- android 组件消失了,Android 12 2.2 开发者预览版发布:修复桌面小组件消失等问题...
IT 之家 4 月 8 日消息 据外媒 XDA 论坛消息,Android 12 2.2 开发者预览版今日发布,同时包含安卓 2021 年 4 月安全更新.本次预览版主要修复了一些错误,没有带来重要功能 ...
- android xml 预览,解决Android studio xml界面无法预览问题
解决Android studio xml界面无法预览问题 发布时间:2020-10-05 18:48:37 来源:脚本之家 阅读:140 作者:张雨明 如下图 修改style.xml中的 parent ...
- android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc
Android摄像头是全屏预览最简单的方式 Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏, ...
- android camera 全屏,Android Camera做全屏预览之最简单方法.doc
Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏,我们之所以喜欢全屏的一个主要原因就是全屏的感 ...
- 如何不解锁BL刷入Android 12/安卓程序员预览版或者刷回Android 11
教程参考的"如何不解锁BL使用adb sideload安装(刷入)android 12(安卓)程序员预览版1/DP1" 最近重新使用回了Pixel 5,前几天突然心血来潮想刷入An ...
- Android 视频 短视频录制预览尺寸(简单几款机型测试)
Android 视频 短视频录制预览尺寸(简单几款机型测试) 贴出下列2表目的也是便于大家对一般相机照片和预览主流尺寸有个大概了解 SurfaceView 照片支持尺寸 Picture Nexus 5 ...
- android camera2 帧数,Android Camera2 HighSpeedCaptureSession高帧率预览录像
❗️底部有示例Apk和Github代码 Android的相机Camera2在6.0M的时候,出了一个支持高帧率预览和录像的功能,就是创建一个新的session,叫做mCameraDevice.crea ...
最新文章
- Oracle JDBC连接服务名、SID和tnsnames.ora配置的多种方式
- ubuntu安装使用不同版本的gcc
- 电脑网络禁用了怎么恢复_网卡禁用怎么启用恢复
- Android开发WebView之加载HTML源码修改HTML字体大小以及缩放HTML的方法
- DrJava试用笔记
- java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序
- 最新!数字人民币横空出世,5万深圳人瓜分1000万红包!
- NYOJ-491 幸运三角形
- Java 8 的这个新特性,用起来真的很爽!
- 魅蓝note3 android操作系统,魅族魅蓝Note3的内存容量是多少
- 第十二章作业(1.水果店
- 十行 js 获取带有双字节字符的字符串长度
- 网络流量大数据分析平台(2)
- 于氏:简单监控全网服务
- MATLAB 处理大数据
- 某校2020专硕编程题-回文素数
- 魔兽世界你无法向该服务器发邮件什么意思,魔兽世界:对于怀旧服无法上线的3大原因!暴雪是这样解释的!...
- 浏览器加载图片错误解决方案
- 新版Edge 浏览器的禁用扩展提示
- 【嵌入式系统—实时操作系统】uC/OS-II 及其STM32F103移植
热门文章
- redis cluster 集群重新启动关闭
- 一维二维码的提取、识别和产生
- 一步一图一代码之排序二叉树
- 71 说出常用的类、包、接口各5个
- 关于bjam编译自己模块出错的问题
- UVa 11520 Fill the Square 填充正方形
- TFS数据库变成可疑状态的处理
- Eclipse如何打开一个现有工程
- SharePoint 2007 Backup Strategies
- 【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )