Exoplayer仅播放.m3u8链接,其他仅加载时间但不开始播放

时间:2019-01-01 14:53:13

标签: android exoplayer

我只是将exoplayer设置为播放.m3u8视频。但是某些视频正在播放,如果某些链接不是仅播放时间就播放了。

http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8

此链接已播放...

https://hl.bobtor.com/hl/Mortal.Engines.2018.HDCAM.x264.AC3-MP4KiNG.m3u8

此链接仅在加载时间后才会播放

这是我的代码

公共类MainActivity扩展了AppCompatActivity {

private final String STATE_RESUME_WINDOW = "resumeWindow";
private final String STATE_RESUME_POSITION = "resumePosition";
private final String STATE_PLAYER_FULLSCREEN = "playerFullscreen";

private SimpleExoPlayerView mExoPlayerView;
private MediaSource mVideoSource;
private boolean mExoPlayerFullscreen = false;
private FrameLayout mFullScreenButton;
private ImageView mFullScreenIcon;
private Dialog mFullScreenDialog;

private int mResumeWindow;
private long mResumePosition;


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        mResumeWindow = savedInstanceState.getInt(STATE_RESUME_WINDOW);
        mResumePosition = savedInstanceState.getLong(STATE_RESUME_POSITION);
        mExoPlayerFullscreen = savedInstanceState.getBoolean(STATE_PLAYER_FULLSCREEN);
    }
}


@Override
public void onSaveInstanceState(Bundle outState) {

    outState.putInt(STATE_RESUME_WINDOW, mResumeWindow);
    outState.putLong(STATE_RESUME_POSITION, mResumePosition);
    outState.putBoolean(STATE_PLAYER_FULLSCREEN, mExoPlayerFullscreen);

    super.onSaveInstanceState(outState);
}


private void initFullscreenDialog() {

    mFullScreenDialog = new Dialog(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
        public void onBackPressed() {
            if (mExoPlayerFullscreen)
                closeFullscreenDialog();
            super.onBackPressed();
        }
    };
}


private void openFullscreenDialog() {

    ((ViewGroup) mExoPlayerView.getParent()).removeView(mExoPlayerView);
    mFullScreenDialog.addContentView(mExoPlayerView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    mFullScreenIcon.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_fullscreen_skrink));
    mExoPlayerFullscreen = true;
    mFullScreenDialog.show();
}


private void closeFullscreenDialog() {

    ((ViewGroup) mExoPlayerView.getParent()).removeView(mExoPlayerView);
    ((FrameLayout) findViewById(R.id.main_media_frame)).addView(mExoPlayerView);
    mExoPlayerFullscreen = false;
    mFullScreenDialog.dismiss();
    mFullScreenIcon.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_fullscreen_expand));
}


private void initFullscreenButton() {

    PlaybackControlView controlView = mExoPlayerView.findViewById(R.id.exo_controller);
    mFullScreenIcon = controlView.findViewById(R.id.exo_fullscreen_icon);
    mFullScreenButton = controlView.findViewById(R.id.exo_fullscreen_button);
    mFullScreenButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!mExoPlayerFullscreen)
                openFullscreenDialog();
            else
                closeFullscreenDialog();
        }
    });
}


private void initExoPlayer() {

    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
    LoadControl loadControl = new DefaultLoadControl();
    SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(this), trackSelector, loadControl);
    mExoPlayerView.setPlayer(player);

    boolean haveResumePosition = mResumeWindow != C.INDEX_UNSET;

    if (haveResumePosition) {
        mExoPlayerView.getPlayer().seekTo(mResumeWindow, mResumePosition);
    }

    mExoPlayerView.getPlayer().prepare(mVideoSource);
    mExoPlayerView.getPlayer().setPlayWhenReady(true);
}


@Override
protected void onResume() {

    super.onResume();

    if (mExoPlayerView == null) {

        mExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exoplayer);
        initFullscreenDialog();
        initFullscreenButton();


        Intent in = getIntent();
       // String streamUrl = in.getStringExtra("url");//in.getIntExtra("pos", 0);



        String streamUrl = "https://hl.bobtor.com/hl/Mortal.Engines.2018.HDCAM.x264.AC3-MP4KiNG.m3u8";//"http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8";
        String userAgent = Util.getUserAgent(MainActivity.this, getApplicationContext().getApplicationInfo().packageName);
        DefaultHttpDataSourceFactory httpDataSourceFactory = new DefaultHttpDataSourceFactory(userAgent, null, DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, true);
        DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(MainActivity.this, null, httpDataSourceFactory);
        Uri daUri = Uri.parse(streamUrl);

        mVideoSource = new HlsMediaSource(daUri, dataSourceFactory, 1, null, null);
    }

    initExoPlayer();

    if (mExoPlayerFullscreen) {
        ((ViewGroup) mExoPlayerView.getParent()).removeView(mExoPlayerView);
        mFullScreenDialog.addContentView(mExoPlayerView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        mFullScreenIcon.setImageDrawable(ContextCompat.getDrawable(MainActivity.this, R.drawable.ic_fullscreen_skrink));
        mFullScreenDialog.show();
    }
}


@Override
protected void onPause() {

    super.onPause();

    if (mExoPlayerView != null && mExoPlayerView.getPlayer() != null) {
        mResumeWindow = mExoPlayerView.getPlayer().getCurrentWindowIndex();
        mResumePosition = Math.max(0, mExoPlayerView.getPlayer().getContentPosition());

        mExoPlayerView.getPlayer().release();
    }

    if (mFullScreenDialog != null)
        mFullScreenDialog.dismiss();
}
}

2 个答案:

答案 0 :(得分:0)

我无法打开您的URL,但是从URL上我可以看到流正在使用AC3编解码器。 ExoPlayer不支持AC3编解码器。您需要将FFmpeg扩展名用于ExoPlayer。

https://google.github.io/ExoPlayer/supported-formats.html

答案 1 :(得分:0)

即使没有AC3编解码器,它仍然可以在没有音频的情况下播放...

区别在于,Web服务器显示.m3u8文件,而不将其发送为下载文件。

获取播放列表并将其保存到本地文件系统中可能会有所帮助。