我尝试了很多,但每次都无法在 exo 播放器中播放 YouTube 视频。
VideoPlayerActivity.java
package com.example.abcapp.Activities;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.SparseArray;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningapp.R;
import com.example.learningapp.utility.ExoPlayerManager;
import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
import at.huber.youtubeExtractor.VideoMeta;
import at.huber.youtubeExtractor.YouTubeExtractor;
import at.huber.youtubeExtractor.YtFile;
public class VideoPlayerActivity extends AppCompatActivity {
private String YOUTUBE_VIDEO_ID = "H_8UBv5bZo0";
private String BASE_URL = "https://www.youtube.com";
private String mYoutubeLink = BASE_URL + "/watch?v=" + YOUTUBE_VIDEO_ID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_player);
extractYoutubeUrl();
}
private void extractYoutubeUrl() {
@SuppressLint("StaticFieldLeak") YouTubeExtractor mExtractor = new YouTubeExtractor(this) {
@Override
protected void onExtractionComplete(SparseArray<YtFile> sparseArray, VideoMeta videoMeta) {
if (sparseArray != null) {
playVideo(sparseArray.get(17).getUrl());
}
}
};
mExtractor.extract(mYoutubeLink, true, true);
}
private void playVideo(String downloadUrl) {
SimpleExoPlayerView mPlayerView = findViewById(R.id.exo_player_view);
mPlayerView.setPlayer(ExoPlayerManager.getSharedInstance(VideoPlayerActivity.this).getPlayerView().getPlayer());
ExoPlayerManager.getSharedInstance(VideoPlayerActivity.this).playStream(downloadUrl);
}
}
ExoPlayerManager.java
package com.example.abcapp.utility;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.example.learningapp.Interface.ExoCallBack;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.extractor.ExtractorsFactory;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.ui.SimpleExoPlayerView;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
public class ExoPlayerManager {
/**
* declare some usable variable
*/
private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();
private static final String TAG = "ExoPlayerManager";
private static ExoPlayerManager mInstance = null;
SimpleExoPlayerView mPlayerView;
DefaultDataSourceFactory dataSourceFactory;
String uriString = "";
ArrayList<String> mPlayList = null;
Integer playlistIndex = 0;
ExoCallBack.playerCallBack listner;
private SimpleExoPlayer mPlayer;
/**
* private constructor
* @param mContext
*/
private ExoPlayerManager(Context mContext) {
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
mPlayer = ExoPlayerFactory.newSimpleInstance(mContext, trackSelector);
mPlayerView = new SimpleExoPlayerView(mContext);
mPlayerView.setUseController(true);
mPlayerView.requestFocus();
mPlayerView.setPlayer(mPlayer);
Uri mp4VideoUri = Uri.parse(uriString);
DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer_video");
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource mediaSource = new ExtractorMediaSource(mp4VideoUri, dataSourceFactory, extractorsFactory, null, null);
mPlayer.prepare(mediaSource);
mPlayer.addListener(new ExoPlayer.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
Log.i(TAG, "onTimelineChanged: ");
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
Log.i(TAG, "onTracksChanged: ");
}
@Override
public void onLoadingChanged(boolean isLoading) {
Log.i(TAG, "onLoadingChanged: ");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
Log.i(TAG, "onPlayerStateChanged: ");
if (playbackState == 4 && mPlayList != null && playlistIndex + 1 < mPlayList.size()) {
Log.e(TAG, "Song Changed...");
playlistIndex++;
listner.onItemClickOnItem(playlistIndex);
playStream(mPlayList.get(playlistIndex));
} else if (playbackState == 4 && mPlayList != null && playlistIndex + 1 == mPlayList.size()) {
mPlayer.setPlayWhenReady(false);
}
if (playbackState == 4 && listner != null) {
listner.onPlayingEnd();
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {
Log.i(TAG, "onPlayerError: ");
}
@Override
public void onPositionDiscontinuity() {
Log.i(TAG, "onPositionDiscontinuity: ");
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
Log.i(TAG, "onPlaybackParametersChanged: ");
}
});
/* mPlayer.addListener(new Player.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
Log.i(TAG, "onTimelineChanged: ");
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
Log.i(TAG, "onTracksChanged: ");
}
@Override
public void onLoadingChanged(boolean isLoading) {
Log.i(TAG, "onLoadingChanged: ");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
Log.i(TAG, "onPlayerStateChanged: ");
if (playbackState == 4 && mPlayList != null && playlistIndex + 1 < mPlayList.size()) {
Log.e(TAG, "Song Changed...");
playlistIndex++;
listner.onItemClickOnItem(playlistIndex);
playStream(mPlayList.get(playlistIndex));
} else if (playbackState == 4 && mPlayList != null && playlistIndex + 1 == mPlayList.size()) {
mPlayer.setPlayWhenReady(false);
}
if (playbackState == 4 && listner != null) {
listner.onPlayingEnd();
}
}
@Override
public void onRepeatModeChanged(int repeatMode) {
Log.i(TAG, "onRepeatModeChanged: ");
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
Log.i(TAG, "onShuffleModeEnabledChanged: ");
}
@Override
public void onPlayerError(ExoPlaybackException error) {
Log.i(TAG, "onPlayerError: ");
}
@Override
public void onPositionDiscontinuity(int reason) {
Log.i(TAG, "onPositionDiscontinuity: ");
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
Log.i(TAG, "onPlaybackParametersChanged: ");
}
@Override
public void onSeekProcessed() {
Log.i(TAG, "onSeekProcessed: ");
}
});*/
}
/**
* Return ExoPlayerManager instance
* @param mContext
* @return
*/
public static ExoPlayerManager getSharedInstance(Context mContext) {
if (mInstance == null) {
mInstance = new ExoPlayerManager(mContext);
}
return mInstance;
}
public void setPlayerListener(ExoCallBack.playerCallBack mPlayerCallBack) {
listner = mPlayerCallBack;
}
public SimpleExoPlayerView getPlayerView() {
return mPlayerView;
}
public void playStream(String urlToPlay) {
uriString = urlToPlay;
Uri mp4VideoUri = Uri.parse(uriString);
MediaSource videoSource;
String filenameArray[] = urlToPlay.split("\\.");
if (uriString.toUpperCase().contains("M3U8")) {
videoSource = new HlsMediaSource(mp4VideoUri, dataSourceFactory, null, null);
} else {
mp4VideoUri = Uri.parse(urlToPlay);
videoSource = new ExtractorMediaSource(mp4VideoUri, dataSourceFactory, new DefaultExtractorsFactory(),
null, null);
}
// Prepare the player with the source.
mPlayer.prepare(videoSource);
mPlayer.setPlayWhenReady(true);
}
public void setPlayerVolume(float vol) {
mPlayer.setVolume(vol);
}
public void setUriString(String uri) {
uriString = uri;
}
public void setPlaylist(ArrayList<String> uriArrayList, Integer index, ExoCallBack.playerCallBack callBack) {
mPlayList = uriArrayList;
playlistIndex = index;
listner = callBack;
playStream(mPlayList.get(playlistIndex));
}
public void playerPlaySwitch() {
if (uriString != "") {
mPlayer.setPlayWhenReady(!mPlayer.getPlayWhenReady());
}
}
public void stopPlayer(boolean state) {
mPlayer.setPlayWhenReady(!state);
}
public void destroyPlayer() {
mPlayer.stop();
}
public Boolean isPlayerPlaying() {
return mPlayer.getPlayWhenReady();
}
public ArrayList<String> readURLs(String url) {
if (url == null) return null;
ArrayList<String> allURls = new ArrayList<String>();
try {
URL urls = new URL(url);
BufferedReader in = new BufferedReader(new InputStreamReader(urls
.openStream()));
String str;
while ((str = in.readLine()) != null) {
allURls.add(str);
}
in.close();
return allURls;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
现在接口是 - ExoCallBack.java
package com.example.abcapp.Interface;
public interface ExoCallBack {
void callbackObserver(Object obj);
public interface playerCallBack {
void onItemClickOnItem(Integer albumId);
void onPlayingEnd();
}
}
当我运行这个时,我得到了一个空白屏幕,在那个只有空白屏幕显示的情况下没有任何反应,甚至没有获得任何播放器的默认控制器。我不知道错误或错误在哪里。 请帮忙