自己定义一个播放器

博客提及参考智能课件里的PPTVideoView模块,还指出具体使用该播放器可参考PPTVideoView。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考智能课件里的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值