2015-08-07 2 views
3

Я играю файл HLS с использованием ExoPlayer, и я пытаюсь получить фактический наблюдаемый битрейт (а не указанный биттрейт).Как получить наблюдаемый битрейт из ExoPlayer Google

У меня теперь есть интерфейс onInFoListener, но документация отрывочна, может ли кто-нибудь помочь?

+0

Что вы имеете в виду под «Наблюдаемый» против «указано»? – rmp251

+0

Указывается, что появляется в манифесте. Наблюдается фактический битрейт, с которого загружается поток. –

ответ

2

После этого исследования я пришел с этим:

Действительно ExoPlayer поставляется с интерфейсом InfoListener, которые могут быть использованы для этой цели. Это код, который я написал.

(в моей реализации mVideoPlayer это имя вар, который держит мой экземпляр ExoPlayer)

на код, который готовит плеер ...

... 
    // 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 
       } 
      } 
     } 
    } 

Наконец, мы можем использовать всю эту информацию, чтобы получить оценку наблюдаемого birate ...

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; 
    } 
+0

Не можете ли вы просто использовать 'onVideoFormatEnabled', предоставленный' InfoListener'? Он дает вам бит-скорость явно ('format.bitrate'), а также все остальные детали (частота кадров, разрешение и т. Д.). – rmp251

+1

Кажется, у класса ExoPlayer уже нет setInfoListener(). –

+0

Не знаете, что вы имеете в виду. Он по-прежнему существует, проверьте https://github.com/google/ExoPlayer/blob/master/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java#L217 –

1

У 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

+0

Я полагаю, что только бит отображается (?), См. Здесь: https://github.com/google/ExoPlayer/issues/646 –

Смежные вопросы