2017-02-14 24 views
3

HLS Adaptiveストリーミング用にExoPlayerを実装する方法を説明しています。私は初心者であり、経験と知識を持っていないので、gitのコード例からこれを行う方法を理解することができます。Exoplayer適応型hlsストリーミング

初心者が自分のプロジェクトで理解して再利用できるように、「動く部分」が多すぎます。

誰かがこの機能を実現するためにExoPlayerの使用方法と実装方法を学んで理解するのに手伝ってもらえますか?

ありがとうございます!

答えて

5

ExoPlayerの使用を開始する最も簡単な方法は、それをgradle依存関係として追加することです。あなたはjcenterリポジトリは、プロジェクトのルートにbuild.gradleファイルに含まれていることを確認する必要があります。

​​

次に、あなたのモジュールのbuild.gradleファイルに次のものがあります。

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

1.あなたのレイアウトファイル

<?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.あなたのクラスファイル(活動)

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

は、私は、これは初心者のために十分だと思います。また、このライブラリの標準オーディオおよびビデオコンポーネントは、Android 4.1(APIレベル16)でリリースされたAndroidのMediaCodec APIに依存しています。 Android 4.0以降では動作しません。

manifest fileにこの権限を追加することを忘れないでください:

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

+0

はあなたヴィッキーをありがとう! exoplayerが帯域幅に応じて自動的にビデオ品質を選択するかどうかを教えてください。実装する必要があるメソッドがありますが、どのように使用できますか分かりません。 私と一緒に裸にしてください。ありがとう:) – hogar

+2

Exoplayerは自動的に帯域幅のビデオを選択します。あなたはそれについて心配する必要はありません。 – Vicky

+0

ありがとうございます!あなたは私を救った! – hogar

関連する問題