2017-02-14 6 views
3

Я ищу хороший и простой пример/объяснение, как реализовать ExoPlayer для HLS Adaptive поток. Я новичок и не имею опыта и знаний, поэтому я могу понять, как это сделать из примера кода на git.Exoplayer adaptive hls streaming

Слишком много «движущихся частей», поэтому новичок может понять и использовать его в собственных проектах.

Может кто-нибудь помочь мне узнать и понять, как использовать/внедрить ExoPlayer для достижения этой функциональности?

Спасибо!

ответ

5

Самый простой способ начать использовать ExoPlayer - добавить его как зависимость градиента. Вы должны убедиться, что у вас есть репозиторий jcenter включенный в файл build.gradle в корневом каталоге вашего проекта:

repositories { jcenter() }

Далее, включают в себя следующее в файле build.gradle вашего модуля:

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

1. Ваш Layout File

<?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. Ваш класс File (Activity)

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

Я думаю, что это достаточно для начинающих. Также имейте в виду, что стандартные аудио- и видеокомпоненты этой библиотеки зависят от API MediaCodec от Android, который был выпущен в Android 4.1 (API-уровень 16). Поэтому он не будет работать на Android 4.0 и ниже.

Не забудьте добавить это разрешение на manifest file:

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

+0

Спасибо Vicky! Скажите, будет ли exoplayer автоматически выбирать качество видео в зависимости от полосы пропускания? Я вижу методы, которые должны быть реализованы, но я не понимаю, как я могу его использовать? Пожалуйста, укутайте меня. Спасибо :) – hogar

+2

Exoplayer автоматически выберет видео по полосе пропускания. Тебе не о чем беспокоиться. – Vicky

+0

большое спасибо! Ты спас меня! – hogar

Смежные вопросы