首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >短跑自适应回放与启动轨道,如何?

短跑自适应回放与启动轨道,如何?
EN

Stack Overflow用户
提问于 2018-02-23 13:25:43
回答 2查看 1K关注 0票数 2

在我的应用程序中,我有三种播放自适应破折号视频的方法:

  1. 固定视音频音轨
  2. 自适应视音频音轨
  3. 自适应视频和音频音轨(带启动音轨)

前两种方法工作得很完美,但是第三种方法表现出了奇怪的

我所做的是首先设置'onTracksChanged‘方法的起始轨道。当玩家调用方法onLoadingChanged(false)时,我希望删除对起始轨道的选择,让玩家选择最优的轨道。为了删除所选的内容,我调用了trackSelector.clearSelectionOverrides(),但这完全删除了缓冲区,视频停止并开始在最佳轨道上缓冲。

我想要实现的行为是以下

选择startingt (假设144 p),->加载第一个块,->删除选择的144 p ->,继续在144 p中播放剩余的缓冲区,同时开始在最佳轨道加载。

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-02 19:12:48

你可以用一个AdaptiveTrackSelection和黑名单做所有的轨道,除了那些你想保留。要做到这一点,提供您自己的TrackSelection.Factory似乎是最容易的。

代码语言:javascript
运行
复制
public class StartupTrackSelectionFactory implements TrackSelection.Factory {

  // end blacklisting after ten seconds earliest
  private static final long BLACKLIST_DURATION = 10 * 1000;

  private final BandwidthMeter bandwidthMeter;

  public StartupTrackSelectionFactory(BandwidthMeter bandwidthMeter) {
    this.bandwidthMeter = bandwidthMeter;
  }

  @Override
  public TrackSelection createTrackSelection(TrackGroup group, int... tracks) {
    AdaptiveTrackSelection adaptiveTrackSelection = new AdaptiveTrackSelection(
        group,
        tracks,
        bandwidthMeter,
        AdaptiveTrackSelection.DEFAULT_MAX_INITIAL_BITRATE,
        AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS,
        AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
        AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,
        AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
        AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
        AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
        Clock.DEFAULT);

    int lowestBitrate = Integer.MAX_VALUE;
    int lowestBitrateTrackIndex = C.INDEX_UNSET;
    for (int i = 0; i < tracks.length; i++) {
      Format format = group.getFormat(tracks[i]);
      if (format.bitrate < lowestBitrate) {
        lowestBitrateTrackIndex = i;
        lowestBitrate = format.bitrate;
      }
      adaptiveTrackSelection.blacklist(tracks[i], BLACKLIST_DURATION);
    }
    if (lowestBitrateTrackIndex != C.INDEX_UNSET) {
      adaptiveTrackSelection.blacklist(tracks[lowestBitrateTrackIndex], 0);
    }
    return adaptiveTrackSelection;
  }

}

现在,在创建DefaultTrackSelector时,您可以传递该StartupTrackSelectionFactory并使用它创建一个player实例。

代码语言:javascript
运行
复制
TrackSelection.Factory trackSelectionFactory = 
          new StartupTrackSelectionFactory(BANDWIDTH_METER);
trackSelector = new DefaultTrackSelector(trackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector);

如果您希望保持侦听onLoadChange事件的方法,您可能首先希望将Long.MAX_VALUE作为黑名单持续时间,然后在调用onLoadChange时将所有索引的持续时间设置为0。

票数 4
EN

Stack Overflow用户

发布于 2021-06-10 14:51:14

由于从库中删除了createTrackSelection方法,我们现在可以直接实现AdaptiveTrackSelection.Factory()并覆盖它的createAdaptiveTrackSelection方法,并使用@marcbaechinger的代码。下面是它的kotlin版本。

代码语言:javascript
运行
复制
class SmoothTrackSelectionFactory(bandwidthMeter: DefaultBandwidthMeter) : AdaptiveTrackSelection.Factory() {

    // end blacklisting after ten seconds earliest
    private val BLACKLIST_DURATION = (10 * 1000).toLong()

    private var bandwidthMeter: BandwidthMeter = bandwidthMeter

    override fun createAdaptiveTrackSelection(group: TrackGroup, bandwidthMeter: BandwidthMeter, tracks: IntArray, totalFixedTrackBandwidth: Int): AdaptiveTrackSelection {
        val adaptiveTrackSelection = AdaptiveTrackSelection(
                group,
                tracks,
                bandwidthMeter,
                Integer.MAX_VALUE.toLong(),
                AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS.toLong(),
                AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS.toLong(),
                AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS.toLong(),
                AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
                AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
                AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
                Clock.DEFAULT)
        var lowestBitrate = Int.MAX_VALUE
        var lowestBitrateTrackIndex = C.INDEX_UNSET
        for (i in tracks.indices) {
            val format: Format = group.getFormat(tracks[i])
            if (format.bitrate < lowestBitrate) {
                lowestBitrateTrackIndex = i
                lowestBitrate = format.bitrate
            }
            adaptiveTrackSelection.blacklist(tracks[i], BLACKLIST_DURATION)
        }
        if (lowestBitrateTrackIndex != C.INDEX_UNSET) {
            adaptiveTrackSelection.blacklist(tracks[lowestBitrateTrackIndex], 0)
        }
        return adaptiveTrackSelection
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48948910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档