Exoplayer воспроизведение m3u8 файлов Android
Попробовав несколько способов воспроизведения файлов m3u8 с помощью videoview и mediaplayer , я решил сдаться. Каждый раз, когда я проигрываю файл m3u8, я слышу только голос.(пожалуйста, не пишите URL-адреса из переполнения стека, отвечая на мой вопрос. Я их всех покрасил. )
Расспрашивал вокруг, наконец узнал, чтоэкзоплаер , возможно, тот, кого я ищу. Однако exoplayer, похоже, Новичок, и я не могу найти никакого подходящего учебника. Это было сказано Я сам Новичок и все разговоры о трекере и блабле, кажется, слишком сложно для меня. Я только хочу иметь возможность открывать все мои файлы m3u8 с разных URL-адресов в моем приложении Без передачи их в vlc или любые внешние намерения.
Для записи я использую KitKat и выше. Так что экзоплаер должен быть осуществим.
Так что я отчаянно прошу простой учебник о том, как я могу воспроизводить мои файлы m3u8 с помощью exoplayer или любым другим способом, который показывает видео и воспроизводит аудио и Не только один из их. Пожалуйста, не привязывайте меня к странице exoplayer на google dev. Я тоже там бывал.
Заранее спасибо:)
5 ответов:
На 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(); }
Это самый простой способ потоковой передачи файлов m3u8 с помощью ExoPlayer Lib hope to help 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/abc_live4@136330/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); } }); }
Я создал одно демо-приложение для воспроизведения медиафайла m3u8
Сначала добавьте в файл зависимости gradle
compile 'com.google.android.exoplayer:exoplayer:r2.4.0'Создайте простой файл макета с помощью storage 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); } }
Сейчас нет никаких учебников по
ExoPlayer.ExoPlayerявляется лучшей альтернативойMediaPlayer, но в данный момент не очень дружелюбен к новичкам.Что вам нужно сделать, это перейти на страницу github и взглянуть на класс
Это приложение может открывать множество различных форматов, включаяDemoPlayerв приложенииdemo.hls.
Я работал с m3u8 со следующим кодом
videoView = findViewById(R.id.videoViewXml); final ProgressDialog progressDialog = new ProgressDialog(VideoActivity.this); progressDialog.setMessage("Please Wait"); progressDialog.setCancelable(false); progressDialog.show(); MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController); videoView.setVideoURI(Uri.parse(VIDEO_PATH)); videoView.start(); videoView.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { progressDialog.dismiss(); } });
Comments