如何使用youtubeExtractor从youtube链接为ExoPlayer创建MediaSource

时间:2019-03-29 16:38:36

标签: java android youtube exoplayer

我尝试从youtube链接中提取URL并使用youtubeExtractor(https://github.com/HaarigerHarald/android-youtubeExtractor)和ExoPlayer播放,但未成功。

app正在从数据库中获取事件列表,并为每个事件获取一个Media对象。如果媒体是指向托管视频文件的链接,则一切正常。如果链接类型是youtube链接,则需要提取URL才能创建MediaSource。 由于某些原因,基于提取创建的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);
        }
    }
}

0 个答案:

没有答案