Last active
December 23, 2019 20:08
-
-
Save gavelez/af3b397c687576d60570ddd47811e9b0 to your computer and use it in GitHub Desktop.
ExoPlayer multiformat playing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<!-- Copyright (C) 2017 The Android Open Source Project | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. --> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="com.example.exoplayer"> | |
<uses-permission android:name="android.permission.INTERNET"/> | |
<application | |
android:allowBackup="true" | |
android:icon="@mipmap/ic_launcher" | |
android:label="@string/app_name" | |
android:supportsRtl="true" | |
android:usesCleartextTraffic="true"> | |
<activity | |
android:name="com.example.exoplayer.PlayerActivity" | |
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" | |
android:label="@string/player_activity_name" | |
android:theme="@style/PlayerTheme"> | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN"/> | |
<category android:name="android.intent.category.LAUNCHER"/> | |
</intent-filter> | |
</activity> | |
</application> | |
</manifest> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
apply plugin: 'com.android.library' | |
android { | |
compileSdkVersion 29 | |
defaultConfig { | |
minSdkVersion 16 | |
targetSdkVersion 29 | |
versionCode 1 | |
versionName "1.0" | |
} | |
buildTypes { | |
release { | |
minifyEnabled true | |
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | |
} | |
} | |
} | |
dependencies { | |
implementation 'androidx.appcompat:appcompat:1.1.0' | |
implementation 'com.google.android.exoplayer:exoplayer-core:2.10.5' | |
implementation 'com.google.android.exoplayer:exoplayer-dash:2.10.5' | |
implementation 'com.google.android.exoplayer:exoplayer-hls:2.10.5' | |
implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.10.5' | |
implementation 'com.google.android.exoplayer:exoplayer-ui:2.10.5' | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (C) 2017 The Android Open Source Project | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.example.exoplayer; | |
import androidx.appcompat.app.AppCompatActivity; | |
import android.annotation.SuppressLint; | |
import android.net.Uri; | |
import android.os.Bundle; | |
import android.util.Log; | |
import android.view.View; | |
import com.google.android.exoplayer2.C; | |
import com.google.android.exoplayer2.ExoPlayer; | |
import com.google.android.exoplayer2.ExoPlayerFactory; | |
import com.google.android.exoplayer2.Player; | |
import com.google.android.exoplayer2.SimpleExoPlayer; | |
import com.google.android.exoplayer2.source.ExtractorMediaSource; | |
import com.google.android.exoplayer2.source.MediaSource; | |
import com.google.android.exoplayer2.source.dash.DashMediaSource; | |
import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; | |
import com.google.android.exoplayer2.source.hls.HlsMediaSource; | |
import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource; | |
import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; | |
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; | |
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; | |
import com.google.android.exoplayer2.trackselection.TrackSelection; | |
import com.google.android.exoplayer2.trackselection.TrackSelector; | |
import com.google.android.exoplayer2.ui.PlayerView; | |
import com.google.android.exoplayer2.upstream.DataSource; | |
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; | |
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; | |
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; | |
import com.google.android.exoplayer2.upstream.HttpDataSource; | |
import com.google.android.exoplayer2.util.Util; | |
/** | |
* A fullscreen activity to play audio or video streams. | |
*/ | |
public class PlayerActivity extends AppCompatActivity { | |
private PlaybackStateListener playbackStateListener; | |
private static final String TAG = PlayerActivity.class.getName(); | |
private PlayerView playerView; | |
private SimpleExoPlayer player; | |
private boolean playWhenReady = true; | |
private int currentWindow = 0; | |
private long playbackPosition = 0; | |
private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter(); | |
private DataSource.Factory mediaDataSourceFactory; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_player); | |
mediaDataSourceFactory = buildDataSourceFactory(true); | |
playerView = findViewById(R.id.video_view); | |
playbackStateListener = new PlaybackStateListener(); | |
} | |
@Override | |
public void onStart() { | |
super.onStart(); | |
if (Util.SDK_INT > 23) { | |
initializePlayer(); | |
} | |
} | |
@Override | |
public void onResume() { | |
super.onResume(); | |
hideSystemUi(); | |
if ((Util.SDK_INT <= 23 || player == null)) { | |
initializePlayer(); | |
} | |
} | |
@Override | |
public void onPause() { | |
super.onPause(); | |
if (Util.SDK_INT <= 23) { | |
releasePlayer(); | |
} | |
} | |
@Override | |
public void onStop() { | |
super.onStop(); | |
if (Util.SDK_INT > 23) { | |
releasePlayer(); | |
} | |
} | |
private void initializePlayer() { | |
if (player == null) { | |
DefaultTrackSelector trackSelector = new DefaultTrackSelector(); | |
trackSelector.setParameters( | |
trackSelector.buildUponParameters().setMaxVideoSizeSd()); | |
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector); | |
} | |
playerView.setPlayer(player); | |
Uri uri = Uri.parse(getString(R.string.media_url_m3u8)); | |
MediaSource mediaSource = buildMediaSource(uri); | |
player.setPlayWhenReady(playWhenReady); | |
player.seekTo(currentWindow, playbackPosition); | |
player.addListener(playbackStateListener); | |
player.prepare(mediaSource, false, false); | |
} | |
private void releasePlayer() { | |
if (player != null) { | |
playbackPosition = player.getCurrentPosition(); | |
currentWindow = player.getCurrentWindowIndex(); | |
playWhenReady = player.getPlayWhenReady(); | |
player.removeListener(playbackStateListener); | |
player.release(); | |
player = null; | |
} | |
} | |
private MediaSource buildMediaSource(Uri uri) { | |
int type = Util.inferContentType(uri); | |
switch (type) { | |
case C.TYPE_SS: | |
return new SsMediaSource.Factory(new DefaultSsChunkSource.Factory(mediaDataSourceFactory), buildDataSourceFactory(false)).createMediaSource(uri); | |
case C.TYPE_DASH: | |
return new DashMediaSource.Factory(new DefaultDashChunkSource.Factory(mediaDataSourceFactory), buildDataSourceFactory(false)).createMediaSource(uri); | |
case C.TYPE_HLS: | |
return new HlsMediaSource.Factory(mediaDataSourceFactory).createMediaSource(uri); | |
case C.TYPE_OTHER: | |
return new ExtractorMediaSource.Factory(mediaDataSourceFactory).createMediaSource(uri); | |
default: { | |
throw new IllegalStateException("Unsupported type: " + type); | |
} | |
} | |
} | |
private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) { | |
return buildDataSourceFactory(useBandwidthMeter ? BANDWIDTH_METER : null); | |
} | |
public DataSource.Factory buildDataSourceFactory(DefaultBandwidthMeter bandwidthMeter) { | |
return new DefaultDataSourceFactory(this, bandwidthMeter, | |
buildHttpDataSourceFactory(bandwidthMeter)); | |
} | |
public HttpDataSource.Factory buildHttpDataSourceFactory(DefaultBandwidthMeter bandwidthMeter) { | |
return new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "ExoPlayerDemo"), bandwidthMeter); | |
} | |
@SuppressLint("InlinedApi") | |
private void hideSystemUi() { | |
playerView.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_LAYOUT_HIDE_NAVIGATION | |
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); | |
} | |
private class PlaybackStateListener implements Player.EventListener { | |
@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_BUFFERING -"; | |
break; | |
case ExoPlayer.STATE_READY: | |
stateString = "ExoPlayer.STATE_READY -"; | |
break; | |
case ExoPlayer.STATE_ENDED: | |
stateString = "ExoPlayer.STATE_ENDED -"; | |
break; | |
default: | |
stateString = "UNKNOWN_STATE -"; | |
break; | |
} | |
Log.d(TAG, "changed state to " + stateString | |
+ " playWhenReady: " + playWhenReady); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment