2017-02-14 8 views
3

Ich bin auf der Suche nach guten und einfachen Beispiel/Erklärung, wie ExoPlayer für HLS Adaptive Streaming zu implementieren. Ich bin ein Neuling und habe keine Erfahrung und Wissen, also kann ich herausfinden, wie man das vom Codebeispiel auf Git tut.Exoplayer adaptive hl streaming

Es gibt zu viele "bewegliche Teile", damit Anfänger sie in eigenen Projekten verstehen und wiederverwenden können.

Kann mir jemand helfen zu lernen und zu verstehen, wie man ExoPlayer verwendet/implementiert, um diese Funktionalität zu erreichen?

Danke!

Antwort

5

Der einfachste Weg, um mit dem ExoPlayer zu beginnen, besteht darin, ihn als Graddle-Abhängigkeit hinzuzufügen. Sie müssen sicherstellen, dass Sie die jcenter Repository in der build.gradle Datei im Root Ihres Projekts einbezogen haben:

repositories { jcenter() }

Als nächstes sind die folgenden in Ihrer Moduls build.gradle Datei:

compile 'com.google.android.exoplayer:exoplayer:r2.2.0'

1. Ihr Layout-Datei

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    android:id="@+id/activity_main" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.google.android.exoplayer2.ui.SimpleExoPlayerView 
     android:id="@+id/player_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:focusable="true" 
     app:resize_mode="fill"/> 

    <ProgressBar 
     android:id="@+id/progressBar" 
     style="?android:attr/progressBarStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:visibility="gone"/> 

</FrameLayout> 

2. Ihre Klassendatei (Aktivität)

public class VideoPlayerActivity extends AppCompatActivity implements ExoPlayer.EventListener { 

    private SimpleExoPlayerView simpleExoPlayerView; 
    private String hlsVideoUri = "http://playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8"; 
    private SimpleExoPlayer player; 
    private ProgressBar progressBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video_player); 

     // 1. Create a default TrackSelector 
     Handler mainHandler = new Handler(); 
     BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); 
     TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter); 
     TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); 

     // 2. Create a default LoadControl 
     LoadControl loadControl = new DefaultLoadControl(); 


     // 3. Create the player 
     player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl); 

     simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view); 
     simpleExoPlayerView.setPlayer(player); 

     // Measures bandwidth during playback. Can be null if not required. 
     DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter(); 
     // Produces DataSource instances through which media data is loaded. 
     DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, 
       Util.getUserAgent(this, "Exo2"), defaultBandwidthMeter); 
     // Produces Extractor instances for parsing the media data. 
     ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); 
     // This is the MediaSource representing the media to be played. 
     HlsMediaSource hlsMediaSource = new HlsMediaSource(Uri.parse(hlsVideoUri), dataSourceFactory, mainHandler, new AdaptiveMediaSourceEventListener() { 
      @Override 
      public void onLoadStarted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs) { 

      } 

      @Override 
      public void onLoadCompleted(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) { 

      } 

      @Override 
      public void onLoadCanceled(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded) { 

      } 

      @Override 
      public void onLoadError(DataSpec dataSpec, int dataType, int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaStartTimeMs, long mediaEndTimeMs, long elapsedRealtimeMs, long loadDurationMs, long bytesLoaded, IOException error, boolean wasCanceled) { 

      } 

      @Override 
      public void onUpstreamDiscarded(int trackType, long mediaStartTimeMs, long mediaEndTimeMs) { 

      } 

      @Override 
      public void onDownstreamFormatChanged(int trackType, Format trackFormat, int trackSelectionReason, Object trackSelectionData, long mediaTimeMs) { 

      } 
     }); 

     player.addListener(this); 
     player.prepare(hlsMediaSource); 
     simpleExoPlayerView.requestFocus(); 
     player.setPlayWhenReady(true); 

     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
    } 

    @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) { 

     switch (playbackState) { 
      case ExoPlayer.STATE_BUFFERING: 
       //You can use progress dialog to show user that video is preparing or buffering so please wait 
       progressBar.setVisibility(View.VISIBLE); 
       break; 
      case ExoPlayer.STATE_IDLE: 
       //idle state 
       break; 
      case ExoPlayer.STATE_READY: 
       // dismiss your dialog here because our video is ready to play now 
       progressBar.setVisibility(View.GONE); 
       break; 
      case ExoPlayer.STATE_ENDED: 
       // do your processing after ending of video 
       break; 
     } 
    } 

    @Override 
    public void onPlayerError(ExoPlaybackException error) { 

     AlertDialog.Builder adb = new AlertDialog.Builder(VideoPlayerActivity.this); 
     adb.setTitle("Could not able to stream video"); 
     adb.setMessage("It seems that something is going wrong.\nPlease try again."); 
     adb.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
       finish(); // take out user from this activity. you can skip this 
      } 
     }); 
     AlertDialog ad = adb.create(); 
     ad.show(); 
    } 

    @Override 
    public void onPositionDiscontinuity() { 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (player != null) { 
      player.setPlayWhenReady(false); //to pause a video because now our video player is not in focus 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     player.release(); 
    } 
} 

Ich denke, das für Anfänger genug ist. Bedenken Sie auch, dass die standardmäßigen Audio- und Videokomponenten dieser Bibliothek auf der Android MediaCodec-API basieren, die in Android 4.1 (API-Stufe 16) veröffentlicht wurde. So funktioniert es nicht auf Android 4.0 und darunter.

Vergessen Sie nicht, diese Erlaubnis zum manifest file hinzuzufügen:

<uses-permission android:name="android.permission.INTERNET"/>

+0

Danke Vicky! Bitte sagen Sie, ob der Exoplayer automatisch die Videoqualität abhängig von der Bandbreite wählt? Ich sehe Methoden, die implementiert werden müssen, aber ich verstehe nicht, wie kann ich es verwenden? Bitte bare mit mir. Danke :) – hogar

+2

Exoplayer wählt automatisch Video auf Bandbreite. Sie müssen sich darüber keine Sorgen machen. – Vicky

+0

vielen Dank! Du hast mich gerettet! – hogar