Skip to content

Latest commit

 

History

History
194 lines (147 loc) · 7.44 KB

README.md

File metadata and controls

194 lines (147 loc) · 7.44 KB

UsagesOfExoplayer

These are some usages of ExoPlayer.

Simple Examples

MainActivity.java In MainActivity you can choose what you want to do. These are some more simple options.

  1. Play a single video;
  2. Play a playlist;
  3. Clipping a video, this will play only 5 seconds of the video;
  4. Loop a video 5 times.

Play a Single Video

MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(videoUri);

Play a Playlist

// Load each video into a separated MediaSource.
        MediaSource firstSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(videoUri1);
        MediaSource secondSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(videoUri2);
        MediaSource thirdSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(videoUri3);

        // Concatenate the three videos to play them in sequence. 
        // When first video finish, second will play and so on.
        ConcatenatingMediaSource playlistSource = 
                new ConcatenatingMediaSource(firstSource, secondSource, thirdSource);

Clipping a Video

MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
                .createMediaSource(videoUri);

        // Take only from 00:10 to 00:15 seconds of the video (5 seconds total).
        ClippingMediaSource clippingSource = new ClippingMediaSource(
                videoSource,
                10_000_000,
                15_000_000);

Looping a Video

MediaSource videoSource = 
        new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri);

        // Play this video 5 times.
        LoopingMediaSource loopingMediaSource = new LoopingMediaSource(videoSource, 5);

Complex Examples

ComplexActivity.java In ComplexActivity you can choose what you want to do. These are some more complex options.

1. Play a single video:

  • Play a mp4 or DASH video from the internet with fully player layout customization;
  • Custom buttons in the player;
  • Shows when the video is buffering or playing (listen to the player states);
  • The video keeps playing while you rotate the device;
  • Change to full screen when in landscape mode just like youtube app;
  • Works in multi-window mode; (API 24 or greater)
  • Come back to same video position when leaving the app and coming back again.
  • You can choose Video and Audio qualities.

Playing DASH file

private MediaSource buildMediaSource(String type, Uri uri) {
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
                Util.getUserAgent(this, getString(R.string.app_name)), BANDWIDTH_METER);
        switch (type) {
            case TYPE_DASH:
                DashChunkSource.Factory dashChunkSourceFactory = new DefaultDashChunkSource.Factory(dataSourceFactory);
                return new DashMediaSource.Factory(dashChunkSourceFactory, dataSourceFactory).createMediaSource(uri);
            case TYPE_OTHER:
                return new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
            default:{
                throw new IllegalStateException("Unsupported type: " + type);
            }
        }
    }

Customize the player layout

To customize the player layout you just need to:

  1. Copy the file exo_playback_control_view.xml into your app's layout folder;
  2. Customize the way you want;
  3. DO NOT change the items id, otherwise your app will not work.

Look at my exo_playback_control_view.xml to see how I customized it.

Listen to the player states (Show the ProgressBar when buffering)

When there is no media yet (STATE_IDLE):

  • Show the progressBar;
  • Hide the player controllers.

When video is buffering (STATE_BUFFERING):

  • Show the progressBar;
  • Hide the play/pause button. (because this button is in the middle in the same place where the progressBar is placed)

When video is ready to go (STATE_READY):

  • Dismiss the progressBar;
  • Show the play/pause button.
private class PlayerEventListener extends Player.DefaultEventListener{
        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            switch (playbackState) {
                case Player.STATE_IDLE: // The player does not have any media to play.
                    mProgressBar.setVisibility(View.VISIBLE);
                    mPlayerView.hideController();
                    break;
                case Player.STATE_BUFFERING: // The player needs to load media before playing.
                    mProgressBar.setVisibility(View.VISIBLE);
                    mPlayPauseLayout.setVisibility(View.GONE);
                    break;
                case Player.STATE_READY: // The player is able to immediately play from its current position.
                    mProgressBar.setVisibility(View.GONE);
                    mPlayPauseLayout.setVisibility(View.VISIBLE);
                    break;
                case Player.STATE_ENDED: // The player has finished playing the media.
                    break;
                default:
                    break;
            }
        }

2. Play a video with Ads;

First, Create a ImaAdsLoader instance in onCreate method.

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_player);
        
        ...
        imaAdsLoader = new ImaAdsLoader(this, getAdTagUri());
    }
    
    private Uri getAdTagUri() {
        return Uri.parse("https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/single_ad_samples&ciu_szs=300x250&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ct%3Dskippablelinear&correlator=");
    }

You can take more AdTagUris in here.

Second, build an AdsMediaSource with your VideoMediaSource.

private MediaSource buildMediaSourceWithAds(Uri uri) {
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this,
                Util.getUserAgent(this, getString(R.string.app_name)), BANDWIDTH_METER);
        MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
        return new AdsMediaSource(
                videoSource,
                dataSourceFactory,
                imaAdsLoader,
                mPlayerView.getOverlayFrameLayout());
    }