搭建直播平台,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 如何得到本地视频的缩略图,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现