我正在使用ExoPlayer播放一个HLS文件,并试图获取实际观察到的比特率(而不是指示的比特率)。
我现在有了onInFoListener
接口,但是文档很粗略,有人能帮忙吗?
发布于 2015-08-21 08:38:25
在做了研究之后,我想到了这个:
实际上,ExoPlayer附带了一个可用于此目的的InfoListener
接口。这是我写的代码。
(在我的实现中,mVideoPlayer
是保存ExoPlayer实例的var名称)
在准备玩家的密码上..。
...
// assigns this as InfoListener for ExoPlayer
mVideoPlayer.setInfoListener(this);
...
稍后的InfoListener实现..。
private long mBytesLoaded = 0;
private long mBytesLoadedSeconds = 0;
private long mLastBytesLoadedTime = 0;
@Override
public void onLoadStarted(int sourceId, long length, int type, int trigger, Format format, int mediaStartTimeMs, int mediaEndTimeMs) {
Log.d(TAG, "onLoadStarted sourceId " + sourceId + " length " + length + " type " + type + " format " + format + " mediaStartTimeMs " + mediaStartTimeMs + " mediaEndTimeMs " + mediaEndTimeMs);
if(mLastBytesLoadedTime == 0) mLastBytesLoadedTime = System.currentTimeMillis();
}
@Override
public void onLoadCompleted(int sourceId, long bytesLoaded, int type, int trigger, Format format, int mediaStartTimeMs, int mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs) {
Log.d(TAG, "onLoadCompleted sourceId " + sourceId + " bytesLoaded " + bytesLoaded + " type " + type + " format " + format + " mediaStartTimeMs " + mediaStartTimeMs + " mediaEndTimeMs " + mediaEndTimeMs);
// log... logBytesLoadedInSeconds
long now = System.currentTimeMillis();
float diffInSeconds = (now - mLastBytesLoadedTime) / 1000;
this.logBytesLoadedInSeconds(bytesLoaded, diffInSeconds); // helper function, explain bellow
mLastBytesLoadedTime = now;
}
这是一个助手函数,它记录以秒为单位加载的字节数。
/**
* Logs an amount of bytes loaded in an amount of seconds
*
* @param bytes amount of bytes loaded
* @param seconds time in seconds that it took to load those bytes
*/
private void logBytesLoadedInSeconds(long bytes, float seconds){
mBytesLoaded += bytes;
mBytesLoadedSeconds += seconds;
if(mBytesLoadedSeconds > 0){
double bytesPerSecond = mBytesLoaded / mBytesLoadedSeconds;
double bitsPerSecond = bytesPerSecond * 8; // (8 bits in a byte)
if(bitsPerSecond < mIndicatedBitrate){
// buffer is falling behind!
mBufferWarned = true;
}else{
if(mBufferWarned){
// buffer caught up
}
}
}
}
最后,我们可以利用所有这些信息来估计观察到的鸟.
public int getObservedBitrate(){
if(mBytesLoadedSeconds != 0){
double bytesPerSecond = mBytesLoaded / mBytesLoadedSeconds;
double bitsPerSecond = bytesPerSecond * 8; // (8 bits in a byte)
Log.d(TAG," mBytesLoaded " + mBytesLoaded + " in "+mBytesLoadedSeconds+" seconds ("+(int)bitsPerSecond+" b/s indicated "+mIndicatedBitrate+" b/s) ");
return (int)bitsPerSecond;
}
return 0;
}
发布于 2019-04-23 12:04:13
我知道为时已晚,但这可能会对其他人有所帮助,
Format format = your_exoplayer.getVideoFormat() //returns Format
现在,一旦您获得了格式,您就可以通过以下代码获得trackName
TrackNameProvider trackNameProvider = new DefaultTrackNameProvider(getResources());
trackNameProvider.getTrackName(format) //returns track name in string format (Ex:- 640 * 360, 0.50 Mbps)
发布于 2015-08-20 22:40:02
HlsSampleSource有一个EventListener,需要实现几个调用。其中一些调用返回具有属性“位速率”的格式对象(com.google.android.exoplayer.chunk.Format)。
格式出现在: onDownstreamFormatChanged onLoadStarted onLoadCompleted
HlsSampleSource.EventListener可以作为HlsSampleSource的一部分在呈现器构建期间传递。
https://stackoverflow.com/questions/31879008
复制相似问题