ExoPlayer getDuration

问题描述 投票:0回答:3

我正在尝试使用

ExoPlayer
从 url 播放 mp3 文件。

一切都很好,但现在我想知道音轨的

getDuration()
什么时候是安全的。加载曲目后我只需要它。在google的示例项目中没有找到它。

当我尝试在

exoPlayer.prepare()
之后立即获取它时,我得到
UNKNOWN_TIME

android exoplayer
3个回答
32
投票

好吧,看起来这是唯一的解决方案。

我们向播放器添加侦听器,并在状态更改为

STATE_READY
时获取持续时间。显然,它会在每次播放/暂停操作时调用,因此我们需要用
boolean durationSet
标志
if
检查以在轨道开始时调用它。然后
durationSet = false
靠近
audioPlayer.prepare()

的某个地方
audioPlayer.addListener(new ExoPlayer.Listener() {
        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            if (playbackState == ExoPlayer.STATE_READY && !durationSet) {
                long realDurationMillis = audioPlayer.getDuration();
                durationSet = true;
            }

        }

        @Override
        public void onPlayWhenReadyCommitted() {
            // No op.
        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {
            // No op.
        }
    });

4
投票
private int getVideoDurationSeconds(SimpleExoPlayer player)
    {
        int timeMs=(int) player.getDuration();
        int totalSeconds = timeMs / 1000;
        return totalSeconds;
    }

只需使用 exoplayer 对象调用此方法,您将找到总秒数

完整方法

private String stringForTime(int timeMs) {
    StringBuilder mFormatBuilder = new StringBuilder();
    Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
    int totalSeconds = timeMs / 1000;
  //  videoDurationInSeconds = totalSeconds % 60;
    int seconds = totalSeconds % 60;
    int minutes = (totalSeconds / 60) % 60;
    int hours = totalSeconds / 3600;

    mFormatBuilder.setLength(0);
    if (hours > 0) {
        return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
    } else {
        return mFormatter.format("%02d:%02d", minutes, seconds).toString();
    }
}

0
投票

要获取持续时间,在媒体准备好并加载到 exoplayer 中后,调用

exoPlayer.getDuration()
返回以毫秒为单位的持续时间。

请注意,如果媒体是直播或持续时间不可用,它将返回

C.TIME_UNSET

如果您要展示广告,您还可以自定义自己的持续时间。 telegram android 项目正在做这样的事情:

@Override
  public long getDuration() {
    if (isPlayingAd()) {
      MediaPeriodId periodId = playbackInfo.periodId;
      playbackInfo.timeline.getPeriodByUid(periodId.periodUid, period);
      long adDurationUs = period.getAdDurationUs(periodId.adGroupIndex, periodId.adIndexInAdGroup);
      return C.usToMs(adDurationUs);
    }
    return getContentDuration();
  }

这里是telegram android项目的源代码。

© www.soinside.com 2019 - 2024. All rights reserved.