我尝试从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);
}
}
}