参考智能课件里的PPTVideoView模块:
package com.zhl.courseware.filtervideo;
import android.content.Context;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import com.zhl.android.exoplayer2.ExoPlayerFactory;
import com.zhl.android.exoplayer2.Player;
import com.zhl.android.exoplayer2.SimpleExoPlayer;
import com.zhl.android.exoplayer2.source.MediaSource;
import com.zhl.android.exoplayer2.source.ProgressiveMediaSource;
import com.zhl.android.exoplayer2.upstream.DataSource;
import com.zhl.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.zhl.android.exoplayer2.util.Util;
import com.zhl.courseware.util.PPTUtils;
import java.io.File;
import java.io.IOException;
public class FilterVideoPlayer implements Player.EventListener {
protected Context mAppContext;
protected SimpleExoPlayer player;
protected MediaPlayer mediaPlayer;
protected boolean isMediaPlayerPrepared;
protected int lastReportedPlaybackState;
protected boolean isLastReportedPlayWhenReady;
protected boolean isPreparing = true;
protected boolean isBuffering = false;
protected MediaSource videoSource;
protected IFilterVideoListener videoListener;
public FilterVideoPlayer(Context context, Uri videoUri,String path) {
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// intMediaPlayer(path);
// }else {
// mAppContext = context.getApplicationContext();
// DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mAppContext, Util.getUserAgent(mAppContext, "yourApplicationName"));
// videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri);
// player = ExoPlayerFactory.newSimpleInstance(mAppContext);
// player.addListener(this);
// }
mAppContext = context.getApplicationContext();
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mAppContext, Util.getUserAgent(mAppContext, "yourApplicationName"));
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri);
player = ExoPlayerFactory.newSimpleInstance(mAppContext);
player.addListener(this);
}
// public FilterVideoPlayer(Context context, Uri videoUri) {
// mAppContext = context.getApplicationContext();
// DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mAppContext, Util.getUserAgent(mAppContext, "yourApplicationName"));
// videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri);
// player = ExoPlayerFactory.newSimpleInstance(mAppContext);
// player.addListener(this);
// }
private void intMediaPlayer(String path){
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.reset();
// mediaPlayer.release();
// mediaPlayer.setDataSource(path);
File file = new File(path);
if (file.exists()) {
mediaPlayer.setDataSource(path);
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(path);
// onDataSourceSet(retriever);
}
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
isMediaPlayerPrepared = true;
if (videoListener!=null) {
videoListener.onPrepared();
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (videoListener!=null) {
videoListener.onCompletion();
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public void reSetUri(Uri videoUri){
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(mAppContext, Util.getUserAgent(mAppContext, "yourApplicationName"));
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(videoUri);
}
public void setVideoListener(IFilterVideoListener videoListener) {
this.videoListener = videoListener;
}
public void prepare(){
// try {
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// mediaPlayer.prepareAsync();
// }else {
// player.prepare(videoSource);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
player.prepare(videoSource);
}
/**TODO 殷志杰441 调用这个方法可以吗*/
public void setPlayWhenReady(boolean playWhenReady){
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
// if (isMediaPlayerPrepared) {
// if (playWhenReady) {
// mediaPlayer.start();
// } else {
// mediaPlayer.pause();
// }
// }
// } else {
// player.setPlayWhenReady(playWhenReady);
// }
player.setPlayWhenReady(playWhenReady);
}
public SimpleExoPlayer getSimpleExoPlayer() {
return player;
}
public MediaPlayer geMediaPlayer() {
return mediaPlayer;
}
public long getCurrentPosition(){
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// return mediaPlayer.getCurrentPosition();
// }else {
// return player.getCurrentPosition();
// }
return player.getCurrentPosition();
}
public long getDuration(){
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// return mediaPlayer.getDuration();
// }else {
// return player.getDuration();
// }
return player.getDuration();
}
public void stop(){
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// mediaPlayer.stop();
// }else {
// player.stop();
// }
player.stop();
}
public void release(){
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// mediaPlayer.release();
// mediaPlayer = null;
// }else {
// player.release();
// player = null;
// }
player.release();
player = null;
}
public void seekTo(long positionMs){
// if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP){
// mediaPlayer.seekTo((int) positionMs);
// }else {
// player.seekTo(positionMs);
// }
player.seekTo(positionMs);
}
public boolean isPlaying() {
if (player == null){
// Log.e("zhl","判断1");
return false;
}
int state = player.getPlaybackState();
switch (state) {
case Player.STATE_BUFFERING:
case Player.STATE_READY:
// Log.e("zhl","判断2:"+state);
return player.getPlayWhenReady();
case Player.STATE_IDLE:
case Player.STATE_ENDED:
default:
// Log.e("zhl","判断3:"+state);
return false;
}
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
//重新播放状态顺序为:STATE_IDLE -》STATE_BUFFERING -》STATE_READY
//缓冲时顺序为:STATE_BUFFERING -》STATE_READY
//Log.e(TAG, "onPlayerStateChanged: playWhenReady = " + playWhenReady + ", playbackState = " + playbackState);
if (isLastReportedPlayWhenReady != playWhenReady || lastReportedPlaybackState != playbackState) {
if (isBuffering) {
switch (playbackState) {
case Player.STATE_ENDED:
case Player.STATE_READY:
// notifyOnInfo(IMediaPlayer.MEDIA_INFO_BUFFERING_END, mInternalPlayer.getBufferedPercentage());
isBuffering = false;
break;
}
}
if (isPreparing) {
switch (playbackState) {
case Player.STATE_READY:
//TODO 视频准备完成
// notifyOnPrepared();
if (videoListener!=null) {
videoListener.onPrepared();
}
isPreparing = false;
break;
}
}
switch (playbackState) {
case Player.STATE_BUFFERING:
// notifyOnInfo(IMediaPlayer.MEDIA_INFO_BUFFERING_START, mInternalPlayer.getBufferedPercentage());
isBuffering = true;
break;
case Player.STATE_READY:
break;
case Player.STATE_ENDED:
//TODO 视频播放完成
if (videoListener!=null) {
videoListener.onCompletion();
}
// notifyOnCompletion();
break;
default:
break;
}
}
isLastReportedPlayWhenReady = playWhenReady;
lastReportedPlaybackState = playbackState;
}
}
FilterVideoPlayer:就是播放器的播放逻辑,里面目前使用的是SimpleExoPlayer,可以根据需要改为MediaPlayer或其它播放器;这个播放器可以播放音频或视频文件,因为播放视频时画面的显示view没有在这里面定义,而是在EPlayerView里定义的:
package com.zhl.courseware.filtervideo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.SurfaceView;
import android.view.TextureView;
import com.zhl.android.exoplayer2.SimpleExoPlayer;
import com.zhl.android.exoplayer2.video.VideoListener;
//想使用TextureView时,改为继承TextureView,同时setSimpleExoPlayer()里使用setVideoTextureView(EPlayerView.this)即可
//public class EPlayerView extends TextureView implements VideoListener {
public class EPlayerView extends SurfaceView implements VideoListener {
private SimpleExoPlayer player;
private float videoAspect = 1f;
private PlayerScaleType playerScaleType = PlayerScaleType.RESIZE_FIT_WIDTH;//RESIZE_FIT_HEIGHT、RESIZE_NONE
private boolean isVideoSizeChanged = false;
public EPlayerView(Context context) {
this(context, null);
}
public EPlayerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EPlayerView setSimpleExoPlayer(SimpleExoPlayer player) {
if (this.player != null) {
this.player.release();
this.player = null;
}
this.player = player;
this.player.addVideoListener(this);
// this.player.setVideoTextureView(EPlayerView.this);
this.player.setVideoSurfaceView(EPlayerView.this);
return this;
}
public void setPlayerScaleType(PlayerScaleType playerScaleType) {
this.playerScaleType = playerScaleType;
requestLayout();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (isVideoSizeChanged) {
int measuredWidth = getMeasuredWidth();
int measuredHeight = getMeasuredHeight();
int viewWidth = measuredWidth;
int viewHeight = measuredHeight;
switch (playerScaleType) {
case RESIZE_FIT_WIDTH:
viewHeight = (int) (measuredWidth / videoAspect);
break;
case RESIZE_FIT_HEIGHT:
viewWidth = (int) (measuredHeight * videoAspect);
break;
}
setMeasuredDimension(viewWidth, viewHeight);
}
}
@Override
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
isVideoSizeChanged = true;
videoAspect = ((float) width / height) * pixelWidthHeightRatio;
requestLayout();
}
@Override
public void onRenderedFirstFrame() {
// do nothing
}
}
具体怎么使用这个播放器参考:PPTVideoView