Мы в Telegram
Добавить новость
103news.com
Работа
Май
2018

Background режим для ExoPlayer на Android

0
Нужно сделать демо-проект в котором ExoPlayer 2.4.4 (версии выше что-то не работают на китайских приставках и других устройствах) будет работать в фоновом режиме.

Для ускорения и упрощения работы ниже привожу методы для инициализации, в данном случае в MainActivity.java, нужно плеер завернуть в сервис.

В качестве демо видео можно использовать http://devimages.apple.com/iphone/samples/bipbop/g...

<com.google.android.exoplayer2.ui.SimpleExoPlayerView android:id="@+id/player_view"
android:focusable="true"
android:visibility="invisible"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"/> private SimpleExoPlayerView simpleExoPlayerView; simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view); simpleExoPlayerView.setUseController(false);
private void initExoPlayer() {

if (exoPlayer == null) {
mainHandler = new Handler();
bandwidthMeter = new DefaultBandwidthMeter();

dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, userAgent), bandwidthMeter);

TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory);

exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
//exoPlayer.addListener(new PlayerEventListener());
exoPlayer.addListener(this);
simpleExoPlayerView.setPlayer(exoPlayer);
}
}

private void releaseExoPlayer() {
if (exoPlayer != null) {
exoPlayer.stop();
exoPlayer.release();
exoPlayer = null;
trackSelector = null;
dataSourceFactory = null;
bandwidthMeter = null;
mainHandler = null;
}
}

public void PlayExoStream(String URL, String type) {

initExoPlayer();

String protectedURL = getURLwithSignature(URL);

Uri url = Uri.parse(protectedURL);
MediaSource videoSource = null;

appendLog(protectedURL);
appendLog(type);

if (type.equals("m3u8")) {
videoSource = new HlsMediaSource(url, dataSourceFactory, mainHandler, null);
}
else if (type.equals("dash")) {
videoSource = new DashMediaSource(url, dataSourceFactory, new DefaultDashChunkSource.Factory(dataSourceFactory), mainHandler, null);
}
// Prepare the player with the source.
if (videoSource != null) {
exoPlayer.prepare(videoSource);
exoPlayer.setPlayWhenReady(true);
}
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
// Do nothing.
}

@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_READY) {
appendLog("ExoPlayer state READY");

simpleExoPlayerView.setVisibility(View.VISIBLE); // эти методы нужно будет вызывать из сервиса
HideOrShowBanner();
requestNewNativeAd();

// включаем таймер TNS (выключается при сворачивании)
runTNSTimer();

controller.SetTextForTVName(clickedChannel.getName());

// после успешного включения снова будем переподключаться
tryRetry = true;
isBuffering = false;
}
if (playbackState == ExoPlayer.STATE_BUFFERING) {
appendLog("ExoPlayer state BUFFERING");
isBuffering = true;
}
if (playbackState == ExoPlayer.STATE_ENDED) {
simpleExoPlayerView.setVisibility(View.INVISIBLE);
appendLog("ExoPlayer state ENDED");
}
if (playbackState == ExoPlayer.STATE_IDLE) {
simpleExoPlayerView.setVisibility(View.INVISIBLE);
appendLog("ExoPlayer state IDLE");
}

}

@Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
float pixelWidthAspectRatio) {
appendLog("onVideoSizeChanged: " + String.valueOf(width) + ", " + String.valueOf(height) + ", " + String.valueOf(pixelWidthAspectRatio));
//videoFrame.setAspectRatio(height == 0 ? 1 : (width * pixelWidthAspectRatio) / height);
}

@Override
public void onRenderedFirstFrame() {

}

@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo != null) {
if (mappedTrackInfo.getTrackTypeRendererSupport(C.TRACK_TYPE_VIDEO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) {
Toast.makeText(MainActivity.this, "Поток без видео (для низкой скорости интернета)", Toast.LENGTH_SHORT).show();
}
if (mappedTrackInfo.getTrackTypeRendererSupport(C.TRACK_TYPE_AUDIO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_UNSUPPORTED_TRACKS) {
Toast.makeText(MainActivity.this, "Поток без аудио", Toast.LENGTH_SHORT).show();
}
}
}

@Override
public void onLoadingChanged(boolean isLoading) {
// Do nothing.
}

@Override
public void onPositionDiscontinuity() {
// Do nothing.
}

@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
// Do nothing.
}

@Override
public void onPlayerError(ExoPlaybackException e) {
String errorString = null;
if (e.type == ExoPlaybackException.TYPE_RENDERER) {
Exception cause = e.getRendererException();
if (cause instanceof MediaCodecRenderer.DecoderInitializationException) {
// Special case for decoder initialization failures.
MediaCodecRenderer.DecoderInitializationException decoderInitializationException =
(MediaCodecRenderer.DecoderInitializationException) cause;
if (decoderInitializationException.decoderName == null) {
if (decoderInitializationException.getCause() instanceof MediaCodecUtil.DecoderQueryException) {
errorString = getString(R.string.error_querying_decoders);
} else if (decoderInitializationException.secureDecoderRequired) {
errorString = getString(R.string.error_no_secure_decoder,
decoderInitializationException.mimeType);
} else {
errorString = getString(R.string.error_no_decoder,
decoderInitializationException.mimeType);
}
} else {
errorString = getString(R.string.error_instantiating_decoder,
decoderInitializationException.decoderName);
}
}
}
if (errorString != null) {
Toast.makeText(getApplicationContext(), errorString, Toast.LENGTH_LONG).show();
}

if (tryRetry) {
final Random random = new Random();
int i = random.nextInt(clickedChannel.Streams.length);
PlayExoStream(clickedChannel.Streams[i].URL, clickedChannel.Streams[i].Type);
tryRetry = false;
Toast.makeText(MainActivity.this, "Переподключение...", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MainActivity.this, "Не удалось установить соединение", Toast.LENGTH_SHORT).show();
}

}




Губернаторы России
Москва

Собянин: Новый корпус больницы святого Владимира планируется открыть в 2025 году





Москва

Артисты – они все особенные!


Губернаторы России

103news.net – это самые свежие новости из регионов и со всего мира в прямом эфире 24 часа в сутки 7 дней в неделю на всех языках мира без цензуры и предвзятости редактора. Не новости делают нас, а мы – делаем новости. Наши новости опубликованы живыми людьми в формате онлайн. Вы всегда можете добавить свои новости сиюминутно – здесь и прочитать их тут же и – сейчас в России, в Украине и в мире по темам в режиме 24/7 ежесекундно. А теперь ещё - регионы, Крым, Москва и Россия.

Moscow.media
Москва

Сергей Собянин. Главное за день



103news.comмеждународная интерактивная информационная сеть (ежеминутные новости с ежедневным интелектуальным архивом). Только у нас — все главные новости дня без политической цензуры. "103 Новости" — абсолютно все точки зрения, трезвая аналитика, цивилизованные споры и обсуждения без взаимных обвинений и оскорблений. Помните, что не у всех точка зрения совпадает с Вашей. Уважайте мнение других, даже если Вы отстаиваете свой взгляд и свою позицию. 103news.com — облегчённая версия старейшего обозревателя новостей 123ru.net.

Мы не навязываем Вам своё видение, мы даём Вам объективный срез событий дня без цензуры и без купюр. Новости, какие они есть — онлайн (с поминутным архивом по всем городам и регионам России, Украины, Белоруссии и Абхазии).

103news.com — живые новости в прямом эфире!

В любую минуту Вы можете добавить свою новость мгновенно — здесь.

Музыкальные новости

Певица

Певица Орлова рассказала о процессе лечения Заворотнюк и врачебной тайне




Спорт в России и мире

Алексей Смирнов – актер, которого, надеюсь, еще не забыли

Среди сотрудников уголовно-исполнительной системы Республики Дагестан определили лучшего гроссмейстера

Росгвардейцы обеспечили безопасность во время футбольного матча в Москве

Дмитрий Вязьмикин – тренер по индивидуальной подготовке молодежного футбола «Локо»


Андре Агасси

Не ходите, дети, в теннис: как Андре Агасси и Штеффи Граф подарили детям право выбора



Новости Крыма на Sevpoisk.ru


Москва

Среди сотрудников уголовно-исполнительной системы Республики Дагестан определили лучшего гроссмейстера



Частные объявления в Вашем городе, в Вашем регионе и в России