2015-07-14 12 views
9

Nachdem ich mehrere Möglichkeiten zum Abspielen m3u8 Dateien mit Videoansicht und Mediaplayer versucht habe, habe ich aufgegeben. Jedes Mal, wenn ich die m3u8-Datei höre, höre ich nur die Stimme (bitte schreibe keine URLs vom Stapelüberlauf und beantworte meine Frage. Ich habe sie alle rot) Ich habe gefragt, endlich mal erfahren, dass exoplayer vielleicht ist die ich ' Ich suche nach. Allerdings scheint der Exoplayer ein Neuling zu sein und ich kann kein richtiges Tutorial finden. Das sagte ich bin ein Neuling und alle Gespräche über Tracker und Blabla scheinen mir einfach zu kompliziert. Ich möchte nur in der Lage sein, alle meine m3u8 Dateien von verschiedenen URLs in meiner App ohne zu öffnen, die sie an vlc oder irgendwelche externen Absichten weitergibt.Exoplayer M3U8-Dateien spielen Android

Für den Datensatz verwende ich KitKat und höher. Also sollte der Exoplayer implementierbar sein.

Was Im desperatly für die Nachfrage ist ein einfaches Tutorial, wie ich meine m3u8 Dateien exoplayer oder anyother Weise mit spielen kann, das Video zeigt, und die Audio-und NICHT nur einer von ihnen spielen. Bitte verlinke mich nicht auf die Exoplayer-Seite unter google dev. Ich war auch dort.

Vielen Dank im Voraus :)

+0

Jeder? Hilfe? Ich würde es appriciate – Payam30

Antwort

3

auf Android zu helfen, können Sie diese Bibliothek https://github.com/brianwernick/ExoMedia/ verwenden können. Das auf der Read-me-Seite erwähnte Beispiel sollte ausreichen, um Ihnen den Einstieg zu erleichtern. Ich habe dieses Code-Snippet mit einigen Ergänzungen/Modifikationen reproduziert.

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

Es sind keine Tutorials auf ExoPlayer jetzt rechts. ExoPlayer ist eine der besten Alternativen zu MediaPlayer, ist aber im Moment nicht besonders freundlich.

Was Sie tun müssen, ist auf der Github-Seite gehen und einen Blick auf die DemoPlayer Klasse in der demo App.

Diese App kann viele verschiedene Formate einschließlich hls öffnen.

+1

Wie benutze ich die Demo? Muss ich den Code in meine App kopieren? – Payam30

1

Dies ist die einfachste Art und Weise m3u8 Dateien mit ExoPlayer Lib zu streamen Hoffnung 4.1+ 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/[email protected]/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

ich eine Demo-Anwendung erstellt haben m3u8 Mediendatei

Erste hinzufügen gradle Abhängigkeiten zu Ihrer Datei

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

Erstellen Sie eine einfache Layout-Datei mit Speicher master.m3u8 Pfad als Eingabe zu spielen und SimpleExoPlayerView-Ansicht zum Abspielen heruntergeladener Dateien.

<?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> 

Erstellen Sie eine einfache ExoPlayer-Aktivität, um Dateien abzuspielen.

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


    } 


}