Après avoir essayé plusieurs façons de lire des fichiers m3u8 en utilisant videoview et mediaplayer j'ai décidé d'abandonner. Chaque fois que je joue le fichier m3u8, je n'entends que la voix. (N'écrivez pas les URL du débordement de pile en répondant à ma question. Je les ai toutes rouges) J'ai demandé autour de moi, j'ai finalement appris que exoplayer est peut-être celui que je recherche. Cependant exoplayer semble être un débutant et je ne peux trouver aucun bon tutorial . Cela dit, je suis moi-même un débutant et toutes les discussions sur le tracker et le blabla me semblent trop compliquées. Je veux seulement pouvoir ouvrir tous mes fichiers m3u8 à partir de différentes URL dans mon application sans en les transmettant à vlc ou à des intentions externes.
Pour mémoire, j'utilise KitKat et plus. Donc l'exoplayer devrait être implémentable.
Donc, ce que je demande désespérément, c'est un tutoriel simple sur la façon dont je peux lire mes fichiers m3u8 en utilisant exoplayer ou toute autre manière qui montre la vidéo et lit l'audio et [~ # ~] pas [~ # ~] juste l'un d'entre eux. Veuillez ne pas me lier à la page d'exoplayer sur google dev . J'y suis allé aussi.
Merci d'avance :)
Sur Android 4.1+, vous pouvez utiliser cette bibliothèque https://github.com/brianwernick/ExoMedia/ . L'exemple mentionné sur la page Lisez-moi doit être suffisant pour vous aider à démarrer. J'ai reproduit cet extrait de code avec quelques ajouts/modifications.
private void setupVideoView() {
EMVideoView emVideoView = (EMVideoView)findViewById(R.id.video_play_activity_video_view);
emVideoView.setOnPreparedListener(this);
//Enter your m3u8 URL below
emVideoView.setVideoURI(Uri.parse("http://SOMESERVER/playlist.m3u8"));
}
@Override
public void onPrepared(MediaPlayer mp) {
//Starts the video playback as soon as it is ready
emVideoView.start();
}
@Override
public void onPause() {
super.onPause();
//Pause Video Playback
emVideoView.pause();
}
J'ai créé une application de démonstration pour lire le fichier multimédia m3u8
Ajoutez d'abord des dépendances Gradle à votre fichier
compile 'com.google.Android.exoplayer:exoplayer:r2.4.0'
Créez un fichier de mise en page simple avec le chemin de stockage master.m3u8 en entrée et la vue SimpleExoPlayerView pour lire les fichiers téléchargés.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout mlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent" Android:layout_height="match_parent">
<Android.support.design.widget.TextInputEditText
Android:layout_marginTop="15dp"
Android:layout_width="match_parent"
Android:id="@+id/mediaPath"
Android:layout_height="56dp" />
<Android.support.v7.widget.AppCompatButton
Android:id="@+id/play"
Android:layout_marginLeft="50dp"
Android:layout_marginRight="50dp"
Android:layout_below="@+id/mediaPath"
Android:background="@color/colorAccent"
Android:layout_width="match_parent"
Android:text="Play"
Android:layout_height="56dp" />
<com.google.Android.exoplayer2.ui.SimpleExoPlayerView
Android:layout_below="@+id/play"
Android:id="@+id/video_view"
Android:layout_marginTop="5dp"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
</RelativeLayout>
Créez une activité ExoPlayer simple pour lire des fichiers.
public class ExoPlayer extends AppCompatActivity{
Context mContext;
SimpleExoPlayerView playerView;
EditText editText;
private ComponentListener componentListener;
private DataSource.Factory mediaDataSourceFactory;
private Handler mainHandler;
private DefaultTrackSelector trackSelector;
SimpleExoPlayer player;
private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exoplayer);
mContext =this;
editText = (EditText) findViewById(R.id.mediaPath);
Button btnPlay = (Button) findViewById(R.id.play);
playerView = (SimpleExoPlayerView)findViewById(R.id.video_view);
mediaDataSourceFactory = buildDataSourceFactory(true);
mainHandler = new Handler();
componentListener = new ComponentListener();
trackSelector = new DefaultTrackSelector();
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(editText.getText()!=null && editText.getText().length()>0){
initializePlayer(editText.getText().toString());
}
}
});
}
private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) {
return ((AnalyticsApplication) getApplication())
.buildDataSourceFactory(useBandwidthMeter ? BANDWIDTH_METER : null);
}
private void initializePlayer(String path) {
player = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector);
player.addListener(componentListener);
// String path = file:///storage/emulated/0/SugarBox/master.m3u8";
Uri uri = Uri.parse(path);
MediaSource mediaSource = buildMediaSource(uri);
player.prepare(mediaSource, true, false);
playerView.setPlayer(player);
}
private MediaSource buildMediaSource(Uri uri) {
return new HlsMediaSource(uri, mediaDataSourceFactory, mainHandler, null);
}
private void releasePlayer() {
if (player != null) {
player.removeListener(componentListener);
player.release();
player = null;
}
}
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
if(editText.getText()!=null && editText.getText().length()>0){
initializePlayer(editText.getText().toString());
}
}
}
@Override
public void onResume() {
super.onResume();
if ((Util.SDK_INT <= 23 || player == null)) {
if(editText.getText()!=null && editText.getText().length()>0){
initializePlayer(editText.getText().toString());
}
}
}
@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 class ComponentListener implements com.google.Android.exoplayer2.ExoPlayer.EventListener{
@Override
public void onPlayerStateChanged(boolean playWhenReady,
int playbackState) {
String stateString;
switch (playbackState) {
case com.google.Android.exoplayer2.ExoPlayer.STATE_IDLE:
stateString = "ExoPlayer.STATE_IDLE -";
break;
case com.google.Android.exoplayer2.ExoPlayer.STATE_BUFFERING:
stateString = "ExoPlayer.STATE_BUFFERING -";
break;
case com.google.Android.exoplayer2.ExoPlayer.STATE_READY:
stateString = "ExoPlayer.STATE_READY -";
break;
case com.google.Android.exoplayer2.ExoPlayer.STATE_ENDED:
stateString = "ExoPlayer.STATE_ENDED -";
break;
default:
stateString = "UNKNOWN_STATE -";
break;
}
Log.d("ExopLayer", "changed state to " + stateString
+ " playWhenReady: " + playWhenReady);
}
@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 onPlayerError(ExoPlaybackException error) {}
@Override
public void onPositionDiscontinuity() {}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
}
private DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManager(UUID uuid, String licenseUrl, String[] keyRequestPropertiesArray) throws UnsupportedDrmException {
if (Util.SDK_INT < 18) {
return null;
}
HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl,
buildHttpDataSourceFactory(false));
if (keyRequestPropertiesArray != null) {
for (int i = 0; i < keyRequestPropertiesArray.length - 1; i += 2) {
drmCallback.setKeyRequestProperty(keyRequestPropertiesArray[i],
keyRequestPropertiesArray[i + 1]);
}
}
return new DefaultDrmSessionManager<>(uuid,
FrameworkMediaDrm.newInstance(uuid), drmCallback, null, mainHandler, null);
}
private HttpDataSource.Factory buildHttpDataSourceFactory(boolean useBandwidthMeter) {
return ((AnalyticsApplication) getApplication())
.buildHttpDataSourceFactory(useBandwidthMeter ? BANDWIDTH_METER : null);
}
}
J'ai travaillé avec m3u8 avec le code suivant
videoView = findViewById(R.id.videoViewXml);
final ProgressDialog progressDialog = new ProgressDialog(VideoActivity.this);
progressDialog.setMessage("Please Wait");
progressDialog.setCancelable(false);
progressDialog.show();
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setVideoURI(Uri.parse(VIDEO_PATH));
videoView.start();
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
progressDialog.dismiss();
}
});
C'est le moyen le plus simple de diffuser des fichiers m3u8 en utilisant ExoPlayer Lib espérons aider https://github.com/karim23/SimpleStreamPlayer/tree/master
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getApplicationContext();
setContentView(R.layout.activity_main);
//change the live streaming URL with yours.
contentUri = "http://abclive.abcnews.com/i/abc_live4@136330/index_1200_av-b.m3u8?sd=10&b=1200&rebase=on";
// contentType = DemoUtil.TYPE_HLS;
final Intent intent = new Intent(context, VideoPlayerActivity.class).setData(Uri.parse(contentUri))
.putExtra(VideoPlayerActivity.CONTENT_ID_EXTRA, -1)
//Change the type according to the live streaming extension.
.putExtra(VideoPlayerActivity.CONTENT_TYPE_EXTRA, DemoUtil.TYPE_HLS);
liveStreamingTv =(TextView)findViewById(R.id.mainActivity_liveStreamingTv);
liveStreamingTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
Il n'y a pas de tutoriels sur ExoPlayer
pour le moment. ExoPlayer
est la meilleure alternative à MediaPlayer
mais n'est pas très convivial pour les débutants pour le moment.
Ce que vous devez faire, c'est aller sur la page github et jeter un œil à la classe DemoPlayer
dans l'application demo
.
Cette application peut ouvrir de nombreux formats différents, dont hls
.