我正在尝试使用
ExoPlayer
从 url 播放 mp3 文件。
一切都很好,但现在我想知道音轨的
getDuration()
什么时候是安全的。加载曲目后我只需要它。在google的示例项目中没有找到它。
当我尝试在
exoPlayer.prepare()
之后立即获取它时,我得到 UNKNOWN_TIME
。
好吧,看起来这是唯一的解决方案。
我们向播放器添加侦听器,并在状态更改为
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.
}
});
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();
}
}
要获取持续时间,在媒体准备好并加载到 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项目的源代码。