web-dev-qa-db-fra.com

Exoplayer jouant des fichiers m3u8 Android

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 :)

17
Payam30

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();
            }
5
jeff-thexman

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);


  }


}
3
Pratik

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();
        }
    });
2

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);
        }
    });
}
1
Karim Abdell Salam

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.