Exoplayer воспроизведение файлов M3u8 Android
после попытки нескольких способов воспроизведения файлов m3u8 с помощью видеообзор и медиаплеер Я решил отказаться. Каждый раз, когда я играю в файл m3u8, я слышу только голос.(пожалуйста, не пишите URL-адреса из переполнения стека, отвечая на мой вопрос. Я их всех покрасил. ) Расспрашивал, наконец-то узнал, что exoplayer может быть, это тот, кого я ищу. Однако exoplayer, похоже, Новичок, и я не могу найти ни одного подходящего учебник. Это было сказано, Я сам Новичок и все разговоры о tracker и blabla кажутся слишком сложными для меня. Я только хочу иметь возможность открывать все мои файлы m3u8 из разных URL-адресов в моем приложении без передача их vlc или любым внешним намерениям.
для записи я использую KitKat и выше. Поэтому exoplayer должен быть реализован.
Так что я отчаянно прошу простой учебник о том, как я могу играть в свои файлы m3u8 с помощью exoplayer или любым другим способом, который показывает видео и воспроизведение аудио и не только один из них. Пожалуйста, не связывайте меня со страницей exoplayer на разработчика Google. Я тоже там был.
спасибо заранее :)
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 надеюсь помочь 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 media file
Сначала добавьте зависимости 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>
создайте простое действие Экзоплаера для воспроизведения файлов.
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
app.
это приложение может открыть много различных форматов, включая 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();
}
});