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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android TV 快进帧预览

發(fā)布時(shí)間:2025/6/17 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android TV 快进帧预览 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

入職新公司,剛接手的AndroidTV項(xiàng)目,初次接觸TV開(kāi)發(fā),被各種騷東西搞得頭皮發(fā)麻,寫(xiě)點(diǎn)東西記錄一下。

正文

MediaMetadataRetriever

1. 獲取視頻幀的關(guān)鍵類:MediaMetadataRetriever

(1) 屬于在android api的那個(gè)包下:android.media.MediaMetadataRetriever

(2) 類簡(jiǎn)單介紹: MediaMetadataRetriever類提供了用于從輸入媒體文件檢索幀和元數(shù)據(jù)的統(tǒng)一接口。

(3) 這個(gè)是android提供的類,用來(lái)獲取本地和網(wǎng)絡(luò)media相關(guān)文件的信息。

2. 大概使用

public void getThumbs(SipaTvPlayer player, String url) {long duration = player.getDuration();int divisor = 0;if (duration > 1000 * 60 * 2) {//如果視頻時(shí)長(zhǎng)超過(guò)兩分鐘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秒的視頻幀預(yù)覽圖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();}}});} 復(fù)制代碼

注意: 使用MediaMetadataRetriever在移動(dòng)端能獲取到本地或網(wǎng)絡(luò)視頻的對(duì)應(yīng)微秒值的幀截圖,但過(guò)程相當(dāng)耗時(shí),很有可能會(huì)ANR,所以一般異步方式獲取,因?yàn)檫^(guò)于耗時(shí)(能力有限,不知道能不能解決這個(gè)問(wèn)題),所以不建議用于TV開(kāi)發(fā)中的快進(jìn)幀預(yù)覽功能,可用于視頻列表獲取關(guān)鍵幀預(yù)覽等對(duì)實(shí)時(shí)性要求不高的使用場(chǎng)景。

后臺(tái)截取返回組圖

  • 經(jīng)過(guò)嘗試,MediaMetadataRetriever獲取幀耗時(shí)emmm...真的慢,然后觀察鵝廠還有Yk等主流TV的快進(jìn)幀預(yù)覽效果那叫一個(gè)流暢,后面通過(guò)抓包發(fā)現(xiàn)YK的請(qǐng)求返回的數(shù)據(jù)里面包含一張10*10的小圖組成的大圖,對(duì)比視頻幀預(yù)覽圖發(fā)現(xiàn)跟小圖一直,然后猜想其實(shí)現(xiàn)方式就是后臺(tái)返回幀預(yù)覽組圖,然后TV端將大圖截成100張小圖,也就是幀預(yù)覽圖然后列表展示。真相大白,大鵝廠還是吊,各種加密,能力有限看不出來(lái),估計(jì)也差不多。
  • 2. 明白了過(guò)程那剩下的就是后臺(tái)返回組圖(那邊怎么搞不管),TV端獲取圖片,截成小圖,列表展示。

    (1) 將網(wǎng)絡(luò)圖片轉(zhuǎn)Bitmap(網(wǎng)上隨便找的)

    public class BitmapUtils {/*** 得到本地或者網(wǎng)絡(luò)上的bitmap url - 網(wǎng)絡(luò)或者本地圖片的絕對(duì)路徑,比如:* <p>* A.網(wǎng)絡(luò)路徑: 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 {// 說(shuō)明:Constant.IO_BUFFER_SIZE 是一個(gè)常量而已,可以改成常數(shù),比如2*1024,其實(shí)取決于你的圖片大小,自己根據(jù)圖片的大小自己設(shè)定吧。。。。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;}}} 復(fù)制代碼

    (2)截取小圖

    /**** @param bitmap 源圖(要截取的幀預(yù)覽組圖)* @return 截取的圖片列表*/private List<Bitmap> getThumbBitmaps(Bitmap bitmap) {//MAX_COLUMNS 列數(shù) MAX_LINES 行數(shù) 一般10*10 跟后臺(tái)定好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;} 復(fù)制代碼

    好了,關(guān)于AndroidTV幀預(yù)覽,就發(fā)現(xiàn)這么點(diǎn)東西,水平有限,代碼不好就湊合看吧。

    總結(jié)

    以上是生活随笔為你收集整理的Android TV 快进帧预览的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。