我有一个本地 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 秒才能加载,然后才会显示总时间并开始播放。这给我提出了几个问题:
我正在使用 Compose BOM 2023.06.01 和 Media3 1.1.1。
如果你想加快这个过程,我建议在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)
现在,当您想播放媒体时,它将立即开始播放