首页 > 解决方案 > 如何初始化 exoplayer 以播放破折号(.mpd)视频

问题描述

我有破折号视频的播放列表,这是我在版本为 2.7.3 时用来播放媒体的代码。现在我已经更新到 2.9.5,我遇到了问题。

我的 init 和 mediasource 方法:

private void initializePlayer() {
       if (player == null) {
  // a factory to create an AdaptiveVideoTrackSelection
  TrackSelection.Factory adaptiveTrackSelectionFactory =
          new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);

  player = ExoPlayerFactory.newSimpleInstance(
          new DefaultRenderersFactory(this),
          new DefaultTrackSelector(adaptiveTrackSelectionFactory),
          new DefaultLoadControl());
  player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(this),
          new DefaultTrackSelector(), new DefaultLoadControl());
  playerView.setPlayer(player);
  player.addListener(new PlayerEventListener());
        /*player.setPlayWhenReady(playWhenReady);
        player.seekTo(currentWindow, playbackPosition);*/
}

playListMediaSources = buildPlayListMediaSource(serialURLs);

concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);

player.prepare(concatenatingMediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
    }



private MediaSource buildMediaSource(Uri uri) {

  /*  DefaultExtractorsFactory defaultExtractorsFactory = new DefaultExtractorsFactory();
    DefaultHttpDataSourceFactory defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory("user-agent");*/

        DataSource.Factory manifestDataSourceFactory =
                new DefaultHttpDataSourceFactory("ua");
        DashChunkSource.Factory dashChunkSourceFactory =
                new DefaultDashChunkSource.Factory(
                        new DefaultHttpDataSourceFactory("ua", BANDWIDTH_METER));
        return new DashMediaSource.Factory(dashChunkSourceFactory,
                manifestDataSourceFactory).createMediaSource(uri);
    }


    private MediaSource[] buildPlayListMediaSource(String[] serialURLs) {


        MediaSource[] mediaSources = new MediaSource[serialURLs.length];
        Uri uri;
        for (int i = 0; i < serialURLs.length; i++) {
            uri = Uri.parse(serialURLs[i]);
            mediaSources[i] = buildMediaSource(uri);
        }
        return mediaSources;
    }

我将我的初始化代码修改为:

 private void initializePlayer() {
        if (player == null) {

            TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory();

           player = ExoPlayerFactory.newSimpleInstance(this,
                    new DefaultRenderersFactory(this),
                    new DefaultTrackSelector(adaptiveTrackSelectionFactory),
                    new DefaultLoadControl());
            player = ExoPlayerFactory.newSimpleInstance(this,new DefaultRenderersFactory(this),
                    new DefaultTrackSelector(), new DefaultLoadControl());


        }


            if (serialURLs != null) {

                playListMediaSources = buildPlayListMediaSource(serialURLs);
                concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);
                player.prepare(concatenatingMediaSource, true, false);
                player.setPlayWhenReady(playWhenReady);
                player.seekTo(currentWindow, playbackPosition);
    }
    }

但无法播放视频。我的猜测是我还必须对媒体源方法进行一些更改,但我无法弄清楚这些更改。使用我当前的代码,日志显示以下错误:

E/AndroidRuntime: FATAL EXCEPTION: ExoPlayerImplInternal:Handler
    Process: com.packagename, PID: 2731
    java.lang.AbstractMethodError: abstract method "void com.google.android.exoplayer2.source.BaseMediaSource.prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"
        at com.google.android.exoplayer2.source.BaseMediaSource.prepareSource(BaseMediaSource.java:140)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.prepareInternal(ExoPlayerImplInternal.java:398)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:285)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)

我正在添加此文本以避免大部分代码错误。任何帮助表示赞赏。提前致谢。

标签: androidexoplayerexoplayer2.x

解决方案


两者com.google.android.exoplayer:exoplayer-core和都com.google.android.exoplayer:exoplayer-dash需要在你的 build.gradle 中是相同的版本。

implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.9.6'

推荐阅读