Вопросы с тегами [exoplayer2.x]

0

голосов
0

ответ
4

Просмотры

Печать значение функций MediaDrmCallback

В настоящее время я работаю над DRM с ExoPlayer, и я пытаюсь выяснить, что возвращают функции в MediaDrmCallback в то есть executeProvisionRequest и executeKeyRequest в ByteArray. Я прочитал страницу разработчика для MediaDrm, но он говорит, что сервер возвращает лицензию, которую я хотел бы напечатать, но только проблема в том, что это в ByteArray я попытался с помощью UTF-8 кодировки и ASCII кодировки, но оба из них напечатать некоторые неизвестные символы. переопределить прикольные executeProvisionRequest (UUID: UUID ?, запрос: ExoMediaDrm.ProvisionRequest?): ByteArray {? VAL URL = запрос .defaultUrl + "& signedRequest =" + String (. запрос !! данные) возвращает executePost (URL, NULL, NULL)} переопределить прикольных executeKeyRequest (UUID: UUID ?, запрос: ExoMediaDrm.KeyRequest): ByteArray {вал requestProperties = HashMap () requestProperties [ "X-AxDRM-Message"
Rahul Rawat
1

голосов
2

ответ
2k

Просмотры

Класс раздувание ошибок com.google.android.exoplayer2.ui.SimpleExoPlayerView

Одна Странная вещь: код работает нормально при использовании эмулятора, но происходит сбой при запуске строительства без знака APK. при подключении к андроиду студии, он дает следующее сообщение об ошибке: java.lang.RuntimeException: Не удается запустить активность ComponentInfo {com.tv2z.demo / com.tv2z.demo.DemoActivity}: android.view.InflateException: Binary XML файл строка # 32: Binary XML файл строка # 32: Ошибка класса накачивания com.google.android.exoplayer2.ui.SimpleExoPlayerView в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2665) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java : 2726) при android.app.ActivityThread.-wrap12 (ActivityThread. Нет поля SimpleExoPlayerView_shutter_background_color типа I в классе Lcom / Google / Android / exoplayer2 / щ / R $ styleable; или его суперкласса (Декларация «com.google.android.exoplayer2.ui.R $ styleable» появляется в /data/app/com.tv2z.demo-1/base.apk:classes9.dex) в com.google.android .exoplayer2.ui.SimpleExoPlayerView (SourceFile: 274). в com.google.android.exoplayer2.ui.SimpleExoPlayerView (SourceFile: 233). Это мой файл XML: Это мой файл DemoActivity: общественный класс DemoActivity расширяет AppCompatActivity реализует View. OnClickListener, PlaybackControlView.VisibilityListener {частный статический окончательный DefaultBandwidthMeter BANDWIDTH_METER = новый DefaultBandwidthMeter (); частный статический конечная строка TAG = «PlayerActivity»; частный SimpleExoPlayer игрок; частный SimpleExoPlayerView playerView; Строка videoURL = "http://www.sample-videos.com/video/mp4/360/big_buck_bunny_360p_30mb.mp4"; частный длинный playbackPosition; частное ИНТ currentWindow; частный длинный playerPosition; частное логическое isTimelineStatic; частное ИНТ playerWindow; частное окно Timeline.Window; частное логическое shouldAutoPlay; частный CustPlugin плагин; Tracker трекер общественности; общественные MediaDetails medDetails; частный EventLogger eventLogger; @Override защищены недействительный OnCreate (Пачка savedInstanceState) {super.onCreate (savedInstanceState); shouldAutoPlay = ложь; // сделать его ложным, чтобы остановить автовоспроизведение setContentView (R.layout.activity_demo); ButterKnife.bind (это); Окно = новый Timeline.Window (); playerView = новый SimpleExoPlayerView (это); playerView = (SimpleExoPlayerView) findViewById (R.id.exo_player_view); playerView.setControllerVisibilityListener (это); playerView.requestFocus (); трекер = ((Tv2zApplication) getApplication ()) getTracker (). } Частные MediaDetails setMediaDetails () {medDetails = новые MediaDetails (); medDetails.setMediaId (CustPlugin.generateUniqueId ()); medDetails.setMediaTitle ( "Test Exo Android-плеер"); medDetails.setMediaUrl (videoURL); medDetails.setPlayerName ( "Exo Android-плеер"); medDetails.setWidth ( "1280"); medDetails.setHeight ( "960"); medDetails.setMediaLength ((INT) player.getDuration () / 1000); medDetails.setCdUserId ( "EXO001"); medDetails.setCdMediaId ( "1234"); medDetails. setCdProgramType ( "видео по запросу"); medDetails.setCdProgramId ( "4567"); medDetails.setCdDuration (52); вернуться medDetails; } / ** // time_to_initial_play будет равен нулю, если «shouldAutoPlay» истинно // Функция OnStart () и onResume () такие же, как и срабатывает только один раз, когда игрок загружается // Разница в том, что OnStart срабатывает для API 23 и в то время как onResume для API менее 23 ** / @Override защищены недействительным OnStart () {super.onStart (); если (Util.SDK_INT> 23) {initializePlayer (); }} @Override защищен недействительный onResume () {super.onResume (); hideSystemUi (); если (Util.SDK_INT верно // Функция OnStart () и onResume () такие же, как и срабатывает только один раз, когда игрок загружается // Разница в том, что OnStart срабатывает для API 23 и выше, а onResume для API менее 23 ** / @Override защищены аннулированию OnStart () {super.onStart (); если (Util.SDK_INT> 23) {initializePlayer (); }} @Override защищен недействительный onResume () {super.onResume (); hideSystemUi (); если (Util.SDK_INT верно // Функция OnStart () и onResume () такие же, как и срабатывает только один раз, когда игрок загружается // Разница в том, что OnStart срабатывает для API 23 и выше, а onResume для API менее 23 ** / @Override защищены аннулированию OnStart () {super.onStart (); если (Util.SDK_INT> 23) {initializePlayer (); }} @Override защищен недействительный onResume () {super.onResume (); hideSystemUi (); если (Util.SDK_INT
Ayush Badraj
1

голосов
0

ответ
107

Просмотры

Exo игрок на видео изменения ориентации становится все начался с самого начала, а не с предыдущей позиции

Я пытаюсь реализовать Exoplayer в приложении выпечки, но когда ориентация изменяется видео становится все началось с самого начала, а не с предыдущей позиции. Я попробовал все. Я приведу код, экзо игрока в классе StepFragment. https://github.com/AhmedHamdan54/iBake
Ahmed
1

голосов
0

ответ
181

Просмотры

Как играть шифрованный тир куски в exoplayer2

я пытался играть не-зашифровано приборный поток работает гладко с любой проблемой в exoplayer2 .. но я не имею понятие, как расшифровывать поток и безупречен, как он работает с вне шифрования. я не пробовал с exoplayer дешифровки кода необходимости предложение сделать это. я использовал FFmpeg и MP4Box сделать так intercept.mp4 -> это видео источника оригинальной файл // - ВИДЕО И АУДИО разделяющий И РАЗРЕШЕНИЕ SPERATING SCRIPT FFmpeg -i intercept.mp4 -s 320x180 -c: v libx264 -b: v 500k -g 90 -an INVI_320x180_500k.mp4 & FFmpeg -i intercept.mp4 -с: ​​а ААС -b: INAU_128k.mp4 & 128К -vn // --------------- - XML-файл с ключом и IV IN AES CTR РЕЖИМЕ ----------- // - ENCRYPTION SCRIPT MP4Box -crypt drm.xml INVI_320x180_500k.mp4 отъезда INVI_320x180_500k_ENCRYPTED.mp4 MP4Box -crypt drm.xml INAU_128k. mp4 отъезда INAU_128k_ENCRYPTED. незашифрованные URL незашифрованного URL не работает безупречно с кодом exoplayer и не искать время даже для 2HRS видео Кода для Andriod компонент SimpleExoPlayerView кода Java общественного класса PlayMpd расширяет AppCompatActivity {личного Струнный VIDEO_URI; //"http://weit.in/sidd/int/manifest.mpd "; частный SimpleExoPlayer игрок; частные SimpleExoPlayerView simpleExoPlayerView; частный Handler MainHandler; частный TrackSelection.Factory videoTrackSelectionFactory; частный TrackSelector trackSelector; частный LoadControl LoadControl; частный DataSource.Factory dataSourceFactory; частный Aes128DataSource aes128DataSource; частный MediaSource видеоисточник; частные Uri Uri; частная строка UserAgent; частный статический окончательный DefaultBandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (); частный Cipher шифр; @Override защищены недействительный OnCreate (Пачка savedInstanceState) {super.onCreate (savedInstanceState); GetWindow () setFlags (WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). // это обезопасит приложение с экрана и с экрана записи setContentView (R.layout.activity_play_mpd); // Намерение URL = getIntent (); // VIDEO_URI = url.getStringExtra ( "URL") ToString (). VIDEO_URI = «зашифрованы или расшифрованы UTL МПД файла»; simpleExoPlayerView = findViewById (R.id.player_view); UserAgent = Util.getUserAgent (это, "SimpleDashExoPlayer"); createPlayer (); attachPlayerView (); preparePlayer (); } // Создание TrackSelection Factory, Track селектор, Handler, контроль нагрузки и ExoPlayer Instance общественности недействительным createPlayer () {MainHandler = новый обработчик (); videoTrackSelectionFactory = новый AdaptiveTrackSelection.Factory (bandwidthMeter); // videoTrackSelectionFactory = новый AdaptiveVideoTrackSelection.Factory (bandwidthMeter); trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); LoadControl = новый DefaultLoadControl (); Игрок = ExoPlayerFactory.newSimpleInstance (это, trackSelector, LoadControl); } // Установить игрок SimpleExoPlayerView общественности недействительным attachPlayerView () {simpleExoPlayerView.setPlayer (игрок); } // Построение источника данных Factory, черточки Media Source, и подготовить игрок с использованием видеоисточника общественной ничтожной preparePlayer () {uriParse (); dataSourceFactory = buildDataSourceFactory (bandwidthMeter); видеоисточник = новый DashMediaSource (URI, buildDataSourceFactory (нуль), новый DefaultDashChunkSource.Factory (dataSourceFactory), MainHandler, NULL); player.prepare (видеоисточник); } // Анализировать VIDEO_URI и сохранить в переменной Uri общественной ничтожной uriParse () {URI = Uri.parse (VIDEO_URI); } // Построение источника данных с использованием фабрики DefaultBandwidthMeter и HttpDataSource.Factory частных DataSource.Factory buildDataSourceFactory (DefaultBandwidthMeter bandwidthMeter) {возвратить новый DefaultDataSourceFactory (это, bandwidthMeter, buildHttpDataSourceFactory (bandwidthMeter)); } // Построить Http Источник данных завода с использованием DefaultBandwidthMeter частного HttpDataSource. Фабрика buildHttpDataSourceFactory (DefaultBandwidthMeter bandwidthMeter) {возвратить новый DefaultHttpDataSourceFactory (UserAgent, bandwidthMeter); } // активность OnStop, игрок должен быть освободить из-за экономию памяти @Override общественного недействительный OnStop () {super.onStop (); player.release (); }} Нужно предложение для расшифровки сегментов и играть непосредственно.
Siddhesh Zele
1

голосов
1

ответ
91

Просмотры

Как скачать ClearKey зашифрованного видео в ExoPlayer 2

Я имею .MPD файл, который шифруется с помощью схемы ClearKey DRM. Я могу играть этот файл в Exoplayer2 с подключением к Интернету. Exoplayer2 использует LocalMediaDrmCallback лицензирования файла .MPD Теперь я пытаюсь загрузить это видео в автономном режиме, после того, что играть в эти автономные видео в Exoplayer2 (без подключения к Интернету). До сих пор я пытался использовать DashDownloadHelper для загрузки видео с .MPD файла. Пожалуйста, руководство меня, как предоставить сведения о лицензировании при загрузке файла.
Kushal
1

голосов
2

ответ
1.9k

Просмотры

Настройка MediaController в Exoplayer 2

Я хотел бы настроить целиком медиа контроллер ExoPlayer, отделяя контроллер от самого вида. Я видел несколько сообщений о Exoplayer 1 версии (это один действительно полезно: Пользовательский интерфейс на exoplayer образце), но ничего о Exoplayer 2 (что я использую). Код между версиями 1 и 2 изменяется, и я не могу найти способ получить тот же MediaController, как в версии 1. Не могли бы вы мне помочь?
Manuela
1

голосов
1

ответ
296

Просмотры

Exoplayer2 OutOfMemoryError Exeption и авария приложения

в моей игровой консоли, я получаю этот отчет об ошибке, как я могу справиться с этим? вот отчет о сбое. java.lang.OutOfMemoryError: в android.media.AudioTrack.getTimestamp (AudioTrack.java:1396) в com.google.android.exoplayer2.audio.AudioTrack $ AudioTrackUtilV19.updateTimestamp (AudioTrack.java) в com.google.android.exoplayer2 .audio.AudioTrack.maybeSampleSyncParams (AudioTrack.java) при com.google.android.exoplayer2.audio.AudioTrack.getCurrentPositionUs (AudioTrack.java) при com.google.android.exoplayer2.audio.MediaCodecAudioRenderer.getPositionUs (MediaCodecAudioRenderer.java) в com.google.android.exoplayer2.ExoPlayerImplInternal.updatePlaybackPositions (ExoPlayerImplInternal.java) в com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork (ExoPlayerImplInternal.java) на ком.
Bhavesh Rangani
1

голосов
1

ответ
1.5k

Просмотры

Только аудио плеер для Exoplayer 2 (Нет видео)

В настоящее время я создал SimpleExoplayer используя ниже https://github.com/googlecodelabs/exoplayer-intro/tree/master/exoplayer-codelab-01 UI для SimpleExoplayer имеет вид видео и управления. Удаление и / или настройка просмотра видео не работает должным образом. Любое использование случай SimpleExoplayer только с аудио контроля и без вида видео.
kunal.c
1

голосов
1

ответ
196

Просмотры

ExoPlayer набор команд не могу найти UNKNOWN_TIME

я пытаюсь установить команды exoPlayer, но я не знаю, как установить getDuration (); getCurrentPosition (); Я нашел это, но то, что я должен установить на UNKNOWN_TIME вызвать его говорить мне не может разрешить символ UNKNOWN_TIME @Override общественности Int getCurrentPosition () {вернуться exoPlayer.getDuration () == ExoPlayer.UNKNOWN_TIME? 0: (интермедиат) exoPlayer.getCurrentPosition (); } @Override общественного ИНТ getDuration () {вернуться exoPlayer.getDuration () == ExoPlayer.UNKNOWN_TIME? 0: (интермедиат) exoPlayer.getDuration (); }
Franko Loshe
1

голосов
1

ответ
457

Просмотры

ExoPlayer2 установить начальный трек в плейлист

Я использую ExoPlayer 2.3.1 для воспроизведения списка видео. Я использую код из образца: MediaSource MediaSource = mediaSources.length == 1? mediaSources [0]: новый ConcatenatingMediaSource (mediaSources); player.prepare (MediaSource, haveResumePosition, ложь!); Это работает отлично, но я хочу, чтобы выбрать видео для воспроизведения первого. Например, у меня есть 3 видео, когда я нажму на втором он должен играть и prev / next в плеере должен быть доступны. Теперь он начинает играть с первого MediaSource в массиве, и я не могу найти способ, чтобы установить индекс начальной дорожки или что-то в этом роде.
Nik Kober
1

голосов
1

ответ
1.1k

Просмотры

Получите все, что в от ExoPlayer Cache

Использование https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/upstream/cache/CacheDataSourceFactory.html есть способ, чтобы захватить все MediaSources, которые были кэшируются?
Nic Capdevila
1

голосов
1

ответ
65

Просмотры

Как поручить exoplayer сделать паузу в определенной позиции заранее?

Я адресность поток видео HLS, который должен быть воспроизведены по частям и между частями я должен показать некоторые анимации. Например, первая часть имеет продолжительность 19,2 секунды. Что будет лучшим способом запланировать exoplayer сделать паузу после точной продолжительности? В настоящее время я использую обработчик, чтобы сделать паузу после точной продолжительности, что, конечно, не является хорошим решением, потому что мы можем иметь дело, когда видео не загружаются.
Levon Petrosyan
0

голосов
0

ответ
10

Просмотры

ExoPlayer can't play audio/video streamed (RTMP) by Adobe live stream encoder

Я использую Adobe Live Stream кодировщик в поток RTMP живого звука в стороне сервера. в моем андроид приложение клиента, ExoPlayer с RTMP Extension не может играть и вызывает RtmpIOException, но я могу играть с VLC или MPC. Я проверил мое приложение для Android с некоторыми другими ссылками RTMP и это было нормально. Я также использовал этот адрес в других проигрывателях, установленных в телефоне (MxPlayer, VLC), и это было нормально. это код в андроид для воспроизведения видео: BandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (); TrackSelection.Factory videoTrackSelectionFactory = новый AdaptiveTrackSelection.Factory (); TrackSelector trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); // Создание игрока игрока = ExoPlayerFactory.newSimpleInstance (это, trackSelector); playerView.setPlayer (игрок); MediaSource видеоисточника = NULL; Uri Uri = Uri.parse ( "RTMP: //172.18.
Ali.M
0

голосов
0

ответ
5

Просмотры

Как реализовать ExoPlayer с Databinding?

У меня есть макет класса activity_player, в котором у меня есть exoplayer2.ui.PlayerView и я создал exo_player_control_view так, что она перекрывает стандартные элементы управления в ExoPlayer. Поэтому я хотел бы использовать Databinding во вновь созданный зрения таможенного контроля, но не знаю, как это сделать. Любой совет?
musooff
0

голосов
0

ответ
5

Просмотры

IncompatibleClassChangeError Exoplayer при использовании пользовательского макета контроллера с Proguard?

Am, используя пользовательский шаблон контроллера для Exoplayer PlayerView. Приложение работает нормально, как в режиме отладки, но когда я позволил ProGuard Падает с IncompatibleClassChangeError. Если я использую use_controller как ложь не существует проблема с приложением, но используя use_controller приложение сбой в режиме выпуска
Bincy Baby
17

голосов
1

ответ
1.5k

Просмотры

источник обновления средств массовой информации в exoplayer

Я использую Exo игрок ExtractorMediaSource для воспроизведения видео в моем приложении для Android. Я загрузка медиа с сервера и сохранить в локальной базе данных и по конкретному времени Alarm я играть в этом медиа с помощью ConcatenatingMediaSource в экзо игроке. но сначала я проверить, что все видео файл, загруженный или нет и начать плеер с источником Загруженные медиа. и если видео не загружается, то я хочу, чтобы загрузить его в фоновом режиме в том, когда он загружен, то я хочу, чтобы добавить это видео в моем уже созданном списке воспроизведения Этого примера код частных недействительный playAndUpdateVideo (ArrayList mediaSourc) {simpleExoPlayerView.setVisibility (View.VISIBLE ); simpleExoPlayerView.setDefaultArtwork (нуль); MainHandler = новый обработчик (); DefaultBandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (); TrackSelection. Завод videoTrackSelectionFactory = новый AdaptiveVideoTrackSelection.Factory (bandwidthMeter); TrackSelector trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); dataSourceFactory = новый DefaultDataSourceFactory (контекст, Util.getUserAgent (контекст, "com.cloveritservices.hype"), bandwidthMeter); // 2. Создать по умолчанию LoadControl extractorsFactory = новый DefaultExtractorsFactory (); LoadControl LoadControl = новый DefaultLoadControl (); // 3. Создайте игрока игрока = ExoPlayerFactory.newSimpleInstance (это, trackSelector, LoadControl); player.addListener (это); // Установить контроллер медиа-simpleExoPlayerView.setUseController (ложь); simpleExoPlayerView.requestFocus (); // Привязка игрока к виду. simpleExoPlayerView.setPlayer (игрок); МедиаСоурс [] mediaSources = новый МедиаСоурс [mediaSourc.size ()]; для (INT I = 0; я
Ghanshyam Sharma
20

голосов
1

ответ
263

Просмотры

Обнаружить, если служба HDMI является UP на Android TV

У нас есть проблема с сервисом HDMI. Наше приложение Android TV устанавливаются по умолчанию на STB. При запуске STB он не показывает вам пусковой, он показывает вам приложение сразу с проигрыванием видео потока HLS. Для воспроизведения видео мы используем Exo плеер версии 2.6.1 с Exo медиа-оболочки версии 4.1.0. Время от времени мы исследуем черный экран, когда STB просыпается после сна - Включение питания DPad. Playlist, что мы получаем в этом случае работает и переключение канала в другой работает хорошо. Эта проблема обычно производится на одних и тех же пользователей. Вот что мы получаем из журнала, когда экран черный (URL_TEST нашего запроса списка воспроизведения): 09-06 19: 21: 40,018 I / PowerManagerService (369): Пробуждение от сна ... 09-06 19: 21: 40.018 I / WindowManager (369): Нет блокировки экрана! 09-06 19: 21: 40,038 I / AudioHardwareALSA (104): AudioHardwareALSA :: SetParameters () screen_state = на 09-06 19:21:40. 038 I / qtaguid (369): Не удалось write_ctrl (с 1 10056) Рез = -1 ERRNO = 1 09-06 19: 21: 40,038 Вт / NetworkManagementSocketTagger (369): setKernelCountSet (10056, 1) не удалось с егто -1 09- 06 19: 21: 40,078 Д / LightsService (369): установка чрезмерной задержки света: 54ms 09-06 19: 21: 41,018 Вт / SurfaceFlinger (101): Тайм-аут ждет Hw VSync; притворяется 09-06 19: 21: 41,158 Вт / OkHttp (682): предыдущая аутентификация с таким же одноразовым номером не удалось, возвращая нуль 09-06 19: 21: 41,158 Д / OkHttp (682): кэширования данных аутентификации истек. Отправка нового запроса. 09-06 19: 21: 42,018 Вт / SurfaceFlinger (101): Тайм-аут ждет Hw VSync; притворяется 09-06 19: 21: 42,098 Д / DAKARMainActivity (682): URL_TEST getUri: http://XXX.XXX.XX.XXX:XXXXX/XLIVE/0431233...8355920521/26/3/stream.m3u8 09 -06 19: 21: 43,098 Вт / SurfaceFlinger (101): Тайм-аут ждет Hw VSync; притворяется 09-06 19:21: Пробуждение от сна ... 09-05 19: 21: 58.517 I / WindowManager (369): Нет блокировки экрана! 09-05 19: 21: 58,527 Д / SurfaceFlinger (102): Экран приобрела, тип = 0 метатель = 0x40691318 09-05 19: 21: 58,537 I / AudioHardwareALSA (105): AudioHardwareALSA :: SetParameters () = screen_state на 09- 05 19: 21: 58,537 I / qtaguid (369): Ошибка write_ctrl (с 1 10056) Рез = -1 ERRNO = 1 09-05 19: 21: 58,537 Вт / NetworkManagementSocketTagger (369): setKernelCountSet (10056, 1) не удалось с ERRNO -1 09-05 19: 21: 58,577 Вт DisplayD (98) /: IFACE ID экрана HDMI 0 09-05 19: 21: 58,577 Д / DISPLAYMANAGER (98): [setHDMIEnable] дисплей 0 09-05 19:21 : 58,577 Д / DISPLAYMANAGER (98): [operateIfaceMode] свойство 0 IFACE 4 Тип 1 режим 1280x720p-60 09-05 19: 21: 58,577 Д / DISPLAYMANAGER (98): [operateIfaceEnable] свойство 0 IFACE 4 работают 1 значение 1 09- 05 19: 21: 58,577 Вт / DISPLAYMANAGER (98): Интерфейс-не поддерживает водить 09-05 19: 21: 58,587 Д / LightsService (369): Чрезмерная задержка света установки: 59ms 09-05 19: 21: 58,797 Д / RemoteControlManager (369): BroadcastReceiver: android.intent.action.CONFIGURATION_CHANGED 09-05 19: 21: 58,797 Д / Окружающая среда (369): экран сырья размер: 1280,720 09-05 19: 21: 58,797 I / ActivityManager (369): Конфигурация изменяет = 1400 {1,0 МКЦ MNC en_LU ldltr sw720dp? w1280dp h672dp 160dpi LRG длинные земли -Touch -keyb / об / ч DPad / об S.9} 09-05 19: 21: 58,947 Вт / OkHttp (681): предыдущий дайджест аутентификации с таким же одноразовым номером не удалось, возвращая нулевой 09-05 19 : 21: 58,947 Д / OkHttp (681): кэширования данных аутентификации истек. Отправка нового запроса. 09-05 19: 21: 59,077 I / DISPLAYMANAGER (98): updatesinkaudioinfo: 0x408de140 09-05 19: 21: 59,077 I / DISPLAYMANAGER (98): BUF: AC3, LPCM, 09-05 19: 21: 59,077 I / DISPLAYMANAGER (98): 09-05 19:21:59. 077 Вт / DisplayD (98): Отправить Сообща Iface добавлены HDMI 09-05 19: 21: 59,137 Д / DAKARMainActivity (681): URL_TEST getUri: http://XXX.XXX.XX.XXX:13888/XLIVE/4086274310 .. 0,086993824321 / 26/3 / stream.m3u8 09-05 19: 21: 59,417 I / OMXClient (681): Использование на сторону клиента OMX мультиплексора. 09-05 19: 21: 59,417 I / (681): новый RKOMXPlugin 09-05 19: 21: 59,427 Д / ACodec (681): MEDIA_MIMETYPE_AUDIO_AAC SampleRate 48000 wifidisplay_flag 0 Информация 6c5bbe78 09-05 19: 21: 59,427 Е / OMXNodeInstance ( 681): OMX_GetExtensionIndex не удалось мы заметили, что из журнала, когда у нас есть черный экран у нас есть этот DISPLAYMANAGER (HDMI) сообщения после запроса видео: 09-06 19: 21: 42,098 D / DAKARMainActivity (682): URL_TEST getUri: HTTP: // XXX. XXX.XX.XXX:XXXXX/XLIVE/0431233...8355920521/26/3/stream.m3u8 09-06 19: 21: 43,098 Вт / SurfaceFlinger (101): Тайм-аут ждет Hw VSync; притворяется 09-06 19:21:43. 428 Вт / DisplayD (97): IFACE ID экрана HDMI 0 09-06 19: 21: 43,428 Д / DISPLAYMANAGER (97): [setHDMIEnable] дисплей 0 09-06 19: 21: 43,428 Д / DISPLAYMANAGER (97): [ operateIfaceMode] свойство 0 IFACE 4 Тип 1 режим 1280x720p-60 09-06 19: 21: 43,428 Д / DISPLAYMANAGER (97): [operateIfaceEnable] свойство 0 IFACE 4 работают 1 значение 1 09-06 19: 21: 43,438 Вт / DISPLAYMANAGER ( 97): интерфейс 4 не поддерживает водить Когда все в порядке, что идет наоборот - см журналы выше. Наше предположение, что черный экран может быть вызван службой HDMI, который ARENT в тот момент, когда мы спрашиваем видеопоток. Мы попытались обнаружить связь HDMI с помощью всех этих методов (когда HDMI подключен / вверх, то мы начинаем воспроизведение видео) - Как проверить состояние подключения устройства HDMI в Android ?, но ничего не помогает. Android версии 17. Любые идеи, что может вызвать эту проблему? UPD1:
Aleksandr A
4

голосов
3

ответ
1.2k

Просмотры

ExoPlayer2 - Как освободить от фрагмента

У меня есть одна деятельности с 2-х фрагментами (не ViewPager) и хочу использовать ExoPlayer2 в одном из фрагментов для воспроизведения содержимого. Начальный фрагмент показывает список содержимого и при нажатии второй фрагмент показан для воспроизведения выбранного контента. Однако, когда я нажимаю назад к исходному фрагменту я до сих пор можно услышать игру контента; это как бы второй фрагмент остается открытым. Я (пытаюсь) Отпустить игрока так: @Override общественности недействительным OnStop () {super.onStop (); releasePlayer (); } Общественного недействительный releasePlayer () {если (игрок! = NULL) {player.setPlayWhenReady (истина); player.stop (); player.release (); игрок = NULL; trackSelector = NULL; simpleExoPlayerView.setPlayer (нуль); simpleExoPlayerView = NULL; System.out.println ( "releasePlayer"); }} Я прочитал это, но он не обеспечивает большую часть решения. Кроме того, прочитайте несколько постов, где ExoPlayer используется в ViewPager фрагментов, но точно не знает, как эти примеры выпустили игрок. Далее следует метод releasePlayer () из демо-приложения находится здесь, но не повез. Вызывается releasePlayer () из OnPause (), onDetach (), onDestroyView (), но это не имело никакого значения. Вот некоторые каротажи настройки после слушателя добавляются к игроку, но не видят ничего, чтобы объяснить, почему это не отпуская ... 07-05 19: 01: 07,216 2529-2643 /? В / Renderscript: 0xe0494000 Запуск нити (ы), ЦП 4 07-05 19: 01: 11,871 3064-3064 /? V / MediaCodecInfo: Слушатель onPlayerStateChanged ... 07-05 19: 01: 11,876 3064-3064 /? V / MediaCodecInfo: Слушатель onPlayerStateChanged ... 07-05 19: 01: 11,904 3064-3064 /? V / MediaCodecInfo: Слушатель onPlayerStateChanged ... 07-05 19:01: 11,904 3064-3064 /? V / MediaCodecInfo: Слушатель onTimelineChanged ... 07-05 19: 01: 11,904 3064-3064 /? V / MediaCodecInfo: Слушатель onLoadingChanged ... 07-05 19: 01: 11,904 3064-3064 /? V / MediaCodecInfo: Слушатель onPlayerStateChanged ... 07-05 19: 01: 11,904 3064-3064 /? V / MediaCodecInfo: Слушатель onTimelineChanged ... 07-05 19: 01: 11,904 3064-3064 /? V / MediaCodecInfo: Слушатель onLoadingChanged ... 07-05 19: 01: 12,467 3064-3064 /? V / MediaCodecInfo: Слушатель onTimelineChanged ... 07-05 19: 01: 12,468 3064-3064 /? V / MediaCodecInfo: Слушатель onTimelineChanged ... 07-05 19: 01: 12,515 3064-3099 /? В / SoftFFmpegVideo: есть OMX_IndexParamPortDefinition, ширина: 320, высота: 180 07-05 19: 01: 12,708 3064-3064 /? V / MediaCodecInfo: Слушатель onPlayerStateChanged ... 07-05 19: 01: 12,708 3064-3064 /? V / MediaCodecInfo: Слушатель onPlayerStateChanged ... 07-05 19:01:13. 380 3064-3064 /? V / MediaCodecInfo: Слушатель onLoadingChanged ... 07-05 19: 01: 13,655 3064-3064 /? V / MediaCodecInfo: Слушатель onLoadingChanged ... 07-05 19: 01: 18,528 3064-3099 /? V / SoftFFmpegVideo: ~ SoftFFmpegVideo Пробовал нажатие кнопки, но это не удалось fragmentExoBinding.button.setOnClickListener (новый View.OnClickListener () {@Override общественного недействительными OnClick (View Вид) {System.out.println ( "кнопка мыши"); releasePlayer ( );}}); Это был сбой каждый раз, я закрыл его вниз (с помощью назад пресса, дома или последние) б / с там больше не игрок. Обновленный метод releasePlayer () с если (игрок! = NULL), но все еще может услышать содержание играть даже после нажатия кнопки. 528 3064-3099 /? V / SoftFFmpegVideo: ~ SoftFFmpegVideo Пробовал нажатие кнопки, но это не удалось fragmentExoBinding.button.setOnClickListener (новый View.OnClickListener () {@Override общественного недействительными OnClick (View Вид) {System.out.println ( "кнопка мыши"); releasePlayer ( );}}); Это был сбой каждый раз, я закрыл его вниз (с помощью назад пресса, дома или последние) б / с там больше не игрок. Обновленный метод releasePlayer () с если (игрок! = NULL), но все еще может услышать содержание играть даже после нажатия кнопки. 528 3064-3099 /? V / SoftFFmpegVideo: ~ SoftFFmpegVideo Пробовал нажатие кнопки, но это не удалось fragmentExoBinding.button.setOnClickListener (новый View.OnClickListener () {@Override общественного недействительными OnClick (View Вид) {System.out.println ( "кнопка мыши"); releasePlayer ( );}}); Это был сбой каждый раз, я закрыл его вниз (с помощью назад пресса, дома или последние) б / с там больше не игрок. Обновленный метод releasePlayer () с если (игрок! = NULL), но все еще может услышать содержание играть даже после нажатия кнопки. }}); Это был сбой каждый раз, я закрыл его вниз (с помощью назад пресса, дома или последние) б / с там больше не игрок. Обновленный метод releasePlayer () с если (игрок! = NULL), но все еще может услышать содержание играть даже после нажатия кнопки. }}); Это был сбой каждый раз, я закрыл его вниз (с помощью назад пресса, дома или последние) б / с там больше не игрок. Обновленный метод releasePlayer () с если (игрок! = NULL), но все еще может услышать содержание играть даже после нажатия кнопки.
JC23
11

голосов
1

ответ
1.9k

Просмотры

ExoPlayer2 - How can I make a HTTP 301 redirect work?

Я начал использовать ExoPlayer течь некоторые аудио. Все было хорошо, пока я не наткнулся на URL, который имеет «301 Moved постоянно» перенаправление. ExoPlayer2 не обрабатывает, что по умолчанию. Я уже видел эту тему: https://github.com/google/ExoPlayer/issues/423 Там они говорят, чтобы добавить новый флаг «allowCrossDomainRedirects», чтобы либо HttpDataSource или UriDataSource. Проблема заключается в том, что я не использую либо из этих классов: // Я не использую SimpleExoPlayer потому что мне нужно другое средство визуализации. exoPlayer = ExoPlayerFactory.newInstance (рендереры, trackSelector, LoadControl); Окончательный DataSource.Factory dataSourceFactory = новый DefaultDataSourceFactory (контекст, Util.getUserAgent (контекст, applicationInfo.getAppName ())); // Создает экземпляры Extractor для разбора медийных данных. Окончательный ExtractorsFactory extractorsFactory = новый DefaultExtractorsFactory (); // Это MediaSource, представляющий носитель для воспроизведения. МедиаСоурс MediaSource = новый ExtractorMediaSource (Uri.parse (media.getUriString ()) / * * URI /, dataSourceFactory, extractorsFactory, 10, нуль / * EventHandler * /, нуль / * EventListener * /); exoPlayer.prepare (МедиаСоурс); Посмотрите, как ExtractorMediaSource требует dataSourceFactory вместо DataSource. На самом деле я даже не могу найти классы HttpDataSource и UriDataSource на ExoPlayer2. Похоже, они были удалены. Поэтому я не могу найти способ добавить флаг указан на посте. Может кто-нибудь мне помочь? МедиаСоурс MediaSource = новый ExtractorMediaSource (Uri.parse (media.getUriString ()) / * * URI /, dataSourceFactory, extractorsFactory, 10, нуль / * EventHandler * /, нуль / * EventListener * /); exoPlayer.prepare (МедиаСоурс); Посмотрите, как ExtractorMediaSource требует dataSourceFactory вместо DataSource. На самом деле я даже не могу найти классы HttpDataSource и UriDataSource на ExoPlayer2. Похоже, они были удалены. Поэтому я не могу найти способ добавить флаг указан на посте. Может кто-нибудь мне помочь? МедиаСоурс MediaSource = новый ExtractorMediaSource (Uri.parse (media.getUriString ()) / * * URI /, dataSourceFactory, extractorsFactory, 10, нуль / * EventHandler * /, нуль / * EventListener * /); exoPlayer.prepare (МедиаСоурс); Посмотрите, как ExtractorMediaSource требует dataSourceFactory вместо DataSource. На самом деле я даже не могу найти классы HttpDataSource и UriDataSource на ExoPlayer2. Похоже, они были удалены. Поэтому я не могу найти способ добавить флаг указан на посте. Может кто-нибудь мне помочь? exoPlayer.prepare (МедиаСоурс); Посмотрите, как ExtractorMediaSource требует dataSourceFactory вместо DataSource. На самом деле я даже не могу найти классы HttpDataSource и UriDataSource на ExoPlayer2. Похоже, они были удалены. Поэтому я не могу найти способ добавить флаг указан на посте. Может кто-нибудь мне помочь? exoPlayer.prepare (МедиаСоурс); Посмотрите, как ExtractorMediaSource требует dataSourceFactory вместо DataSource. На самом деле я даже не могу найти классы HttpDataSource и UriDataSource на ExoPlayer2. Похоже, они были удалены. Поэтому я не могу найти способ добавить флаг указан на посте. Может кто-нибудь мне помочь?
Tiago
12

голосов
3

ответ
443

Просмотры

ExoPlayer: Место контроллер под видео без наложения видео

У меня есть PlayerView, который занимает верхнюю половину активности в портретной ориентации с нижней части экрана, показывающего некоторый текст. Мне нужно иметь контроллер под видео без наложения видео контента (она всегда будет показана). По умолчанию, когда пользователь прикасается к видео контроллер появляется в нижней части видео, охватывающее нижнюю часть видео. Я мой случай мне нужен контроллер придерживаться под видео без каких-либо пересечений с видеоконтент. Я прошел через SimpleExoPlayer и PlayerView API, но я не нашел способ сделать это. Вопрос: Как я могу поместить контроллер под видео с ExoPlayer? Вот как компоновка выглядит следующим образом:
Oleksandr Shpota
1

голосов
2

ответ
1.2k

Просмотры

Как использовать TextureView вместо SurfaceView с PlayerView из ExoPlayer?

Я знаю, что можно использовать TextureView в ExoPlayer. Но я не могу найти какой-либо образец о том, как реализовать эту функцию надлежащим образом. Не могли бы вы мне помочь в этом вопросе?
Elnur Hacıyev
4

голосов
1

ответ
1.3k

Просмотры

Exoplayer (2.0.0) дает BehindLiveWindowException при воспроизведении живого HLS видео

Я получаю это исключение через какое-то время, когда я играл в видео в реальном времени (HLS), для записи видео он работает нормально. com.google.android.exoplayer2.source.BehindLiveWindowException на com.google.android.exoplayer2.source.hls.HlsChunkSource.getNextChunk (HlsChunkSource.java:255) в com.google.android.exoplayer2.source.hls.HlsSampleStreamWrapper.continueLoading (HlsSampleStreamWrapper.java:313) при com.google.android.exoplayer2.source.CompositeSequenceableLoader.continueLoading (CompositeSequenceableLoader.java:55) в com.google.android.exoplayer2.source.hls.HlsMediaPeriod.continueLoading (HlsMediaPeriod.java:198 ) при com.google.android.exoplayer2.ExoPlayerImplInternal.maybeContinueLoading (ExoPlayerImplInternal.java:1080) в com.google.android.exoplayer2.ExoPlayerImplInternal.
Ishant Sagar
2

голосов
1

ответ
3.3k

Просмотры

How to catch all errors for ExoPlayer?

I implemented ExoPlayer as player for my application. But I can´t find out how to catch all ExoPlayer errors to avoid app crash. I added following listener, but it doesn´t catch all errors. I have to use DRM and it sometimes crash on some problem with it, but I can´t set listener before, because player is NULL. player = ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl, drmSessionManager); player.addListener(new ExoPlayer.EventListener() { @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) { } @Override public void onPlayerError(ExoPlaybackException error) { //Catch here, but app still crash on some errors! } @Override public void onPositionDiscontinuity() { } }); Error example: 03-22 16:38:31.401 17960-25624/com.mypackage.name E/ExoPlayerImplInternal: Renderer error. com.google.android.exoplayer2.ExoPlaybackException at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.shouldWaitForKeys(MediaCodecRenderer.java:709) at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:650) at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:490) at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:464) at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:300) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:154) at android.os.HandlerThread.run(HandlerThread.java:61) at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40) Caused by: com.google.android.exoplayer2.drm.DrmSession$DrmSessionException: com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to https://widevine-dash.ezdrm.com/proxy?pX=blablablabla at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.onError(DefaultDrmSessionManager.java:594) at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.onKeysError(DefaultDrmSessionManager.java:589) at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.onKeyResponse(DefaultDrmSessionManager.java:549) at com.google.android.exoplayer2.drm.DefaultDrmSessionManager.access$900(DefaultDrmSessionManager.java:49) at com.google.android.exoplayer2.drm.DefaultDrmSessionManager$PostResponseHandler.handleMessage(DefaultDrmSessionManager.java:669) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154)  at android.os.HandlerThread.run(HandlerThread.java:61)  at com.google.android.exoplayer2.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40)  Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to https://widevine-dash.ezdrm.com/proxy?pX=blablablabla at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:204) at com.google.android.exoplayer2.upstream.DataSourceInputStream.checkOpened(DataSourceInputStream.java:101) at com.google.android.exoplayer2.upstream.DataSourceInputStream.read(DataSourceInputStream.java:81) at com.google.android.exoplayer2.upstream.DataSourceInputStream.read(DataSourceInputStream.java:75) at com.google.android.exoplayer2.util.Util.toByteArray(Util.java:118) at com.google.android.exoplayer2.drm.HttpMediaDrmCallback.executePost(HttpMediaDrmCallback.java:106) at com.google.android.exoplayer2.drm.HttpMediaDrmCallback.executeKeyRequest(HttpMediaDrmCallback.java:91) at com.google.android.exoplayer2.drm.DefaultDrmSessionManager$PostRequestHandler.handleMessage(DefaultDrmSessionManager.java:692) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.os.HandlerThread.run(HandlerThread.java:61) Caused by: java.net.SocketTimeoutException: timeout at com.android.okhttp.okio.Okio$3.newTimeoutException(Okio.java:212) at com.android.okhttp.okio.AsyncTimeout.exit(AsyncTimeout.java:250) at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:217) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306) at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300) at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196) at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191) at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:906) at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:782) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:463) 03-22 16:38:31.401 17960-25624/com.mypackage.name E/ExoPlayerImplInternal: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:521) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java) at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:201) ... 10 more 03-22 16:38:31.402 17960-17960/com.mypackage.name E/PlayerActivity: onPlayerError: com.google.android.exoplayer2.drm.DrmSession$DrmSessionException: com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to https://widevine-dash.ezdrm.com/proxy?pX=blablablabla 03-22 16:38:31.404 17960-17960/com.mypackage.name D/AndroidRuntime: Shutting down VM 03-22 16:38:31.407 17960-17960/com.mypackage.name E/UncaughtException: java.lang.IllegalStateException at com.google.android.exoplayer2.util.Assertions.checkState(Assertions.java:79) at com.google.android.exoplayer2.ExoPlaybackException.getSourceException(ExoPlaybackException.java:111) at com.mypackage.name.ui.activities.PlayerActivity$1.onPlayerError(PlayerActivity.java:260) at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent(ExoPlayerImpl.java:382) at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage(ExoPlayerImpl.java:93) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 03-22 16:38:31.417 17960-25623/com.mypackage.name D/FA: Logging event (FE): _ae, Bundle[{_o=crash, _sc=PlayerActivity_, _si=-5050973009208192093, timestamp=1490197111407, fatal=1}] 03-22 16:38:31.437 17960-25684/com.mypackage.name D/SurfaceUtils: set up nativeWindow 0x791072a810 for 1x1, color 0x2, rotation 0, usage 0x930 03-22 16:38:31.454 17960-25623/com.mypackage.name V/FA: Using measurement service 03-22 16:38:31.455 17960-25623/com.mypackage.name V/FA: Connecting to remote service 03-22 16:38:31.707 17960-17960/com.mypackage.name E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mypackage.name, PID: 17960 java.lang.IllegalStateException at com.google.android.exoplayer2.util.Assertions.checkState(Assertions.java:79) at com.google.android.exoplayer2.ExoPlaybackException.getSourceException(ExoPlaybackException.java:111) at com.mypackage.name.ui.activities.PlayerActivity$1.onPlayerError(PlayerActivity.java:260) at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent(ExoPlayerImpl.java:382) at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage(ExoPlayerImpl.java:93) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
Michalsx
2

голосов
1

ответ
1.6k

Просмотры

ExoPlayer 2 Migration

Ниже приведен фрагмент кода мы используем для проигрывания mp4 видео с помощью URL ExoPlayer1 и я после обновления до ExoPlayer2. Я не уверен, что обновление, чтобы сделать его работать после обновления, как я не слишком хорошо знакомы с самим ExoPlayer и не очень полезные Документации вокруг этого. Любая помощь приветствуется, если кто может тень какой-то свет .. Спасибо осыпает личное статический конечный ИНТ BUFFER_SEGMENT_SIZE = 64 * 1024; частный статический окончательный ИНТ BUFFER_SEGMENT_COUNT = 256; частный ExoPlayer видеоплеер; частный Распределитель Распределитель = новый DefaultAllocator (BUFFER_SEGMENT_SIZE); частная пустота playVideo (Uri Uri) {Обработчик Обработчик = новый обработчик (); DefaultBandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (обработчик, NULL); DataSource DataSource = новый DefaultUriDataSource (getContext (), bandwidthMeter, "Android-ExoPlayer"); SampleSource sampleSource = новый ExtractorSampleSource (URI, DataSource, Распределитель, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE); TrackRenderer audioRenderer = новый MediaCodecAudioTrackRenderer (sampleSource, MediaCodecSelector.DEFAULT); // 2. Построить рендеры. TrackRenderer videoRenderer = новый MediaCodecVideoTrackRenderer (getContext (), sampleSource, MediaCodecSelector.DEFAULT, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT); // 1. Instantiate игрок. если (Videoplayer == NULL) {Videoplayer = ExoPlayer.Factory.newInstance (4); } // 3. Внедрить рендеры через подготовку. videoPlayer.prepare (videoRenderer, audioRenderer); // 4. Пропустите поверхность видео рендерер. SurfaceTexture surfaceTexture = textureView.getSurfaceTexture (); Поверхностная поверхность = новая поверхность (surfaceTexture); videoPlayer.sendMessage (videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, поверхность); videoPlayer.addListener (новый ExoPlayer.Listener () {@Override общественные недействительного onPlayerStateChanged (логическое б, INT I) {если (я == ExoPlayer.STATE_READY) {mediaControl.setMedia (новые MediaControl.Media () {@Override общественного недействительное setCurrentPosition (длинные positionMs) {если (видеоплеер! = NULL) {videoPlayer.seekTo (positionMs); }} @Override общественности долго getCurrentPosition () {если (видеоплеер! = NULL) {возвращение videoPlayer.getCurrentPosition (); } Возвращает 0; } @Override общественность долго getDuration () {если (видеоплеер! = NULL) {возвращение videoPlayer.getDuration (); } Возвращает 0; } @Override общественное недействительное начало () {если (видеоплеер! = NULL) {videoPlayer.setPlayWhenReady (истина); }} @Override общественности недействительной пауза () {если (видеоплеер! = NULL) {videoPlayer.setPlayWhenReady (ложь); }} @Override общественного ИНТ getBufferedPercentage () {если (видеоплеер! = NULL) {вернуться videoPlayer.getBufferedPercentage (); } Возвращает 0; }}); mediaControl.start (); videoPlayer.removeListener (это); }} @Override общественные недействительный onPlayWhenReadyCommitted () {} @Override общественный недействительный onPlayerError (ExoPlaybackException е) {mediaControl.pause (); }}); // 5. Запустите воспроизведение. mediaControl.start (); }
Bulu
3

голосов
3

ответ
2.3k

Просмотры

Android - ExoPlayer 2 играть DRM (Widevine) в автономном режиме

Я пытаюсь реализовать в автономном режиме DRM поддержки ExoPlayer 2, но у меня есть некоторые проблемы. Я нашел этот разговор. Существует некоторая реализация для ExoPlayer 1.x и некоторые шаги, как работать, что реализация с ExoPlayer 2.x. У меня есть проблемы с I OfflineDRMSessionManager реализует DrmSessionManager ведьма. В этом примере DrmSessionManager импортируется из ExoPlayer 1.x. Если я импортировать его из ExoPlayer 2, то у меня есть проблемы, чтобы скомпилировать его. У меня есть проблема с @Override методами (открытые (), Close (), ..), которые не в этом новом DrmSessionManager и существуют какие-то новые методы: acquireSession (), ....
Pepa Zapletal
3

голосов
1

ответ
469

Просмотры

how to add player control ui in google IO18 audio App demo

What am I trying to do: Using google exoPlayer to play music, foreground and background. Break into details: The app launches, google exoPlayer playback control UI should be visible and starts to play immediately. As soon as the player starts to play, we should see the notification (Using exoplayer's PlayerNotificationManager ) User exits the app either by pressig back button or swipe from recent task, the player service should keep running in froeground with notification. User taps the notification, it should brings up the app. What I have done: I followed google IO18 on this link https://www.youtube.com/watch?v=svdq1BWl4r8&t=1990s While I am following the above youtube link, especially the audio app part, I realize one thing, how do you pros add player control UI into this app? e.g, the app is onDestory, user quits. Then user taps on the notification, back to the MainActivity, there is nothing there, it's an empty screen, quesiton is, how do you add play control ui in here? I have looked into https://github.com/googlesamples/android-UniversalMusicPlayer tyring to figure out this. However, the Universal Android Music Player Sample is using a giant notification (Not PlayerNotificationManager see on IO18) and custom player ui (Not ExoPlayer out of box control UI) which is confusing me a lot. Please, please, please help. How to add player control ui in the following code. https://github.com/bizkitj/MediaSessionExoPlayer/tree/ExoPlayerGoogleIO2018 If you can , please not only show me how you do it, I also need to know why did you do it? Break into steps. Version of ExoPlayer being used: implementation 'com.google.android.exoplayer:exoplayer-core:2.8.0' implementation 'com.google.android.exoplayer:exoplayer-ui:2.8.0' implementation 'com.google.android.exoplayer:extension-mediasession:2.8.0' Please be noted, I am tyring to buid things upon the googleIO18 demo app. This demo app is using exoPlayer's PlayerNotificationManager which is great to keep sync with MediaSession, I do not want to change this PlayerNotificationManager to android Notification.MediaStyle. Thank you.
Bizkit
1

голосов
2

ответ
1.3k

Просмотры

Widewine Drm в Exoplayer Ошибка

Я реализую приложение OTT на Exoplayer Android. Мы защищаем наше содержимое с Widewine DRM.But мы получили ошибку, показанную ниже. 06-13 17: 31: 53,641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: com.google.android.exoplayer2.drm.UnsupportedDrmException: android.media.UnsupportedSchemeException: Не удалось создать экземпляр объекта УЦП. 06-13 17: 31: 53,641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: в com.google.android.exoplayer2.drm.FrameworkMediaDrm.newInstance (FrameworkMediaDrm.java:50) 06-13 17 : 31: 53,641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: в com.cinesoft.cinehome.player.PlayerActivity.buildDrmSessionManager (PlayerActivity.java:483) 06-13 17: 31: 53,641 18652- 18652 / com.cinesoft.cinehome.android Вт / System.err: в com.cinesoft.cinehome.player.PlayerActivity.initPlayer (PlayerActivity.java: 641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120) 06-13 17: 31: 53,641 18652-18652 / ком .cinesoft.cinehome.android Вт / System.err: Вызванный: android.media.UnsupportedSchemeException: Не удалось создать экземпляр объекта УЦП. 06-13 17: 31: 53,641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: в android.media.MediaDrm.native_setup (Родной метод) 06-13 17: 31: 53,641 18652-18652 / ком .cinesoft.cinehome.android Вт / System.err: в android.media.MediaDrm (MediaDrm.java:215) 06-13. 17: 31: 53,641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err : в com.google.android.exoplayer2.drm.FrameworkMediaDrm (FrameworkMediaDrm.java:57) 06-13 17:. 31: 53.641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: в com.google .android.exoplayer2.drm.FrameworkMediaDrm. newInstance (FrameworkMediaDrm.java:48) 06-13 17: 31: 53,641 18652-18652 / com.cinesoft.cinehome.android Вт / System.err: ... более 14 А код показан ниже mediaDataSourceFactory = buildDataSourceFactory (истина) ; MainHandler = новый обработчик (); bandwidthMeter = новый DefaultBandwidthMeter (); videoTrackSelectionFactory = новый AdaptiveTrackSelection.Factory (bandwidthMeter); trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); eventLogger = новый EventLogger (trackSelector); если (JsonParser.sStr_drmStatus.equalsIgnoreCase ( "1")) {AndroidDeviceIdentifier androidDeviceIdentifier = новый AndroidDeviceIdentifier (); UUID drmSchemeUuid = NULL; drmSchemeUuid = UUID.fromString (androidDeviceIdentifier.getUniqueDeviceIdentifier (PlayerActivity.this)); drmSessionManager = NULL; если (drmSchemeUuid! = NULL) {Строка drmLicenseUrl = ConnectPortalSettings.WIDEVINE_LICENSE_SERVER_URL; Строка [] keyRequestPropertiesArray = новый String [] {}; // drmLicenseUrl = intent.getStringExtra (DRM_LICENSE_URL); // keyRequestPropertiesArray = intent.getStringArrayExtra (DRM_KEY_REQUEST_PROPERTIES); попробовать {drmSessionManager = buildDrmSessionManager (drmSchemeUuid, drmLicenseUrl, keyRequestPropertiesArray); } Задвижка (UnsupportedDrmException е) {INT errorStringId = Util.SDK_INT <18? R.string.error_drm_not_supported: (e.reason == UnsupportedDrmException. REASON_UNSUPPORTED_SCHEME? R.string.error_drm_unsupported_scheme: R.string.error_drm_unknown); e.printStackTrace (); Log.e ( "Drm Код ошибки", String.valueOf (errorStringId)); вернуть; }} @ SimpleExoPlayer.ExtensionRendererMode INT extensionRendererMode = ((BaseApplication) getApplication ()). UseExtensionRenderers ()? (Ложные SimpleExoPlayer.EXTENSION_RENDERER_MODE_PREFER: SimpleExoPlayer.EXTENSION_RENDERER_MODE_ON?): SimpleExoPlayer.EXTENSION_RENDERER_MODE_OFF; LoadControl LoadControl = новый DefaultLoadControl (); // 3. Создайте игрок игрок = ExoPlayerFactory. newSimpleInstance (это, trackSelector, LoadControl, drmSessionManager, extensionRendererMode); } Еще {LoadControl LoadControl = новый DefaultLoadControl (); Игрок = ExoPlayerFactory.newSimpleInstance (это, trackSelector, LoadControl); } Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.
Cecil Paul
7

голосов
1

ответ
239

Просмотры

Увеличение яркости ExoPlayer 2 так же, как MxPlayer

Я прошел всю документацию ExoPlayer2, но не смог найти, как увеличить яркость exoplayer. Я нашел аналогичный вопрос на GitHub Мой XML выглядит следующим образом Если я использую SurfaceView вместо как я буду использовать методы exoplayer. Я пытался размещение моего exoplayer тега вида поверхности тег, но мое приложение разбилось. Есть ли другой способ увеличить яркость exoplayer. Пожалуйста, не вставить код для увеличения яркости системы.
Nudge
1

голосов
2

ответ
1.5k

Просмотры

Как я могу играть в .TS в Exoplayer 2

Я начал использовать ExoPlayer недавно играть потоковые ссылки в моем андроида приложения, такие как .m3u8 и .mp4 файлы, но когда я пытался играть ts-файлы, ниже сообщение начинают появляться в Android Monitor: ошибка Источник. com.google.android.exoplayer2.source.UnrecognizedInputFormatException: Входной сигнал не начинается с заголовка # EXTM3U. на com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser.parse (HlsPlaylistParser.java:119) в com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser.parse (HlsPlaylistParser.java:
Zhang Zhu
1

голосов
2

ответ
2.1k

Просмотры

ExoPlayer - изменение большого пальца в DefaultTimeBar

Как я понял из RELEAS ноты версии 2.4.0 ExoplayerSeekBar был заменен DefaultTimeBar. https://github.com/google/ExoPlayer/blob/dev-v2/RELEASENOTES.md Как я могу видеть, как на 19Feb2017: https://github.com/bigexxx/ExoPlayer/blob/c5db6f39a6e07b4f98364ff40476e4e213172488/library/src/ Основной / Java / COM / Google / Android / exoplayer2 / щ / PlaybackControlView.java exo_progress был SeekBar тип: (строка 285): Progressbar = (SeekBar) findViewById (R.id.exo_progress); И прямо сейчас: github.com/google/ExoPlayer/blob/release-v2/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlaybackControlView.java это: (строка: 384): TimeBar = (TimeBar) findViewById (R.id.exo_progress); DefaultTimeBar не имеет метод, как .setThumb () и мне кажется, что большой палец создан как холст в drawPlayhead (холст холст). Вопрос:
Nimdokai
1

голосов
1

ответ
2.7k

Просмотры

Google ExoPlayer руководство

Я изо всех сил, чтобы построить базовое приложение с ExoPlayer.
hogar
1

голосов
2

ответ
1.1k

Просмотры

ExoPlayer видео не кадрирование и подтянутым

Я использую библиотеку ExoPlayer для загрузки видео с моего сервера, и я хочу, чтобы масштабировать и обрезать видео, чтобы сохранить их пропорции. Видео играет отлично, и все в порядке, даже когда я изменить громкость видео. Я пытался использовать функцию setVideoScalingMode на SimpleExoPlayer и прошел: не C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING ничего не происходит, и я также попытался изменить атрибут изменения размера для заполнения / подгонки. Все еще нет масштабирования и кадрирования.
Zach Bublil
4

голосов
2

ответ
1.8k

Просмотры

Android - ExoPlayer2 субтитры

Как установить субтитры на ExoPlayer2? Я попробовал этот tử BILD MergingMediaSource: SingleSampleMediaSource singleSampleSource = новый SingleSampleMediaSource (Uri.fromFile (новый файл ( "/ SDCard / Скачать / a.vtt")), mediaDataSourceFactory, Format.createTextSampleFormat (нуль, MimeTypes.TEXT_VTT, нулевой формат. NO_VALUE, C.SELECTION_FLAG_DEFAULT, "с", нуль, 0), 50000 // в нас); вернуть новый MergingMediaSource (новый ExtractorMediaSource (Uri, mediaDataSourceFactory, новый DefaultExtractorsFactory (), MainHandler, eventLogger), singleSampleSource); но я получил эту ошибку: Неожиданная загрузка исключения потока java.lang.NullPointerException: Попытку получить длину нулевого массива в com.google.android.
TheModularMind
2

голосов
1

ответ
646

Просмотры

Есть ли SimpleExoPlayerView бы видимость управления изменила событие?

Я пытаюсь реализовать полноэкранный режим с SimpleExoPlayerView экрана. У меня это в основном работает с использованием setSystemUiVisibility. Во время OnCreate я добавить OnSystemUiVisibilityChange слушателя для синхронизации скрытия управления проигрывателем с ActionBar. @Override общественного недействительный OnCreate (Bundle savedInstanceState) {Посмотреть decorView = GetWindow () getDecorView (). decorView.setOnSystemUiVisibilityChangeListener (onSystemUiChange ()); hideSystemUI (); } В OnSystemUiVisibilityChangeListener я также установка тайм-аут, который соответствует simpleExoplayerViews таймаут, элементы управления и панели действий скрыты в то же время. @NonNull частный View.OnSystemUiVisibilityChangeListener onSystemUiChange () {вернуть новый вид. OnSystemUiVisibilityChangeListener () {@Override общественная недействительный onSystemUiVisibilityChange (интермедиат видимость) {если ((видимость и View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {mSimpleExoPlayerView.showController (); финальный обработчик Обработчик = новый обработчик (); handler.postDelayed (новый Runnable () {@Override общественный недействительный запуск () {// синхронизация шкуры интерфейса системы с автоматическим скрыть таймаут hideSystemUI // simpleExoPlayerView в ();}}, mSimpleExoPlayerView.getControllerShowTimeoutMs ()); } Еще {mSimpleExoPlayerView.hideController (); }}}; } Частная пустота hideSystemUI () {Посмотреть rootView = findViewById (R.id.root); rootView.setSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // скрыть навигационную бар | View.SYSTEM_UI_FLAG_FULLSCREEN // скрыть строку состояния); } Это работает очень хорошо, за исключением одного случая. Если вы нажмете на экран, а затем нажмите на него еще раз до того, как средства управления SimpleExoPlayerView Тайм-аут SimpleExoPlayerView скрыты, но система Ui не не приготовьтесь до тайм-аута. Есть ли какое-либо событие, я могу вклиниться вместо этого? Я попытался установки OnClick и onTouch слушателя для моего корня макета, но эти события не уволят,
Ryan Burnham
2

голосов
1

ответ
163

Просмотры

Как сделать ExoPlayer воспроизведения видео резюме, когда устройство вращается без использования андроида: configChanges

Я работаю над проектом, который использует ExoPlayer для потокового видео с URL. Но есть проблема с моим кодом. Когда устройство вращается, все видео будет перезагружен. Использование Android: configChanges фиксирует это, но я не должен использовать это. Я использовал onSaveInstanceState () для кэширования всех необходимых данных, таких как playerPosition, currentWindow и setPlayWhenReady; и я получить его соответствующим образом. Но она по-прежнему не работает, как ожидалось. Как это исправить? Вот весь класс фрагмент, который имеет этот вопрос: пакет com.app.shubhamjhunjhunwala.thebakingapp; импорт android.annotation.SuppressLint; импорт android.app.Activity; импорт android.app.Dialog; импорт android.content.Intent; импорт android.content.res.Configuration; импорт android.graphics.Bitmap; импорт android.net.Uri; импорт android.os.AsyncTask; импорт android.os.Bundle; импорт андроид. support.annotation.Nullable; импорт android.support.v4.app.Fragment; импорт android.util.DisplayMetrics; импорт android.util.Log; импорт android.view.LayoutInflater; импорт android.view.View; импорт android.view.ViewGroup; импорт android.widget.RelativeLayout; импорт android.widget.TextView; импорт android.widget.Toast; импорт com.app.shubhamjhunjhunwala.thebakingapp.Objects.Dish; импорт com.app.shubhamjhunjhunwala.thebakingapp.Objects.Step; импорт com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView; импорт com.google.android.exoplayer2.DefaultLoadControl; импорт com.google.android.exoplayer2.DefaultRenderersFactory; импорт com.google.android.exoplayer2.ExoPlayerFactory; импорт com.google.android.exoplayer2.SimpleExoPlayer; импорт com.google.android.exoplayer2.source.ExtractorMediaSource; импорт com.google.android.exoplayer2. source.MediaSource; импорт com.google.android.exoplayer2.trackselection.DefaultTrackSelector; импорт com.google.android.exoplayer2.ui.SimpleExoPlayerView; импорт com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory; импорт com.google.android.exoplayer2.util.Util; импорт com.squareup.picasso.Picasso; импорт org.parceler.Parcels; импорт org.w3c.dom.Text; импорт java.io.IOException; общественный класс ExtraDetailsFragment расширяет фрагмент {общественного ExtraDetailsFragment () {} общественного логического twoPaneLayout; Блюдо блюдо общественности; общественный ИНТ stepID; Строка videoURL общественности; общественный SimpleExoPlayerView playerView; игрок общественного SimpleExoPlayer; общественность долго playerPosition; общественного логический playWhenReady; ИНТ currentWindow общественности; общественный TextView TextView; общественности статической булевых hasShownVideoInFullScreen = ложь; @Nullable @Override публичного просмотра onCreateView (LayoutInflater инфлятор, @Nullable ViewGroup контейнер, Пачка savedInstanceState) {Окончательный вид rootView; rootView = inflater.inflate (R.layout.extra_details_fragment, контейнер, ложь); если (savedInstanceState! = NULL) {блюдо = Parcels.unwrap (savedInstanceState.getParcelable ( "тарелка")); stepID = savedInstanceState.getInt ( "ID"); twoPaneLayout = savedInstanceState.getBoolean ( "TwoPane"); playerPosition = savedInstanceState.getLong ( "PlayerPosition", 0); playWhenReady = savedInstanceState.getBoolean ( "PlayWhenReady", правда); currentWindow = savedInstanceState.getInt ( "CurrentWindow" , 0); Log.d ( "Игрок Позиция", Long.toString (playerPosition)); } Log.d ( "Подробности Фрагмент", dish.toString ()); playerView = rootView.findViewById (R.id.video_view); TextView = rootView.findViewById (R.id.details_text_view); Шаг [] шага = dish.getSteps (); textView.setText (шаги [stepID] .getDescription ()); вернуться rootView; } @Override общественного недействительный onSaveInstanceState (Пачка outState) {super.onSaveInstanceState (outState); outState.putParcelable ( "тарелка", Parcels.wrap (блюдо)); outState.putInt ( "ID", stepID); outState.putBoolean ( "TwoPane", twoPaneLayout); outState.putLong ( "PlayerPosition", playerPosition); outState.putBoolean ( "PlayWhenReady", playWhenReady); outState.putInt ( "CurrentWindow", currentWindow); } @Override общественного недействительный OnStart () {super.onStart (); если (Util.SDK_INT> 23) {initializePlayer (); }} @Override общественного недействительный onResume () {super.onResume (); /*if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE && && twoPaneLayout hasShownVideoInFullScreen) {hasShownVideoInFullScreen = истина!; playVideoInFullScreen (); } * / Если ((Util.SDK_INT }} @Override общественного недействительный onResume () {super.onResume (); /*if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE && && twoPaneLayout hasShownVideoInFullScreen) {hasShownVideoInFullScreen = истина!; playVideoInFullScreen (); } * / Если ((Util.SDK_INT }} @Override общественного недействительный onResume () {super.onResume (); /*if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE && && twoPaneLayout hasShownVideoInFullScreen) {hasShownVideoInFullScreen = истина!; playVideoInFullScreen (); } * / Если ((Util.SDK_INT
2

голосов
1

ответ
897

Просмотры

Android Exoplayer 2 UDP расшифровывать вопрос

Я новичок на ExoPlayer, я в настоящее время заголовок, чтобы использовать его, чтобы играть Native UdP поток (от французского цифрового телевидения: 1080p 5-10 Мбит в переменный битрейт) мне удается поиграть в UdP поток с некоторыми тестов видео с HTTP: / /jell.yfish.us/ на разных устройствах. У меня есть сделать несколько иной тест декодирования видео с СВУ и UdP Streaming с этим кодом для UDP: защищенный недействительным OnCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.myactivity); sufaceview = (SurfaceView) findViewById (R.id.surfaceView2); BandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (); TrackSelection.Factory videoTrackSelectionFactory = новый AdaptiveTrackSelection.Factory (bandwidthMeter); TrackSelector trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); LoadControl LoadControl = новый DefaultLoadControl (новый DefaultAllocator (правда, C.DEFAULT_BUFFER_SEGMENT_SIZE), 15000, 60000, 2500, 6000); Игрок = ExoPlayerFactory.newSimpleInstance (это, trackSelector, LoadControl); Uri Uri = Uri.parse ( "UDP: //@239.192.2.2: 1234"); Окончательный DefaultBandwidthMeter bandwidthMeterA = новый DefaultBandwidthMeter (); DataSource.Factory dataSourceFactory = новый DefaultDataSourceFactory (это, Util.getUserAgent (это, "teveolauncher"), bandwidthMeterA); extractorsFactory = новый DefaultExtractorsFactory (); DataSource.Factory udsf = новый UdpDataSource.Factory () {@Override общественного DataSource createDataSource () {вернуть новый UdpDataSource (нуль, 3000, 100000); }}; ExtractorsFactory tsExtractorFactory = новый ExtractorsFactory () {@Override общественного экстрактор [] createExtractors () {вернуть новый TsExtractor [] {нового TsExtractor (MODE_SINGLE_PMT, новый TimestampAdjuster (0), новый DefaultTsPayloadReaderFactory ())}; }}; МедиаСоурс видеоисточника = новый ExtractorMediaSource (URI, udsf, tsExtractorFactory, NULL, NULL); player.setVideoSurfaceView (sufaceview); player.prepare (видеоисточник); player.setPlayWhenReady (истина); } Для ЗОЖ я просто изменить MediaSource, а также datasourceFactory: DataSource.Factory dataSourceFactory = новый DefaultDataSourceFactory (это, Util.getUserAgent (это, "teveolauncher"), bandwidthMeterA); MediaSource видеоисточника = новый HlsMediaSource (Ури dataSourceFactory, нуль, ноль); Я знаю, Udpstreaming не официально поддерживается ExoPlayer но класс UdpDataSource кажется, работает хорошо. После того как все испытания, я заметил, видео с переменной biterate как французский DTT не может быть декодирован правильно, но с biterate видео постоянным, как Jell yfish процесс декодирования является идеальным. Существует некоторое улучшение кодирования, чтобы сделать VBR видео декодируется правильно? Спасибо по заранее :) Извините за мой плохой английский :)
Jean Multigner
2

голосов
0

ответ
570

Просмотры

Как поток зашифрованного файла с помощью exoplayer (образец)?

Я пытаюсь поток зашифрованного аудиофайла (.mp3), но я не знаю, как этого добиться. Я прошу образец, или какая-либо форма направления, чтобы сделать это ?. Существует проблема здесь https://github.com/google/ExoPlayer/issues/2467 но обсуждает играть локальный зашифрованный файл. Спасибо за помощь.
Muhammad Alkady
2

голосов
1

ответ
274

Просмотры

Exoplayer 2 Качество Выдачи как 320P, 480p, 720p и 1080p

Я ищу для реализации качества выдач вариант, как (320P, 480p, 720p и 1080p) на пути YouTube поддерживает использование Exoplayer 2. На самом деле старались искать ответы, но ничего не могли найти. Так как я новичок в Exoplayer, отныне это будет здорово, если я могу получить некоторую помощь для того же. Вот мой код для MainActivity.java пакета com.geoffledak.exoplayerfullscreen; общественный класс MainActivity расширяет AppCompatActivity реализует View.OnClickListener {частного окончательная Строки STATE_RESUME_WINDOW = "resumeWindow"; частная окончательная строка STATE_RESUME_POSITION = "resumePosition"; частная окончательная строка STATE_PLAYER_FULLSCREEN = "playerFullscreen"; частный SimpleExoPlayerView mExoPlayerView; частный MediaSource mVideoSource; частное булево mExoPlayerFullscreen = false; частный FrameLayout mFullScreenButton; частный ImageView mFullScreenIcon; частные btn_settings IMAGEBUTTON; частный ExoPlayer игрок; частный диалог mFullScreenDialog; частное ИНТ mResumeWindow; частный длинный mResumePosition; @Override защищены недействительный OnCreate (Пачка savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); btn_settings = (ImageButton) findViewById (R.id.btn_settings); btn_settings.setOnClickListener (это); если (savedInstanceState! = NULL) {mResumeWindow = savedInstanceState.getInt (STATE_RESUME_WINDOW); mResumePosition = savedInstanceState.getLong (STATE_RESUME_POSITION); mExoPlayerFullscreen = savedInstanceState.getBoolean (STATE_PLAYER_FULLSCREEN); }} @Override общественного недействительный onSaveInstanceState (Пачка outState) {outState.putInt (STATE_RESUME_WINDOW, mResumeWindow); outState.putLong (STATE_RESUME_POSITION, mResumePosition); outState.putBoolean (STATE_PLAYER_FULLSCREEN, mExoPlayerFullscreen); super.onSaveInstanceState (outState); } Частная пустота initFullscreenDialog () {mFullScreenDialog = новый диалог (это, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {общественного недействительными onBackPressed () {если (mExoPlayerFullscreen) closeFullscreenDialog (); super.onBackPressed (); }}; } Частная пустота openFullscreenDialog () {((ViewGroup) mExoPlayerView.getParent ()) removeView (mExoPlayerView). mFullScreenDialog.addContentView (mExoPlayerView, новые ViewGroup.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mFullScreenIcon.setImageDrawable (ContextCompat.getDrawable (MainActivity.this, R.drawable. ic_fullscreen_shrink)); mExoPlayerFullscreen = TRUE; mFullScreenDialog.show (); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } Частная пустота closeFullscreenDialog () {((ViewGroup) mExoPlayerView.getParent ()) removeView (mExoPlayerView). ((FrameLayout) findViewById (R.id.main_media_frame)) addView (mExoPlayerView). mExoPlayerFullscreen = ложь; mFullScreenDialog.dismiss (); mFullScreenIcon.setImageDrawable (ContextCompat.getDrawable (MainActivity.this, R.drawable.ic_fullscreen_expand)); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } Частная пустота initFullscreenButton () {PlaybackControlView ControlView = mExoPlayerView.findViewById (R.id.exo_controller); mFullScreenIcon = controlView.findViewById (R.id.exo_fullscreen_icon); mFullScreenButton = ControlView. findViewById (R.id.exo_fullscreen_button); mFullScreenButton.setOnClickListener (новый View.OnClickListener () {@Override общественный недействительный OnClick (View v) {если (mExoPlayerFullscreen) openFullscreenDialog (!), еще closeFullscreenDialog ();}}); } Частная пустота initExoPlayer () {BandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (); TrackSelection.Factory videoTrackSelectionFactory = новый AdaptiveTrackSelection.Factory (bandwidthMeter); TrackSelector trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); LoadControl LoadControl = новый DefaultLoadControl (); SimpleExoPlayer игрок = ExoPlayerFactory.newSimpleInstance (новый DefaultRenderersFactory (это), trackSelector, LoadControl); mExoPlayerView.setPlayer (игрок); булева haveResumePosition = mResumeWindow = C.INDEX_UNSET!; если (haveResumePosition) {mExoPlayerView.getPlayer () seekTo (mResumeWindow, mResumePosition). } MExoPlayerView.getPlayer () подготавливает (mVideoSource). . MExoPlayerView.getPlayer () setPlayWhenReady (истина); } @Override защищен недействительный onResume () {super.onResume (); если (mExoPlayerView == NULL) {mExoPlayerView = (SimpleExoPlayerView) findViewById (R.id.exoplayer); initFullscreenDialog (); initFullscreenButton (); Строка streamUrl = "http://playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8"; Строка UserAgent = Util.getUserAgent (MainActivity.this, getApplicationContext () getApplicationInfo () PackageName..); DefaultHttpDataSourceFactory httpDataSourceFactory = новый DefaultHttpDataSourceFactory (UserAgent, нуль, DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS, правда); DefaultDataSourceFactory dataSourceFactory = новый DefaultDataSourceFactory (MainActivity.this, нулевой httpDataSourceFactory); Ури Даури = Uri.parse (streamUrl); mVideoSource = новый HlsMediaSource (Даури, dataSourceFactory, 1, NULL, NULL); } InitExoPlayer (); если (mExoPlayerFullscreen) {((ViewGroup) mExoPlayerView.getParent ()) removeView (mExoPlayerView). mFullScreenDialog.addContentView (mExoPlayerView, новые ViewGroup.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mFullScreenIcon.setImageDrawable (ContextCompat.getDrawable (MainActivity.this, R.drawable.ic_fullscreen_shrink)); mFullScreenDialog.show (); }} @Override защищен OnPause пустот () {super.onPause (); если (mExoPlayerView = NULL && mExoPlayerView.getPlayer ()! = NULL) {mResumeWindow = mExoPlayerView.getPlayer () getCurrentWindowIndex (). mResumePosition = Math.max (0, mExoPlayerView.getPlayer () getContentPosition ().); mExoPlayerView.getPlayer () выпуск (). } Если (mFullScreenDialog! = NULL) mFullScreenDialog.dismiss (); } @Override общественный недействительный OnClick (Просмотр просмотр) {} @Override общественные недействительный onConfigurationChanged (Конфигурация newConfig) {super.onConfigurationChanged (newConfig); // Проверка ориентации экрана, если (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {Toast.makeText (это, "пейзаж", Toast.LENGTH_SHORT) .show (); } Иначе, если (Конфигурация newConfig.orientation ==. ORIENTATION_PORTRAIT) {Toast.makeText (это, "Портрет", Toast.LENGTH_SHORT) .show (); }}}
Jatin Bhatia
2

голосов
1

ответ
342

Просмотры

Даш адаптивного воспроизведения с исходными треками, Как?

У меня есть 3 способа воспроизведения адаптивного тире видео в моем приложении: Fixed видео и аудио дорожки Адаптивная видео и аудио дорожки Адаптивная видео и аудио дорожек (с началом трека) Первые 2 способа работы отлично, однако третий метод ведет себя странно. Что я делаю первый установка стартовых дорожек на «onTracksChanged» метода. Как только игрок вызывает метод onLoadingChanged (ложь) Я хочу, чтобы снять выделение стартового трека и позволить игроку выбрать оптимальный путь. Для удаления выбранного я звоню trackSelector.clearSelectionOverrides (), но полностью удаляет буфер и видео останавливается и начинается буферизация в оптимальном треке. Поведение я хочу достичь, состоит в следующем: выберите startingt дорожки (допустим, 144p) -> загрузить первые куски -> удалить выбор 144p -> Продолжайте играть, оставшийся буфер в 144p и начать загрузку в оптимальной трассе в то же время. Как я могу добиться этого?
3

голосов
2

ответ
3.2k

Просмотры

Селектор качества для ExoPlayer 2

В настоящее время я занимаюсь разработкой приложений живым и игрока кино. Я выбрал ExoPlayer версии 2, чтобы играть в кино, и я много об этом не знаю. Я хочу, чтобы позволить пользователю выбрать качество фильма на экране плеера, например, 720p или 1080p или и т.д. Но я не знаю, как получить список существующих качеств и показать их пользователю. и код ниже моя реализация SimpleExoPlayer: частная пустота initPlayer (String путь) {Обработчик Обработчик = новый обработчик (); // 1. Создание по умолчанию TrackSelector BandwidthMeter bandwidthMeter = новый DefaultBandwidthMeter (); TrackSelection.Factory videoTrackSelectionFactory = новый AdaptiveVideoTrackSelection.Factory (bandwidthMeter); TrackSelector trackSelector = новый DefaultTrackSelector (videoTrackSelectionFactory); // 2. Создание по умолчанию LoadControl LoadControl LoadControl = новый DefaultLoadControl (); // 3. Создайте игрока игрока = ExoPlayerFactory.newSimpleInstance (это, trackSelector, LoadControl); SimpleExoPlayerView playerView = (SimpleExoPlayerView) findViewById (R.id.player_view); playerView.setPlayer (игрок); playerView.setKeepScreenOn (истина); // Создает экземпляры DataSource, через которые загружены носители данных. DataSource.Factory dataSourceFactory = новый DefaultDataSourceFactory (это, Util.getUserAgent (это, "ExoPlayer")); // Это MediaSource, представляющий носитель для воспроизведения. МедиаСоурс видеоисточник = новый HlsMediaSource (Uri.parse (путь), dataSourceFactory, обработчик, NULL); // Подготовить плеер с источником. player.addListener (это); player.prepare (видеоисточник); playerView.requestFocus (); player.setPlayWhenReady (истина); // для воспроизведения видео, когда будут готовы. Используйте ложь, чтобы сделать паузу видео} // ExoPlayer методы СЛУШАТЕЛЯ: @Override общественной недействительного onTimelineChanged (Timeline графика, объект манифеста) {} @Override общественным недействительным onTracksChanged (TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} @Override общественным недействительным onLoadingChanged (логическое isLoading) {} @Override общественного недействительными onPlayerStateChanged (булево playWhenReady, внутр playbackState) {переключатель (playbackState) {случай ExoPlayer.STATE_BUFFERING: // Вы можете использовать диалог выполнения, чтобы показать пользователю, что видео готовит или буферизацию поэтому, пожалуйста, подождите progressBar.setVisibility (View. ВИДИМОЕ); перерыв; случай ExoPlayer.STATE_IDLE: // неактивного состояния перерыв; случай ExoPlayer. STATE_READY: // отклонить ваш диалог здесь потому, что наши видео готовы играть сейчас progressBar.setVisibility (Gone); //Toast.makeText(getApplicationContext (), String.valueOf (player.getCurrentTrackSelections () получим (0) .getSelectedFormat () битрейт..), Toast.LENGTH_SHORT) .show (); перерыв; случай ExoPlayer.STATE_ENDED: // сделать вашу обработку после окончания видео перерыва; }} @Override общественного недействительными onPlayerError (ExoPlaybackException ошибка) {// показать пользователю, что что-то пошло не так. это может быть диалог} @Override общественности недействительным onPositionDiscontinuity () {}, пожалуйста, помогите решить эту проблему. большое спасибо. String.valueOf (player.getCurrentTrackSelections () получим (0) .getSelectedFormat () битрейт..), Toast.LENGTH_SHORT) .show (); перерыв; случай ExoPlayer.STATE_ENDED: // сделать вашу обработку после окончания видео перерыва; }} @Override общественного недействительными onPlayerError (ExoPlaybackException ошибка) {// показать пользователю, что что-то пошло не так. это может быть диалог} @Override общественности недействительным onPositionDiscontinuity () {}, пожалуйста, помогите решить эту проблему. большое спасибо. String.valueOf (player.getCurrentTrackSelections () получим (0) .getSelectedFormat () битрейт..), Toast.LENGTH_SHORT) .show (); перерыв; случай ExoPlayer.STATE_ENDED: // сделать вашу обработку после окончания видео перерыва; }} @Override общественного недействительными onPlayerError (ExoPlaybackException ошибка) {// показать пользователю, что что-то пошло не так. это может быть диалог} @Override общественности недействительным onPositionDiscontinuity () {}, пожалуйста, помогите решить эту проблему. большое спасибо. это может быть диалог} @Override общественности недействительным onPositionDiscontinuity () {}, пожалуйста, помогите решить эту проблему. большое спасибо. это может быть диалог} @Override общественности недействительным onPositionDiscontinuity () {}, пожалуйста, помогите решить эту проблему. большое спасибо.
Ali Soleimani

Просмотр дополнительных вопросов