前言

入职新公司,刚接手的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开发中的快进帧预览功能,可用于视频列表获取关键帧预览等对实时性要求不高的使用场景。

后台截取返回组图

  1. 经过尝试,MediaMetadataRetriever获取帧耗时emmm...真的慢,然后观察鹅厂还有Yk等主流TV的快进帧预览效果那叫一个流畅,后面通过抓包发现YK的请求返回的数据里面包含一张10*10的小图组成的大图,对比视频帧预览图发现跟小图一直,然后猜想其实现方式就是后台返回帧预览组图,然后TV端将大图截成100张小图,也就是帧预览图然后列表展示。真相大白,大鹅厂还是吊,各种加密,能力有限看不出来,估计也差不多。

2. 明白了过程那剩下的就是后台返回组图(那边怎么搞不管),TV端获取图片,截成小图,列表展示。

(1) 将网络图片转Bitmap(网上随便找的)

    public class BitmapUtils {/*** 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如:* <p>* A.网络路径: url=&quot;http://blog.foreverlove.us/girl2.png&quot; ;* <p>* B.本地路径:url=&quot;file://mnt/sdcard/photo/image.png&quot;;* <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 快进帧预览相关推荐

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

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

  2. Android用MediaCodec将相机预览帧编码成MP4视频

    文章目录 知识预备 实现思路 获取图像数据帧 编码视频 初始化编码器 编码转换 编码视频 问题记录 最近项目中,有一个在扫码同时录视频的需求.扫码框架是通过摄像头 onPreviewFrame方法获取 ...

  3. android 组件消失了,Android 12 2.2 开发者预览版发布:修复桌面小组件消失等问题...

    IT 之家 4 月 8 日消息 据外媒 XDA 论坛消息,Android 12 2.2 开发者预览版今日发布,同时包含安卓 2021 年 4 月安全更新.本次预览版主要修复了一些错误,没有带来重要功能 ...

  4. android xml 预览,解决Android studio xml界面无法预览问题

    解决Android studio xml界面无法预览问题 发布时间:2020-10-05 18:48:37 来源:脚本之家 阅读:140 作者:张雨明 如下图 修改style.xml中的 parent ...

  5. android 摄像头比例,Android摄像头是全屏预览最简单的方式.doc

    Android摄像头是全屏预览最简单的方式 Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏, ...

  6. android camera 全屏,Android Camera做全屏预览之最简单方法.doc

    Android Camera做全屏预览之最简单方法 M厂开发五部:刘 博 一.全屏预览与非全屏预览的区别 对于大多数人来说,我们看电影.玩游戏等都喜欢全屏,我们之所以喜欢全屏的一个主要原因就是全屏的感 ...

  7. 如何不解锁BL刷入Android 12/安卓程序员预览版或者刷回Android 11

    教程参考的"如何不解锁BL使用adb sideload安装(刷入)android 12(安卓)程序员预览版1/DP1" 最近重新使用回了Pixel 5,前几天突然心血来潮想刷入An ...

  8. Android 视频 短视频录制预览尺寸(简单几款机型测试)

    Android 视频 短视频录制预览尺寸(简单几款机型测试) 贴出下列2表目的也是便于大家对一般相机照片和预览主流尺寸有个大概了解 SurfaceView 照片支持尺寸 Picture Nexus 5 ...

  9. android camera2 帧数,Android Camera2 HighSpeedCaptureSession高帧率预览录像

    ❗️底部有示例Apk和Github代码 Android的相机Camera2在6.0M的时候,出了一个支持高帧率预览和录像的功能,就是创建一个新的session,叫做mCameraDevice.crea ...

最新文章

  1. Oracle JDBC连接服务名、SID和tnsnames.ora配置的多种方式
  2. ubuntu安装使用不同版本的gcc
  3. 电脑网络禁用了怎么恢复_网卡禁用怎么启用恢复
  4. Android开发WebView之加载HTML源码修改HTML字体大小以及缩放HTML的方法
  5. DrJava试用笔记
  6. java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序
  7. 最新!数字人民币横空出世,5万深圳人瓜分1000万红包!
  8. NYOJ-491 幸运三角形
  9. Java 8 的这个新特性,用起来真的很爽!
  10. 魅蓝note3 android操作系统,魅族魅蓝Note3的内存容量是多少
  11. 第十二章作业(1.水果店
  12. 十行 js 获取带有双字节字符的字符串长度
  13. 网络流量大数据分析平台(2)
  14. 于氏:简单监控全网服务
  15. MATLAB 处理大数据
  16. 某校2020专硕编程题-回文素数
  17. 魔兽世界你无法向该服务器发邮件什么意思,魔兽世界:对于怀旧服无法上线的3大原因!暴雪是这样解释的!...
  18. 浏览器加载图片错误解决方案
  19. 新版Edge 浏览器的禁用扩展提示
  20. 【嵌入式系统—实时操作系统】uC/OS-II 及其STM32F103移植

热门文章

  1. redis cluster 集群重新启动关闭
  2. 一维二维码的提取、识别和产生
  3. 一步一图一代码之排序二叉树
  4. 71 说出常用的类、包、接口各5个
  5. 关于bjam编译自己模块出错的问题
  6. UVa 11520 Fill the Square 填充正方形
  7. TFS数据库变成可疑状态的处理
  8. Eclipse如何打开一个现有工程
  9. SharePoint 2007 Backup Strategies
  10. 【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )