android - ExoPlayer 2 迁移

标签 android migration exoplayer exoplayer2.x

下面是我们使用 ExoPlayer1 从 url 播放 mp4 视频的代码 fragment ,我在升级到 ExoPlayer2 之后。 我不确定升级后要更新什么才能使其正常工作,因为我对 ExoPlayer 本身不太熟悉,也没有太多有用的文档。 如果有人可以遮挡光线,我们将不胜感激。谢谢堆

private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int BUFFER_SEGMENT_COUNT = 256;
private ExoPlayer videoPlayer;
private Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);

private void playVideo(Uri uri) {
    Handler handler = new Handler();
    DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(handler, null);
    DataSource dataSource = new DefaultUriDataSource(getContext(), bandwidthMeter, "Android-ExoPlayer");

    SampleSource sampleSource = new ExtractorSampleSource(
            uri,
            dataSource,
            allocator,
            BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE);

    TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(
            sampleSource,
            MediaCodecSelector.DEFAULT);

    // 2. Construct renderers.
    TrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(
            getContext(),
            sampleSource,
            MediaCodecSelector.DEFAULT,
            MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);

    // 1. Instantiate the player.
    if (videoPlayer == null) {
        videoPlayer = ExoPlayer.Factory.newInstance(4);
    }


        // 3. Inject the renderers through prepare.
        videoPlayer.prepare(videoRenderer, audioRenderer);

        // 4. Pass the surface to the video renderer.
        SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        Surface surface = new Surface(surfaceTexture);
        videoPlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surface);


    videoPlayer.addListener(new ExoPlayer.Listener() {
        @Override
        public void onPlayerStateChanged(boolean b, int i) {
            if (i == ExoPlayer.STATE_READY) {
                mediaControl.setMedia(new MediaControl.Media() {
                    @Override
                    public void setCurrentPosition(long positionMs) {
                        if (videoPlayer != null) {
                            videoPlayer.seekTo(positionMs);
                        }
                    }

                    @Override
                    public long getCurrentPosition() {
                        if (videoPlayer != null) {
                            return videoPlayer.getCurrentPosition();
                        }
                        return 0;
                    }

                    @Override
                    public long getDuration() {
                        if (videoPlayer != null) {
                            return videoPlayer.getDuration();
                        }
                        return 0;
                    }

                    @Override
                    public void start() {
                        if (videoPlayer != null) {
                            videoPlayer.setPlayWhenReady(true);
                        }
                    }

                    @Override
                    public void pause() {
                        if (videoPlayer != null) {
                            videoPlayer.setPlayWhenReady(false);
                        }
                    }

                    @Override
                    public int getBufferedPercentage() {
                        if (videoPlayer != null) {
                            return videoPlayer.getBufferedPercentage();
                        }
                        return 0;
                    }
                });

                mediaControl.start();

                videoPlayer.removeListener(this);
            }
        }

        @Override
        public void onPlayWhenReadyCommitted() {

        }

        @Override
        public void onPlayerError(ExoPlaybackException e) {
            mediaControl.pause();
        }
    });

    // 5. Start playback.
    mediaControl.start();
}

最佳答案

    Handler handler = new Handler();
DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(handler, null);
MediaSource sampleSource = new ExtractorMediaSource(
    uri,
    new DefaultDataSourceFactory(getContext(), "Android-ExoPlayer", bandwidthMeter),
    new DefaultExtractorsFactory(), null, null);

if (videoPlayer == null) {
  Handler mainHandler = new Handler();
  TrackSelection.Factory videoTrackSelectionFactory =
      new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
  TrackSelector trackSelector =
      new DefaultTrackSelector(mainHandler, videoTrackSelectionFactory);
  LoadControl loadControl = new DefaultLoadControl();
  videoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);
}

videoPlayer.prepare(sampleSource);
videoPlayer.setVideoTextureView(textureView);

关于android - ExoPlayer 2 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39527561/

相关文章:

python - 南 : Unknown command 'migrate'

android - exoplayer准备好后如何重新添加媒体源?

Java Android,解码AES-256时出错

Android RecyclerView CardView StaggedGridLayoutManager : Independent column scroll

java - 将应用程序迁移到 Java 7 的动机和动机

android - 如何接收 PlayerNotificationManager 通知按钮的操作,例如停止?

android - 如何在android ExoPlayer中显示字幕

android - 如何放置此符号 : "' "(simple Quotation mark) in a XMLfile of android?

android - Firebase 可以存储阿拉伯语数据吗?

database - Catalyst 中的 DBIx::Class 升级(DBIx::Class::Schema::Loader)