Я безуспешно пытаюсь извлечь URL из ссылки на YouTube и воспроизвести ее, используя youtubeExtractor (https://github.com/HaarigerHarald/android-youtubeExtractor) и ExoPlayer.
приложение получает список событий из базы данных и объект Media для каждого из них. в случае, если медиа - это ссылка на размещенный видеофайл - все отлично работает. когда тип ссылки - ссылка на YouTube, для создания MediaSource необходимо извлечь URL.
по какой-то причине MediaSource, созданный на основе извлечения, возвращает null что мне здесь не хватает?
initMedia () вызывается для каждого нового объекта из базы данных:
private void initMedia() {
hasMedia = event.getMedia().size() > 0 & stateManager.getBoolean("use_video");
if (hasMedia) {
Media m = event.getMedia().get(0);
switch (m.getType()) {
case "VID":
initalizeExoPlayer(m);
break;
case "YOUTUBE":
initalizeExoPlayer(m);
break;
default:
loadDefaultImage();
}
}
else {
loadDefaultImage();
}
}
затем игрок инициализируется:
private void initalizeExoPlayer(Media m) {
image.setVisibility(android.view.View.GONE);
playerView.setVisibility(android.view.View.VISIBLE);
player.addListener(new Player.EventListener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
isPlaying = playWhenReady && playbackState == Player.STATE_READY;
mediaLoadingIndicator.setVisibility(playbackState == Player.STATE_BUFFERING ? android.view.View.VISIBLE : android.view.View.GONE);
}
});
switch (m.getType()) {
case Media.TYPE_VIDEO:
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,
Util.getUserAgent(context, "RightHear"));
videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(m.getLink()));
break;
case Media.TYPE_YOUTUBE:
youtubeLink = "http://youtube.com/watch?v=" + m.getYoutubeId();
@SuppressLint("StaticFieldLeak") YouTubeExtractor mExtractor = new YouTubeExtractor(context) {
@Override
protected void onExtractionComplete(SparseArray<YtFile> ytFiles, VideoMeta vMeta) {
if (ytFiles != null) {
int itag = 22;
youtubeUrl = ytFiles.get(itag).getUrl();
}
}
};
mExtractor.extract(youtubeLink, true, true);
DataSource.Factory youtubeDataSourceFactory = new DefaultDataSourceFactory(context,
Util.getUserAgent(context, "RightHear"));
youtubeVideoSource = new ExtractorMediaSource.Factory(youtubeDataSourceFactory)
.createMediaSource(Uri.parse(youtubeUrl));
}
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
player.setRepeatMode(Player.REPEAT_MODE_ALL);
player.setVolume(isMuted ? 0 : 1);
playerView.setPlayer(player);
}
onSwipePrepare () подготавливает источники для следующих событий:
@SwipePrepare
public void onSwipePrepare(int index) {
Log.e("blabla", "OnPrepare " + event.getArtist() + ", " + event.getTitle());
if (hasMedia) {
Media m = event.getMedia().get(0);
switch (m.getType()) {
case Media.TYPE_VIDEO:
player.prepare(videoSource);
break;
case Media.TYPE_YOUTUBE:
player.prepare(youtubeVideoSource);
break;
}
}
}
onSwipeHead () устанавливает условие игрока в состояние «готово», когда пользователю предоставляется четное число:
@SwipeHead
public void onSwipeHead() {
if (hasMedia) {
Media m = event.getMedia().get(0);
switch (m.getType()) {
case Media.TYPE_VIDEO:
this.player.setPlayWhenReady(true);
break;
case Media.TYPE_YOUTUBE:
this.player.setPlayWhenReady(true);
}
}
}