Android TV 快进帧预览
前言
入職新公司,剛接手的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)截取返回組圖
(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="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 {// 說(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)題。
- 上一篇: GenericFactoryMethod
- 下一篇: 【Android Lock Patter