Media3 ExoPlayer 中视频文件的初始加载时间太长

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

我有一个本地 HTTP 服务器,其中托管 MP4 文件(大约 50MB)。我在我的应用程序中设置了以下可组合项:

@Composable
private fun VideoItem(
    url: String,
    modifier: Modifier = Modifier
) {
    val context = LocalContext.current

    val player = remember(context) {
        ExoPlayer.Builder(context)
            .build()
            .apply {
                val mediaItem = MediaItem.fromUri(url)
                setMediaItem(mediaItem)
                prepare()
                play()
            }
    }

    DisposableEffect(Unit) {
        onDispose {
            player.release()
        }
    }

    Box(
        modifier = modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        AndroidView(
            factory = { context ->
                PlayerView(context).apply {
                    this.player = player
                }
            }
        )
    }
}

URL类似于“http://192.168.123.123:8080/sample.mp4”,我确保手机访问时连接到同一网络。 然而,最初的

prepare()
需要大约 50 秒才能完成 - 也就是说,视频需要大约 50 秒才能加载,然后才会显示总时间并开始播放。这给我提出了几个问题:

  1. ExoPlayer 是否有可能在开始播放之前尝试下载整个文件?这可以解释 50MB 的延迟 50 秒,因为 1MB/s 似乎适合网络。
  2. 如果 1) 为真,为什么完整视频没有立即加载?也就是说,如果我跳到视频中的某个点,“缓冲”仍然会出现,并且需要几秒钟才能从该点开始播放。
  3. 有没有办法加快初始加载速度?或者以某种方式传输视频?

我正在使用 Compose BOM 2023.06.01 和 Media3 1.1.1。

android android-jetpack exoplayer httpserver android-media3
1个回答
0
投票

如果你想加快这个过程,我建议在exoplayer中使用缓存机制,这可以改善加载过程,特别是如果你在开始播放之前使用缓存预加载视频。 使用 CacheDataSourceFactory 作为您的数据源:

cacheDataSourceFactory = new CacheDataSourceFactory(
                SimplePlayerCache.getInstance(),
                dataSourceFactory,
                CacheDataSource.FLAG_BLOCK_ON_CACHE | CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR)

并在预加载过程中使用

创建数据源实例
CacheDataSource cacheDataSource =cacheDataSourceFactory.createDataSource()

然后打开源代码:

cacheDataSource.open(new DataSpec(Uri.parse(play_url)))

之后,开始使用

读取和缓存媒体
cacheDataSource.read(buffer,offset,length)

现在,当您想播放媒体时,它将立即开始播放

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