Android TV 快进帧预览
生活随笔
收集整理的這篇文章主要介紹了
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開發中的快進幀預覽功能,可用于視頻列表獲取關鍵幀預覽等對實時性要求不高的使用場景。
后臺截取返回組圖
(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 快进帧预览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GenericFactoryMethod
- 下一篇: Linux安装GitLib