Exoplayer多視頻切換和HLS多碼率手動切換

多視頻切換說白點就是上一集下一集功能,在網上找了一下發現幾篇都是要改源代碼的,這麼強大的播放器怎麼會沒有這個功能呢,就換了關鍵字找,最後找到別人說可以用ConcatenatingMediaSource實現,然後又找具體代碼,最後在GitHub裏找到例子AesExoPlayer,後來翻了下Exoplayer的demo代碼發現也有怎麼用ConcatenatingMediaSource的,就是不太明顯castdemo

貼代碼吧

初始化播放器

private SimpleExoPlayer player;
    private Timeline.Window window;
    private Handler handler;
    private void initPlayer(){
        handler = new Handler();
        DefaultTrackSelector trackSelector = new DefaultTrackSelector();
        player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
                Util.getUserAgent(this, "ExoPlayer"));
        String[] s = {"xxxxxx.mp4","xxxxxx.mp4"};
        MediaSource[] videoSources = new MediaSource[s.length];
        for (int i = 0; i < s.length;i++){
            Uri u = Uri.parse(s[i]);
            videoSources[i] = new ExtractorMediaSource.Factory(dataSourceFactory)
                    .createMediaSource(u, handler, null);
        }
        ConcatenatingMediaSource concatenatedSource =
                new ConcatenatingMediaSource(videoSources);
        player.prepare(concatenatedSource);
        window = new Timeline.Window();
    }

上一集

private void previous() {
        Timeline timeline = player.getCurrentTimeline();
        if (timeline.isEmpty()) {
            return;
        }
        int windowIndex = player.getCurrentWindowIndex();
        timeline.getWindow(windowIndex, window);
        int previousWindowIndex = timeline.getPreviousWindowIndex(windowIndex, player.getRepeatMode(),false);
        if (previousWindowIndex != C.INDEX_UNSET) {
            player.seekTo(previousWindowIndex, C.TIME_UNSET);
        } else {
            Log.d("================","第一集");
        }
    }

下一集

private void next() {
        Timeline timeline = player.getCurrentTimeline();
        if (timeline.isEmpty()) {
            return;
        }
        int windowIndex = player.getCurrentWindowIndex();
        int nextWindowIndex = timeline.getNextWindowIndex(windowIndex, player.getRepeatMode(),false);
        if (nextWindowIndex != C.INDEX_UNSET) {
            player.seekTo(nextWindowIndex, C.TIME_UNSET);
        } else{
            Log.d("================","最後一集");
        }
    }

HLS多碼率切換

HLS多碼率切換就是根據m3u8文件內的BANDWIDTH字段來進行切換,BANDWIDTH=700000的時候通過setMaxVideoBitrate(700000)就能切換碼率了

2020/4/2更新

由於我跟新了版本到2.+了而我的代碼還是1.+的版本,忘了我升級的時候刪了代碼setForceHighestSupportedBitrate(true),昨天測試發現不能用,現在改成2.+的,2.+是用setMaxVideoSize根據寬高來切換碼率的,修改代碼

初始化

private SimpleExoPlayer player;
    private Handler mainHandler;
    private DefaultTrackSelector trackSelector;
    private int[] maxWidth = {1920,1280,640};
    private int[] maxHeight = {1080,720,360};
    private void initPlayer(){
        Uri u = Uri.parse("xxx/playlist.m3u8");
        trackSelector = new DefaultTrackSelector();
        DefaultTrackSelector.Parameters parameters = trackSelector.getParameters().buildUpon()
                .setMaxVideoSize(maxWidth[0],maxHeight[0])
                .build();
        trackSelector.setParameters(parameters);
        player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
                Util.getUserAgent(this, "ExoPlayer"));
        MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(u, mainHandler, null);
        player.prepare(videoSource);
    }

切換

public void change(int index){
        DefaultTrackSelector.Parameters parameters = trackSelector.getParameters().buildUpon()
                .setMaxVideoSize(maxWidth[index],maxHeight[index])
                .build();
        trackSelector.setParameters(parameters);
    }

Exoplayer的中文文檔太少了,英文找的好累啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章