-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Плеер не играет некоторые видео #1
Comments
Код загрузки видео здесь - метод playVideoStream Адрес потока stream url получаем отсюда (через NewPipe) Текущая версия (exoplayer 2.7.3) по инструкции отсюда com.google.android.exoplayer2.upstream.DataSource.Factory videoDataSourceFactory
= new DefaultDataSourceFactory(this, Util.getUserAgent(this, "yashlang"), bandwidthMeter);
...
Uri mp4VideoUri = Uri.parse(streamUrl);
MediaSource videoSource;
if (streamUrl.toUpperCase().contains("M3U8")) {
videoSource = new HlsMediaSource(mp4VideoUri, videoDataSourceFactory, null, null);
} else {
videoSource = new ExtractorMediaSource(mp4VideoUri, videoDataSourceFactory, new DefaultExtractorsFactory(),
null, null);
}
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource); Вот здесь советуют использовать OkHttpDataSourceFactory вместо обычной OkHttpDataSourceFactory Попробовал: в build.gradle (уровень приложения) добавил
MediaSource videoSource = new ExtractorMediaSource(
mp4VideoUri,
new OkHttpDataSourceFactory(
new OkHttpClient(),
Util.getUserAgent(this, "yashlang"),
null
),
new DefaultExtractorsFactory(),
null,
null
);
...
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource); легче не стало, старые ролики вроде продолжают открываться, проблемные ролики всё равно не открываются, apk потолстел на 1 Мб. |
Обновиил ExoPlayer до последней версии 2.10.8 https://exoplayer.dev/hello-world.html
Вариант с OkHttpDataSourceFactory на проблемных видео не заработал, на обычных видео начал вылетать с эксепшеном, в общем, это вариант нах. старый вариант тоже перестал компилироваться из-за изменений в API. Сравнение на "M3U8" не очень понятно, когда срабатывается, те видео, на которые попадают в плейлист, похоже все загружаются с датасорсом ExtractorMediaSource. Теперь вместо него ProgressiveMediaSource. https://stackoverflow.com/questions/56661984/android-exoplayer-extractormediasource-is-deprecated теперь видео загружается так: final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
...
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource); играет, как и раньше, - в основном ролики открываются, проблемные ролики так и не открываются, ну хоть обновились до последнего API. на всякий случай: HlsMediaSource теперь создается так (но мы его использовать пока больше не будем): HlsMediaSource videoSource =
new HlsMediaSource.Factory(videoDataSourceFactory).createMediaSource(mp4VideoUri); |
Проведить дальше:
они там используют некий youtubeExtractor (я раньше его тоже не использовал)
|
Код для YouTubeExtractor примерно такой:
private void extractYoutubeUrl(String ytUrl) {
YouTubeExtractor mExtractor = new YouTubeExtractor(this) {
@Override
protected void onExtractionComplete(SparseArray<YtFile> sparseArray, VideoMeta videoMeta) {
if (sparseArray != null) {
System.out.println(sparseArray.size());
System.out.println("yte: " + sparseArray.get(17).getUrl());
}
}
};
mExtractor.extract(ytUrl, true, true);
} // загрузить поток видео
//String ytId = "AEW85bEznCw"; // боевые страницы
//String ytId = "AlQuWA5vHVI"; // кошкин дом
String ytId = "AWCiltL3wJY"; // адаптация организма
//String ytId = "9M286oRxFxs"; // колобок (играет ок)
extractYoutubeUrl("https://www.youtube.com/watch?v=%s".replace("%s", ytId)); для Колобка (который обычно играет ок) вылетает с null pointer на sparseArray.get(17).getUrl() Для тех, которые не играют, эксепшен в консоль:
NewPipe адреса проблемных стримов не выдаёт просто (ContentLoader.extractYtStreamUrl возвращает null). отсюда null: final String streamUrl = extractor.getVideoStreams().size() > 0 ? extractor.getVideoStreams().get(0).getUrl() : null; |
Да, из этого сразу видно, что дело не в плеере, а в экстракторе адреса стрима в NewPipe, можно засабмитить им баг. |
Обновил NewPipeExtractor до 0.17.4, все заработало (кроме тех роликов, которые требуют авторизацию, и у которых изначально нулевая длина, но они и не должны) |
Сначала простые - требуют логин для указания возраста, а мы не логинимся:
Илья Муромец
https://www.youtube.com/watch?v=hooaKxdXbfM
Руслан и Людмила 1-ая серия / Ruslan and Lyudmila film 1
https://www.youtube.com/watch?v=2UoO2t536Ko
А вот эти логин не просят, но не играют, в ньюпайпе тоже не играют, в браузере играют без логина:
Боевые страницы (1939) фильм смотреть онлайн
https://www.youtube.com/watch?v=AEW85bEznCw
Кошкин дом (1982) Кукольный мультфильм | Золотая коллекция
https://www.youtube.com/watch?v=AlQuWA5vHVI
Это тоже логин не просит, не играет в плеере, плюс к этому еще не грузится иконка с превьюшкой в списке:
16 Адаптация Организма
https://www.youtube.com/watch?v=AWCiltL3wJY
(с иконкой, похоже, понятно, просто она не задана для видео, в браузере ее тоже нет)
Еще бывают ролики, для которых ютюб сразу возвращает неопределенное время проигрывания (вроде сервисных заставок), но это не они.
The text was updated successfully, but these errors were encountered: