首页 > 解决方案 > 如何从 m3u8 url 中找出质量并在 exoplayer / videoview android 中设置质量?

问题描述

如何检测 m3u8 url 提供哪些类型的质量(240p、360p、720p、1080p 等)?我猜更改比特率会改变播放器中视频的质量,但比特率的变化是否与质量具有相同的输出?

公共无效initExoPlayer(字符串url,int windowPosition,int playerPosition){

    try {

        playerView = findViewById(R.id.video_player);

        trackSelector = new DefaultTrackSelector();
        defaultTrackParam = trackSelector.buildUponParameters().build();
        trackSelector.setParameters(defaultTrackParam);
        DefaultTrackSelector.Parameters parameters = trackSelector.getParameters();


        Log.d(TAG, "maxVideoBitrate " + trackSelector.getParameters().maxVideoBitrate);

        player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
    playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
        playerView.setPlayer(player);

        fac = new DefaultDataSourceFactory(this, Util.getUserAgent(this, getString(R.string.app_name)));

        Log.d(TAG, "initExoPlayer Url " + videoUrl);
        videoSource = new HlsMediaSource.Factory(fac).createMediaSource(Uri.parse(url));
        player.prepare(videoSource);

        // Plays the video twice.
       player.addListener(new Player.EventListener() {
            @Override
            public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

            }

            @Override
            public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

                try {
                    Log.d(TAG, "trackGroups.length " + trackGroups.length + " trackSelections.length " + trackSelections.length);
                   }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onLoadingChanged(boolean isLoading) {
                if (isLoading) {
                    progress_videoDetail.setVisibility(View.VISIBLE);
                } else {
                    progress_videoDetail.setVisibility(View.GONE);
                }
            }

            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                switch (playbackState) {
                    case ExoPlayer.STATE_READY:
                        progress_videoDetail.setVisibility(View.GONE);
                        duration = player.getDuration();
                        //Toast.makeText(activity,"Duration "+duration,Toast.LENGTH_SHORT).show();
                        break;
                    case ExoPlayer.STATE_BUFFERING:
                        progress_videoDetail.setVisibility(View.VISIBLE);
                        break;
                    case ExoPlayer.STATE_ENDED:
                        progress_videoDetail.setVisibility(View.GONE);
                        break;
                }
            }

            @Override
            public void onRepeatModeChanged(int repeatMode) {

            }

            @Override
            public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {
                progress_videoDetail.setVisibility(View.GONE);
                Snackbar.make(ll_mainVideoDetail, getResources().getString(R.string.some_error_occurrred), Snackbar.LENGTH_SHORT).show();
                releasePlayer();
            }

            @Override
            public void onPositionDiscontinuity(int reason) {
                progress_videoDetail.setVisibility(View.GONE);
            }

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

            }

            @Override
            public void onSeekProcessed() {

            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

标签: androidandroid-videoviewexoplayer

解决方案


你必须TrackSelector在你的initExoPlayerwith中初始化 atrackSelector = new DefaultTrackSelector(/* context= */ this, trackSelectionFactory);

然后你可以使用这个:

MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
int videoRenderer;
if (mappedTrackInfo != null) {
 for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) {
   if (mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO){
     videoRenderer = i;
   }
 }
}

TrackGroupArray qualityArray = mappedTrackInfo.getTrackGroups(videoRenderer).get(0);


推荐阅读