2015-07-14 1 views
9

После нескольких попыток воспроизведения файлов m3u8 с помощью videoview и mediaplayer Я решил отказаться. Каждый раз, когда я играю в файл m3u8, я слышу только голос. (Пожалуйста, не пишите url из переполнения стека, отвечая на мой вопрос, я их краснею) Прошу прощения, наконец, узнал, что exoplayer может быть, м ищет. Однако exoplayer, кажется, новичок, и я не могу найти подходящего учебника. Это было сказано, что я сам новичок, и все разговоры о трекерах и блабла кажутся мне слишком сложными. Я хочу только открыть все мои файлы m3u8 из разных URL-адресов в моем приложении без, передавая их в vlc или любые внешние намерения.Экзоплеер, играющий в m3u8 файлы Android

Для записи я использую KitKat и выше. Таким образом, exoplayer должен быть реализован.

Так что Im desperatly прошу это простого учебника в том, как я могу играть мои m3u8 файлы с помощью exoplayer или anyother способа, который показывает видео и воспроизводить аудио и НЕ только один из них. Пожалуйста, не связывайте меня со страницей exoplayer по адресу google dev. Я был там тоже.

Заранее спасибо :)

+0

Кто-нибудь? Помогите? Я бы сказал, что это – Payam30

ответ

3

На Android 4.1+, вы можете использовать эту библиотеку https://github.com/brianwernick/ExoMedia/. Пример, упомянутый на странице Read-me, должен быть достаточным для начала работы. Я воспроизвел этот фрагмент кода с несколькими дополнениями/модификациями.

  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

Там нет учебников по ExoPlayer прямо сейчас. ExoPlayer - лучшая альтернатива MediaPlayer, но на данный момент он не очень дружелюбен.

Что вам нужно сделать, это перейти на страницу github и взглянуть на класс DemoPlayer в приложении demo.

Это приложение может открывать множество различных форматов, включая hls.

+1

Как использовать демо? Мне нужно скопировать код в мое приложение? – Payam30

1

Это самый простой способ для потоковой передачи файлов с помощью m3u8 ExoPlayer Lib надеюсь помочь 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

Я Создал один демо-приложение, чтобы воспроизвести файл m3u8 медиа

Сначала добавьте Gradle зависимостей в файл

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

Созданием простого файла макет с путем хранения master.m3u8 в качестве входных данных и Просмотр SimpleExoPlayerView для воспроизведения загруженных файлов.

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

Создайте простой элемент ExoPlayer для воспроизведения файлов.

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


    } 


}