首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从谷歌的ExoPlayer中获取观察到的比特率

如何从谷歌的ExoPlayer中获取观察到的比特率
EN

Stack Overflow用户
提问于 2015-08-07 13:31:13
回答 3查看 7.3K关注 0票数 5

我正在使用ExoPlayer播放一个HLS文件,并试图获取实际观察到的比特率(而不是指示的比特率)。

我现在有了onInFoListener接口,但是文档很粗略,有人能帮忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-21 08:38:25

在做了研究之后,我想到了这个:

实际上,ExoPlayer附带了一个可用于此目的的InfoListener接口。这是我写的代码。

(在我的实现中,mVideoPlayer是保存ExoPlayer实例的var名称)

在准备玩家的密码上..。

代码语言:javascript
运行
复制
   ...
   // assigns this as InfoListener for ExoPlayer
   mVideoPlayer.setInfoListener(this);
   ...

稍后的InfoListener实现..。

代码语言:javascript
运行
复制
    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;
    }

这是一个助手函数,它记录以秒为单位加载的字节数。

代码语言:javascript
运行
复制
    /**
     * 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
                }
            }
        }
    }

最后,我们可以利用所有这些信息来估计观察到的鸟.

代码语言:javascript
运行
复制
    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;
    }
票数 3
EN

Stack Overflow用户

发布于 2019-04-23 12:04:13

我知道为时已晚,但这可能会对其他人有所帮助,

代码语言:javascript
运行
复制
Format format = your_exoplayer.getVideoFormat()       //returns Format

现在,一旦您获得了格式,您就可以通过以下代码获得trackName

代码语言:javascript
运行
复制
TrackNameProvider trackNameProvider = new DefaultTrackNameProvider(getResources());
trackNameProvider.getTrackName(format)          //returns track name in string format (Ex:- 640 * 360, 0.50 Mbps)
票数 3
EN

Stack Overflow用户

发布于 2015-08-20 22:40:02

HlsSampleSource有一个EventListener,需要实现几个调用。其中一些调用返回具有属性“位速率”的格式对象(com.google.android.exoplayer.chunk.Format)。

格式出现在: onDownstreamFormatChanged onLoadStarted onLoadCompleted

HlsSampleSource.EventListener可以作为HlsSampleSource的一部分在呈现器构建期间传递。

http://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer/hls/HlsSampleSource.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31879008

复制
相关文章

相似问题

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