【发布时间】:2020-01-29 08:05:02
【问题描述】:
是否可以在 exoplayer 播放时为 hls 类型的视频创建缓存,以便视频完全流式传输后无需再次加载,并在下次单击播放按钮时立即开始播放,如果可能请提供任何解决方案?视频格式为.m3u8类型。
【问题讨论】:
标签: caching video http-live-streaming exoplayer m3u8
是否可以在 exoplayer 播放时为 hls 类型的视频创建缓存,以便视频完全流式传输后无需再次加载,并在下次单击播放按钮时立即开始播放,如果可能请提供任何解决方案?视频格式为.m3u8类型。
【问题讨论】:
标签: caching video http-live-streaming exoplayer m3u8
对于非 ABR 流,即不是 HLS 或 DASH 等
有一个很好用的库提供视频缓存功能:
请记住,大型视频会占用大量内存,因此您可能需要考虑要缓存的时间和位置。
ABR 流的更新
自适应比特率流协议(如 HLS 或 DASH)通常对视频的多个比特率版本进行分段,播放器将逐段下载视频,根据网络条件和设备能力选择下一段的比特率.
因此,仅存储您正在观看的内容可能无法获得您想要的结果 - 例如,如果您在观看视频的过程中遇到一些网络拥塞,您可能会收到质量较低的片段,而这可能是您不想要的一个您会观看多次的视频。
您可以下载或播放视频,通过使用轨道选择器强制流始终从一种特定分辨率中进行选择。 ExoPlayer 文档在此处包含一些信息:
在一篇较早的博文(2 年前,但 DownloadHelper 部分仍然相关,我认为)中,Google 提供了有关如何使用 DownloadHelper 的信息 - https://medium.com/google-exoplayer/downloading-adaptive-streams-37191f9776e。
这包括示例:
// Replace with HlsDownloaderHelper or SsDownloadHelper if the stream is HLS or SmoothStreaming
DownloadHelper downloadHelper =
new DashDownloadHelper(manifestUri, manifestDataSourceFactory);
downloadHelper.prepare(
new Callback() {
@Override
public void onPrepared(DownloadHelper helper) {
// Preparation completes. Now other DownloadHelper methods can be called.
List<TrackKey> trackKeys = new ArrayList<>();
for (int i = 0; i < downloadHelper.getPeriodCount(); i++) {
TrackGroupArray trackGroups = downloadHelper.getTrackGroups(i);
for (int j = 0; j < trackGroups.length; j++) {
TrackGroup trackGroup = trackGroups.get(j);
for (int k = 0; k < trackGroup.length; k++) {
Format track = trackGroup.getFormat(k);
if (shouldDownload(track)) {
trackKeys.add(new TrackKey(i, j, k));
}
}
}
}
DownloadAction downloadAction = downloadHelper.getDownloadAction(null, trackKeys);
DownloadService
.startWithAction(context, MyDownloadService.class, downloadAction, true);
}
private boolean shouldDownload(Format track) {...}
@Override
public void onPrepareError(DownloadHelper helper, IOException e) {...}
});
上面的代码查看清单文件 - 这是 DASH 或 HLS 的索引文件,它列出了各个轨道并提供信息,例如URL,在那里找到它们。
它遍历它找到的每个轨道并调用一个函数,您可以根据需要定义该函数来决定是在下载中包含还是排除该轨道。
要在播放流式视频时使用轨道选择,您可以使用 DefaultTrackSelector 以编程方式进行控制:https://exoplayer.dev/track-selection.html。此链接包含一个选择标清视频和德语音轨的示例:
trackSelector.setParameters(
trackSelector
.buildUponParameters()
.setMaxVideoSizeSd()
.setPreferredAudioLanguage("deu"));
如果您正在显示控件,标准播放器还允许用户从控件中选择曲目 - ExoPlayer 演示应用程序 () 包含此功能,用户视图应如下所示:
请注意 - ABR 流式传输非常复杂,需要在服务器端进行额外的处理和存储。如果您希望只使用一种质量级别,那么简单地将视频流式传输或下载为 mp4 等可能更有意义。
【讨论】: