【问题标题】:Cache for hls video using exoplayer in android在android中使用exoplayer缓存hls视频
【发布时间】:2020-01-29 08:05:02
【问题描述】:

是否可以在 exoplayer 播放时为 hls 类型的视频创建缓存,以便视频完全流式传输后无需再次加载,并在下次单击播放按钮时立即开始播放,如果可能请提供任何解决方案?视频格式为.m3u8类型。

【问题讨论】:

    标签: caching video http-live-streaming exoplayer m3u8


    【解决方案1】:

    对于非 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 等可能更有意义。

    【讨论】:

    • 感谢您的回复,但不支持 hls 类型的视频。它支持像 mp4 这样的直接链接。
    • 它不支持 hls 类型的视频,有提到(注意 AndroidVideoCache 仅适用于媒体文件的直接 url,它不支持任何流媒体技术,如 DASH、SmoothStreaming、HLS。), m3u8 是 hls 类型的视频。
    • 错过了 HLS 部分 - 抱歉。在上面添加了更新。
    • 如果可以降低质量,您可以提供代码或任何参考。
    • 谢谢,如果有任何问题,我会尽力告诉你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2015-04-26
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多