【问题标题】:Exoplayer live streaming - efficient source switchingExoplayer 直播 - 高效的源切换
【发布时间】:2021-07-02 18:58:49
【问题描述】:

我的 Android 应用使用遥控器浏览一系列 http 直播流。 我使用 TreeMap 将流存储为电视频道,频道号作为键。 下面的代码是打开/更改源 url 的函数。 我想知道您是否可以提出一种更简洁有效的方法来快速切换到另一个来源。也可能减少下一个来源的加载时间。

private void playUrl(String url) {
    Uri videoUri = Uri.parse(url);
    DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();

    try {
        player.stop();
    } catch (Exception e) {

        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

        player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
        PlayerView simpleExoPlayerView = findViewById(R.id.player_view);

        ////Set media controller
        simpleExoPlayerView.setUseController(false);//set to true or false to see controllers
        simpleExoPlayerView.requestFocus();
        // Bind the player to the view.
        simpleExoPlayerView.setPlayer(player);
    }

    // Measures bandwidth during playback. Can be null if not required.
    // Produces DataSource instances through which media data is loaded.
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "CanaliTV2"), bandwidthMeter);

    MediaSource videoSource = new HlsMediaSource(videoUri, dataSourceFactory, 1, null, null);
    // Prepare the player with the source.
    player.prepare(videoSource);
    player.setPlayWhenReady(true); //run file/link when ready to play.
}

【问题讨论】:

    标签: android performance http-live-streaming exoplayer2.x


    【解决方案1】:

    这是一个困难而复杂的主题,也是我最近一直在审视自己的主题。

    当您在播放器上调用 prepare 时,它​​实际上会重新启动它。因此,播放器当前使用的任何资源(可能是渲染器和编解码器、drm 会话等)都会被释放,然后为新流重新创建。此时数据源需要获取数据。

    通过继续为每个通道调用准备,在切换“通道”后真正改善播放启动时间的唯一方法是,如果新数据源以某种方式被缓存以预测切换。

    我认为,为了做到这一点,您需要自己的数据源工厂。编写自己的最简单的方法是首先将默认的源代码复制到您自己的类中,然后开始计算您需要进行哪些更改才能满足您的要求。

    现在您可以使用 LoadControl 缓存值来确定在播放之前将下载多少数据,这样做您会尽量减少不必要的数据传输,同时尽可能快地开始播放。 - 通常建议大约 2.5 秒(Exoplayers DefaultLoadControl 开箱即用地提供此值),但根据内容 cdn 的好坏,您可能可以少用一些。

    但实际上,一个更好、更有效的方法是不必每次都调用 prepare。因此,您可以通过添加新的 MediaItem 实例来操纵播放器播放列表。有关详细信息,请参阅here

    理论上,您实际上可以将所有频道 MediaItems 添加到同一个播放器,然后当用户更改频道时,您可以寻找下一个 MediaItem 的开头。这意味着玩家不需要重新实例化所有所需的资源,这可能对您更有效。

    这个答案是我的意见,我可能没有提供最佳实践,但正如我所说,我最近调查了一些非常相似的事情,但在如何完成我的任务的任何硬性事实方面几乎没有成功。所以这就是我想出的大致轮廓。

    希望对您有所帮助。 (抱歉有点啰嗦)

    【讨论】:

    • 感谢您的回复。第一个解决方案可能不是最佳的,因为我不知道用户将切换到的下一个来源是什么,它们可以随机访问。我需要研究第二种解决方案,即使我不确定它如何应用于实时资源
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2015-10-07
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多