日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android TV 快进帧预览

發布時間:2025/6/17 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=&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 快进帧预览的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。