2017-01-25 4 views
1

ExoPlayer로 기본 앱을 제작하는 데 어려움을 겪고 있습니다.Google ExoPlayer 가이드

+0

ExoPlayer를 구현하는 동안 어려움을 겪고 있습니다. – Mrinmoy

+0

안녕하세요. "시작"부분에 문제가 있습니다. 비디오 나 스트림을 재생하기 위해 무엇을 사용해야하는지 모릅니다. 멈추고, 놀고, 멈추는 법 ... 또 다른 문제는'DefaultDataSourceFactory' 생성자에서 내가 제공하는 것을 모른다는 것입니다. 전체 사용법과 혼동 ... 제발 도와주세요! 감사! – hogar

+0

https://github.com/google/ExoPlayer, git에서 데모 애플리케이션을 다운로드 받아 그대로 가져옵니다. 예제를 실행하고 코드를 탐색하십시오. 응용 프로그램을 실행하는 동안 문제가 발생하면 언제든지 의견을 말하십시오 ... !! – Mrinmoy

답변

14

먼저 당신은 당신의 build.gradle에
컴파일이를 추가해야 'exoplayer : com.google.android.exoplayer r2.1.1'

1. 레이아웃 파일을

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <com.google.android.exoplayer2.ui.SimpleExoPlayerView 
     android:id="@+id/player_view" 
     android:focusable="true" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</RelativeLayout> 

2. 클래스 파일

public class ExoPlayerActivity extends AppCompatActivity implements ExoPlayer.EventListener { 
     SimpleExoPlayer player; 
     String path;  // it can be url of video for online streaming or a url of local video 

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

      // set your path here 
      path=<your path>; 

      // 1. Create a default TrackSelector 
      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 playerView = (SimpleExoPlayerView) findViewById(R.id.player_view); 
      playerView.setPlayer(player); 
      playerView.setKeepScreenOn(true); 
      // Produces DataSource instances through which media data is loaded. 
      DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "ExoPlayer")); 

      // Produces Extractor instances for parsing the media data. 
      ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); 

      // This is the MediaSource representing the media to be played. 
      MediaSource videoSource = new ExtractorMediaSource(Uri.parse(path), 
        dataSourceFactory, extractorsFactory, null, null); 
      // Prepare the player with the source. 
      player.addListener(this); 
      player.prepare(videoSource); 
      playerView.requestFocus(); 
      player.setPlayWhenReady(true);  // to play video when ready. Use false to pause a video 
     } 


     @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 
     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 
        break; 
       case ExoPlayer.STATE_IDLE: 
        //idle state 
        break; 
       case ExoPlayer.STATE_READY: 
        // dismiss your dialog here because our video is ready to play now 
        break; 
       case ExoPlayer.STATE_ENDED: 
        // do your processing after ending of video 
        break; 
      } 
     } 

     @Override 
     public void onPlayerError(ExoPlaybackException error) { 
      // show user that something went wrong. I am showing dialog but you can use your way 
      AlertDialog.Builder adb = new AlertDialog.Builder(ExoPlayerActivity.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() { 
      //Video is not streaming properly 
      Log.d("Mayur", "Discontinuity"); 
     } 

     @Override 
     protected void onDestroy() { 
      super.onDestroy(); 
      player.release(); //it is important to release a player 
     } 
    } 

초보자들에게는 충분하다고 생각합니다. 또한이 라이브러리의 표준 오디오 및 비디오 구성 요소는 Android 4.1 (API 레벨 16)에서 출시 된 Android의 MediaCodec API를 사용합니다. 그래서 안드로이드 4.0 이하에서는 작동하지 않습니다.

+0

고마워, 이건 정말 도움이! :) – hogar

+2

Perfect, 정확히 내가 한 시간 이상 웹에서 찾고있는 것입니다. 나는 이제 막 포기했다. 이 샘플은 비디오 및 오디오 모두에 대한 매력처럼 작동합니다. 매니페스트에 도 추가하십시오. – u2gilles

+0

'com.google.android.exoplayer2.ui.SimpleExoPlayerView' 대신'Exoplayer'를 맞춤 동영상 화면과 함께 사용할 수 있습니까? 내 질문에 https://stackoverflow.com/questions/48920678/exoplayer-how-to-know- 사용자 지정 비디오보기로 재생할 url –