无需完全下载即可获取远程视频的缩略图

问题描述 投票:0回答:1

我有一个位于网络服务器上的视频文件的链接列表。

我需要显示此列表以及每个视频的缩略图。这个视频的第一帧很适合我。

如何显示缩略图而不下载整个文件

Glide、Coil 下载整个文件。

FFmpegMediaMetadataRetriever 使应用程序 APK 文件大小增加了 40+ MB。

有哪些可能的解决方案? 我看向 ExoPlayer,但无法用它提取一帧。

android android-glide exoplayer coil
1个回答
0
投票

看看下面的代码,它是通过 native MediaMetadataRetriever

import android.content.Context
import android.graphics.Bitmap
import android.media.MediaMetadataRetriever
import android.net.Uri
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp

fun Context.getVideoThumbnail(url: String): Bitmap? {

    val retriever = MediaMetadataRetriever()
    retriever.setDataSource(this, Uri.parse(Uri.encode(url)))

    val timeUs = 3*1000000L // The frame at which seconds you need as thubmnail
    val thumbnailBitmap = retriever.getFrameAtTime(timeUs)

    retriever.release()
    return thumbnailBitmap
}

@Preview(showSystemUi = true)
@Composable
fun VideoThubnailLoading() {
    val context = LocalContext.current
    val bitmp = remember { mutableStateOf<Bitmap?>(null) }

    LaunchedEffect(Unit) {
        bitmp.value =
            context.getVideoThumbnail("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
    }
    Column {
        Text("Hello Video Thumbail loading")

        bitmp.value?.let {
            Image(
                bitmap = it.asImageBitmap(),
                contentDescription = null,
                modifier = Modifier
                    .fillMaxSize()
                    .padding(16.dp) 
            )
        }
    }

}

它看起来像这样:

© www.soinside.com 2019 - 2024. All rights reserved.