zoukankan      html  css  js  c++  java
  • Android加载视频封面的两种方式

    package com.z.z.utils;
    
    /*
     * :Created by z on 2020-08-31
     */
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.media.MediaMetadataRetriever;
    import android.util.Log;
    import android.widget.ImageView;
    
    import androidx.annotation.NonNull;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
    import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
    import com.bumptech.glide.load.resource.bitmap.VideoDecoder;
    import com.bumptech.glide.request.RequestOptions;
    
    import java.security.MessageDigest;
    import java.util.HashMap;
    
    public class VideoFrameTool {
    
        private static VideoFrameTool instance;
    
        public static VideoFrameTool getInstance() {
            if (instance == null) {
                instance = new VideoFrameTool();
            }
            return instance;
        }
    
        /**
         * 获取网络视频第一帧
         *
         * @param videoUrl
         * @return
         */
        public void loadFirst(String videoUrl, @NonNull ImageView cover) {
            Bitmap bitmap = null;
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            try {
                //根据url获取缩略图
                retriever.setDataSource(videoUrl, new HashMap());
                //获得第一帧图片
                bitmap = retriever.getFrameAtTime();
            } catch (IllegalArgumentException e) {
                //e.printStackTrace();
                Log.e("zhu", e.toString());
            } finally {
                retriever.release();
            }
            if (bitmap != null) {
                cover.setImageBitmap(bitmap);
            }
        }
    
        /**
         *   context 上下文
         *   uri 视频地址
         *   imageView 设置image
         *   frameTimeMicros 获取某一时间帧
         */
        public void loadFirstWithGlide(final Context context, String uri, ImageView imageView, long frameTimeMicros) {
            RequestOptions requestOptions = RequestOptions.frameOf(frameTimeMicros);
            requestOptions.set(VideoDecoder.FRAME_OPTION, MediaMetadataRetriever.OPTION_CLOSEST);
            requestOptions.transform(new BitmapTransformation() {
                @Override
                protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
                    return toTransform;
                }
    
                @Override
                public void updateDiskCacheKey(MessageDigest messageDigest) {
                    try {
                        messageDigest.update((context.getPackageName() + "RotateTransform").getBytes("utf-8"));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            Glide.with(context).load(uri).apply(requestOptions).into(imageView);
        }
    
        /**
         * 获取本地视频的第一帧
         *
         * @param localPath
         * @return
         */
        public Bitmap getLocalVideoBitmap(String localPath) {
            Bitmap bitmap = null;
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            try {
                //根据文件路径获取缩略图
                retriever.setDataSource(localPath);
                //获得第一帧图片
                bitmap = retriever.getFrameAtTime();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } finally {
                retriever.release();
            }
            return bitmap;
        }
    
    }
  • 相关阅读:
    memset 还可以这样用
    搜索(DFS)
    搜索(BFS)
    最大流之sap算法
    最大流之sap算法
    String VS Cstring(字符串)
    String VS Cstring(字符串)
    Set 与 Multiset
    deque(双端队列)
    枚举 TODO
  • 原文地址:https://www.cnblogs.com/Oldz/p/13725644.html
Copyright © 2011-2022 走看看