Как создать MediaSource для ExoPlayer из ссылки на YouTube с помощью youtubeExtractor - PullRequest
1 голос
/ 29 марта 2019

Я безуспешно пытаюсь извлечь 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...