天天看點

Android生成視訊預覽圖(含本地視訊和網絡視訊)

object VideoThumbUtil {

    fun loadLocalVideoThumb(videoFilePath: String?, cover: ImageView) {
//        ThumbnailUtils.createVideoThumbnail(videoFilePath, MediaStore.Images.Thumbnails.MINI_KIND)?.let { thumb ->
//            Glide.with(cover.context)
//                .load(thumb)
//                .error(R.drawable.icon_default_load_error)
//                .placeholder(R.drawable.icon_default_placehold)
//                .centerCrop()
//                .into(cover)
//        } ?: let {
//            Logger.e("loadLocalVideoThumb error : $videoFilePath")
//            cover.setImageResource(R.drawable.icon_default_load_error)
//            cover.scaleType = ImageView.ScaleType.CENTER_CROP
//        }

            Glide.with(cover.context)
                .load(videoFilePath)
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .error(R.drawable.icon_default_load_error)
                .placeholder(R.drawable.icon_default_placehold)
                .centerCrop()
                .into(cover)
    }

    fun loadNetVideoThumb(videoHttpUrl: String?, cover: ImageView) {
//        GlobalScope.launch (Dispatchers.IO) {
//            var bitmap: Bitmap? = null
//            val retriever = MediaMetadataRetriever()
//            try {
//                //根據url擷取縮略圖
//                retriever.setDataSource(videoHttpUrl, mapOf())
//                val totalTimeString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
//                var totalTime = totalTimeString?.let {
//                    it.toLong() * 1000
//                } ?: 5000
//
//                while (totalTime > 1000) {
//                    totalTime /= 2
//                    bitmap = retriever.getFrameAtTime(totalTime, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
//                    if (bitmap != null) break
//                }
//            } finally {
//                retriever.release()
//            }
//
//            GlobalScope.launch (Dispatchers.Main) {
//                bitmap?.let {
//                    Glide.with(cover)
//                        .load(it)
//                        .error(R.drawable.layer_load_error)
//                        .placeholder(R.drawable.layer_placehold)
//                        .centerCrop()
//                        .into(cover)
//                } ?: let {
//                    Logger.e("loadNetVideoThumb error : $videoHttpUrl")
//                    cover.setImageResource(R.drawable.icon_default_load_error)
//                    cover.scaleType = ImageView.ScaleType.CENTER_CROP
//                }
//            }
//        }

        val context = cover.context
        val requestOptions = RequestOptions.frameOf(5000L)
            .set(VideoDecoder.FRAME_OPTION, MediaMetadataRetriever.OPTION_CLOSEST)
            .transform(object : BitmapTransformation() {

                override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
                    return toTransform
                }

                override fun updateDiskCacheKey(messageDigest: MessageDigest) {
                    try {
                        messageDigest.update((context.packageName + "RotateTransform").toByteArray(charset("utf-8")))
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
            })
        Glide.with(context)
            .load(videoHttpUrl)
            .diskCacheStrategy(DiskCacheStrategy.DATA)
            .apply(requestOptions)
            .error(R.drawable.layer_load_error)
            .placeholder(R.drawable.layer_placehold)
            .centerCrop()
            .into(cover)
    }