ExoPlayer - 播放多个视频

时间:2018-04-28 06:27:19

标签: java android exoplayer

我想要从Firebase Listadapter播放视频。当用户点击列表时,他们会播放视频,完成活动后,他们将返回原始列表。

当点击第二个视频时,它会启动ExoPlayer活动,但不会播放视频。如果他们按回并选择原始视频,它将播放正常。

public String mTastingWineID;
public String tastingWineId;
public String mWineVideoID;
public String tastingWineVideoId;
private DataSource.Factory mediaDataSourceFactory;
private boolean isPlaying = false;
public int mVideoResource;
public Uri videoUri;
private static final String TAG = "WineMediaActivity";
private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();
private SimpleExoPlayer player;
private SimpleExoPlayerView mVideoView;
private ComponentListener componentListener;
private long playbackPostiion;
private int currentWindow;
private boolean playWhenReady = true;
private BandwidthMeter bandwidthMeter;
public Firebase wineMediaUrl;
public ValueEventListener wineMediaUrlListener;
private MediaControllerCompat mediaControllerCompat;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.analytics_media_wine_information);
    Bundle bundle = getIntent().getExtras();
    mTastingWineID = bundle.getString(Constants.WINE_ID);
    tastingWineId = mTastingWineID.toString();
    mWineVideoID = bundle.getString(Constants.WINE_VIDEO_ID);
    tastingWineVideoId = mWineVideoID.toString();

    if (player != null){
        player.release();
    }

    getCurrentVideo();

}

public void getCurrentVideo(){
    wineMediaUrl = new Firebase(Constants.FIREBASE_URL).child(FIREBASE_LOCATION_WINE_DETAILS).child(tastingWineId).child(WINE_MEDIA).child(tastingWineVideoId).child("wineVideoUrl");
    wineMediaUrlListener = wineMediaUrl.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            componentListener = new ComponentListener();
            mVideoView = findViewById(R.id.videoView1);
            mVideoView.requestFocus();


            Object tempVideoFiles = dataSnapshot.getValue();
            String str = tempVideoFiles.toString();
            videoUri = Uri.parse(str);

            if (videoUri != null) {
                initializePlayer();

            } else {

                Toast.makeText(WineMediaActivity.this, "No Video Found", Toast.LENGTH_SHORT).show();

            }

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

    mediaDataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "mediaPlayerSample"), (TransferListener<? super DataSource>) bandwidthMeter);


}

private class ComponentListener implements ExoPlayer.EventListener, VideoRendererEventListener, AudioRendererEventListener {

    @Override
    public void onTimelineChanged(Timeline timeline, Object manifest) {

    }

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

    }

    @Override
    public void onLoadingChanged(boolean isLoading) {

    }

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        String stateString;
        switch (playbackState) {
            case ExoPlayer.STATE_IDLE:
                stateString = "ExoPlayer.STATE_IDLE";
                break;
            case ExoPlayer.STATE_BUFFERING:
                stateString = "ExoPlayer.STATE_IDLE";
                break;
            case ExoPlayer.STATE_READY:
                stateString = "ExoPlayer.STATE_IDLE";
                break;
            case ExoPlayer.STATE_ENDED:
                stateString = "ExoPlayer.STATE_IDLE";
                releasePlayer();
                finish();
                break;
            default:
                stateString = "UNKNOWN_STATE";
                break;
        }
        Log.d(TAG, "changed state to: " + stateString + " play when ready: " + playWhenReady);
    }

    @Override
    public void onRepeatModeChanged(int repeatMode) {

    }

    @Override
    public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {

    }

    @Override
    public void onPositionDiscontinuity(int reason) {

    }

    @Override
    public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

    }

    @Override
    public void onSeekProcessed() {

    }

    @Override
    public void onAudioEnabled(DecoderCounters counters) {

    }

    @Override
    public void onAudioSessionId(int audioSessionId) {

    }

    @Override
    public void onAudioDecoderInitialized(String decoderName, long initializedTimestampMs, long initializationDurationMs) {

    }

    @Override
    public void onAudioInputFormatChanged(Format format) {

    }

    @Override
    public void onAudioSinkUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {

    }

    @Override
    public void onAudioDisabled(DecoderCounters counters) {

    }

    @Override
    public void onVideoEnabled(DecoderCounters counters) {

    }

    @Override
    public void onVideoDecoderInitialized(String decoderName, long initializedTimestampMs, long initializationDurationMs) {

    }

    @Override
    public void onVideoInputFormatChanged(Format format) {

    }

    @Override
    public void onDroppedFrames(int count, long elapsedMs) {

    }

    @Override
    public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {

    }

    @Override
    public void onRenderedFirstFrame(Surface surface) {

    }

    @Override
    public void onVideoDisabled(DecoderCounters counters) {

    }
}

private void initializePlayer() {

    if (player == null) {
        TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(this), new DefaultTrackSelector(adaptiveTrackSelectionFactory), new DefaultLoadControl());
        player.addListener(componentListener);
        player.setVideoDebugListener(componentListener);
        player.setAudioDebugListener(componentListener);
        mVideoView.setPlayer(player);
        player.setPlayWhenReady(playWhenReady);
        player.seekTo(currentWindow, playbackPostiion);
    }

    MediaSource mediaSource = new ExtractorMediaSource(videoUri, mediaDataSourceFactory, extractorsFactory, null, null);
    player.prepare(mediaSource, true, false);

}

@SuppressLint("InlinedApi")
private void hideSystemUi() {
    mVideoView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}

private void releasePlayer() {
    if (player != null) {
        playbackPostiion = player.getCurrentPosition();
        currentWindow = player.getCurrentWindowIndex();
        playWhenReady = player.getPlayWhenReady();
        player.removeListener(componentListener);
        mVideoView.setPlayer(null);
        player.setVideoListener(null);
        player.setVideoDebugListener(null);
        player.setAudioDebugListener(null);
        player.release();
        player = null;

        if (wineMediaUrlListener != null) {
            wineMediaUrl.removeEventListener(wineMediaUrlListener);
            wineMediaUrlListener = null;
        }
    }

}

@Override
protected void onPause() {
    super.onPause();
    releasePlayer();
}


@Override
public void onStop() {
    super.onStop();
    releasePlayer();
}

@Override
public void onDestroy() {
    super.onDestroy();
    releasePlayer();
}

为代码道歉,我对编码很感兴趣并希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

原来代码很好 - 错误在于上传视频,他们覆盖了之前的视频,意味着前一个视频无法播放。

相关问题