搭建直播平台,android 如何得到本地视频的缩略图

搭建直播平台,android 如何得到本地视频的缩略图

 

1
public class VideoThumbUtils {<br>    /**<br>     * 得到视屏的缩略图<br>     *<br>     * @param videoPath<br>     * @param width<br>     * @param height<br>     * @return<br>     */<br>    public static Bitmap getVideoThumbnail(String videoPath, int width, int height) {<br>        Bitmap result = null;<br>        Bitmap temp = null;<br>if(videoPath==null){<br>return null;<br>}<br>        File file = new File(videoPath);<br>        if (!file.exists()) {<br>            return null;<br>        }<br>        MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();<br>        try {<br>            metadataRetriever.setDataSource(videoPath);  // 设置视屏资源(还有一种是传url的,这里传的string)<br>            String time = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);<br>            long frameTime = Long.parseLong(time) * 1000 / 2;// 视屏前面的帧可能为黑屏,所以取中间的帧<br>            temp = metadataRetriever.getFrameAtTime(frameTime, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);<br>            if (null == temp) {<br>                temp = metadataRetriever.getFrameAtTime(0);<br>            }<br>        } catch (Exception o) {<br>            o.printStackTrace();<br>        } finally {<br>            try {<br>                metadataRetriever.release();<br>            } catch (RuntimeException o) {<br>                o.printStackTrace();<br>            }<br>        }<br>        result = extractThumbnail(temp, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); //对得到的bitmap压缩<br>        return result;<br>    }<br>    private static Bitmap extractThumbnail(Bitmap source, int width, int height,<br>                                           int options) {<br>        if (source == null) {<br>            return null;<br>        }<br>        float scale;<br>        if (source.getWidth() < source.getHeight()) {  //得到压缩比<br>            scale = width / (float) source.getWidth();<br>        } else {<br>            scale = height / (float) source.getHeight();<br>        }<br>        Matrix matrix = new Matrix();<br>        matrix.setScale(scale, scale);<br>        Bitmap thumbnail = transform(matrix, source, width, height,<br>                0x1 | options);<br>        return thumbnail;<br>    }<br>    private static Bitmap transform(Matrix scaler, Bitmap source, int targetWidth,<br>                                    int targetHeight, int options) {<br>        boolean scaleUp = (options & 0x1) != 0;<br>        boolean recycle = (options & ThumbnailUtils.OPTIONS_RECYCLE_INPUT) != 0;<br>        int deltaX = source.getWidth() - targetWidth;<br>        int deltaY = source.getHeight() - targetHeight;<br>        if (!scaleUp && (deltaX < 0 || deltaY < 0)) {<br>            /*<br>             * In such case the bitmap is smaller, at least in one dimension, than the target. Transform<br>             * it by placing as much of the image as possible into the target and leaving the top/bottom<br>             * or left/right (or both) black.<br>             */<br>            Bitmap b2 = Bitmap.createBitmap(targetWidth, targetHeight,<br>                    Bitmap.Config.ARGB_8888);<br>            Canvas c = new Canvas(b2);<br>            int deltaXHalf = Math.max(0, deltaX / 2);<br>            int deltaYHalf = Math.max(0, deltaY / 2);<br>            Rect src = new Rect(deltaXHalf, deltaYHalf, deltaXHalf<br>                    + Math.min(targetWidth, source.getWidth()), deltaYHalf<br>                    + Math.min(targetHeight, source.getHeight()));<br>            int dstX = (targetWidth - src.width()) / 2;<br>            int dstY = (targetHeight - src.height()) / 2;<br>            Rect dst = new Rect(dstX, dstY, targetWidth - dstX, targetHeight<br>                    - dstY);<br>            c.drawBitmap(source, src, dst, null);<br>            if (recycle) {<br>                source.recycle();<br>            }<br>            c.setBitmap(null);<br>            return b2;<br>        }<br>        float bitmapWidthF = source.getWidth();<br>        float bitmapHeightF = source.getHeight();<br>        float bitmapAspect = bitmapWidthF / bitmapHeightF;<br>        float viewAspect = (float) targetWidth / targetHeight;<br>        if (bitmapAspect > viewAspect) {<br>            float scale = targetHeight / bitmapHeightF;<br>            if (scale < .9F || scale > 1F) {<br>                scaler.setScale(scale, scale);<br>            } else {<br>                scaler = null;<br>            }<br>        } else {<br>            float scale = targetWidth / bitmapWidthF;<br>            if (scale < .9F || scale > 1F) {<br>                scaler.setScale(scale, scale);<br>            } else {<br>                scaler = null;<br>            }<br>        }<br>        Bitmap b1;<br>        if (scaler != null) {<br>            // used for minithumb and crop, so we want to filter here.<br>            b1 = Bitmap.createBitmap(source, 0, 0, source.getWidth(),<br>                    source.getHeight(), scaler, true);<br>        } else {<br>            b1 = source;<br>        }<br>        if (recycle && b1 != source) {<br>            source.recycle();<br>        }<br>        int dx1 = Math.max(0, b1.getWidth() - targetWidth);<br>        int dy1 = Math.max(0, b1.getHeight() - targetHeight);<br>        Bitmap b2 = Bitmap.createBitmap(b1, dx1 / 2, dy1 / 2, targetWidth,<br>                targetHeight);<br>        if (b2 != b1) {<br>            if (recycle || b1 != source) {<br>                b1.recycle();<br>            }<br>        }<br>        return b2;<br>    }

以上就是 搭建直播平台,android 如何得到本地视频的缩略图,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示