如何在Exoplayer上使用BandwidthMeter访问带宽(RTMP流媒体)

时间:2018-03-29 19:29:54

标签: java exoplayer2.x

我试图使用getBitRateEstimate获取带宽,但它一直返回-1:

(我认为这个问题与不向DataSourceFactory提供仪表有关,但我无法弄清楚如何做到这一点)

以下是代码:

private void createView(Context context) {
    LayoutParams layoutParams = new LayoutParams(
            LayoutParams.MATCH_PARENT,
            LayoutParams.MATCH_PARENT);

    playerView = new PlayerView(getContext());
    bandwidthMeter = new DefaultBandwidthMeter();
    playerView.setLayoutParams(layoutParams);
    myContext = context;
    addView(playerView, 0, layoutParams);
}

public void initializeMediaPlayer() {
    /**
     * Create Simple Exoplayer Player
     */
    if(player == null) {
        //bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new 
     AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new 
     DefaultTrackSelector(videoTrackSelectionFactory);
        DefaultAllocator defaultAllocator = new 
     DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE);
        LoadControl loadControl = new 
     DefaultLoadControl(defaultAllocator, 1450, 3000, 1000, 1000, 
        C.LENGTH_UNSET, false);

        RenderersFactory renderersFactory = new DefaultRenderersFactory(myContext);
        player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, loadControl);
        playerView.setUseController(false);
        playerView.setPlayer(player);
    }
    /**
     * Create RTMP Data Source
     */

    rtmpDataSourceFactory = new RtmpDataSourceFactory();
    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
    MediaSource videoSource = new ExtractorMediaSource.Factory(rtmpDataSourceFactory).createMediaSource(Uri.parse(source));
    //MediaSource videoSource = new ExtractorMediaSource(Uri.parse("rtmp://35.231.80.114/live/myStream"),
    //      rtmpDataSourceFactory, extractorsFactory, null, null);
    player.addListener(new PlayerEventListener());
    player.setPlayWhenReady(true);
    player.seekToDefaultPosition();
    player.prepare(videoSource);

}

1 个答案:

答案 0 :(得分:0)

RtmpDataSourceFactory有一个构造函数,它以TransferListener为参数。 DefaultBandwidthMeter实现了TransferListener,因此您可以将其传递给构造函数:

DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
RtmpDataSourceFactory rtmpDataSourceFactory =
    new RtmpDataSourceFactory(defaultBandwidthMeter);

通过这种方式,带宽计通知传输的数据,用于计算比特率估计值。