exoplayer和mediaplayer的封装

问题:开发播放器的过程中发现,在mediaplayer对喜马拉雅的hls直播音频流进行播放的过程中,发生MediaPlayer:Error(1,-1007)错误,尝试播放网上找的直播流"http://content.mobile-tv.sky.com/content/ssna/live/ssnraudio.m3u8"不放生此问题

对此在不改变项目已有接口的情况下将MediaPlayer 和 ExoPlayer进行封装

代码如下

public class MediaPlayerImp {
    private UaiMediaListener listener;

    private Context context;

    private boolean isExoPLayer = false;

    private Object mMediaPlayer;

    private Object exoPlayerListener;

    public interface UaiMediaListener {
        void onPrepared();

        void onCompletion();

        void onSeekComplete();

        void onError();
    }

    public MediaPlayerImp(Context context) {
        this.context = context;
        mMediaPlayer = createMediaPlayer(context);
    }

    public MediaPlayerImp(Context context, boolean isNeedExoPLayer){
        this(context);
        this.isExoPLayer = isNeedExoPLayer;
    }

    public void reset() {
        if (isExoPLayer) {
            //no reset do nothing
        } else {
            ((MediaPlayer) mMediaPlayer).reset();
        }
    }

    public boolean isPlaying() {
        if (isExoPLayer) {
            return ((ExoPlayer) mMediaPlayer).getPlayWhenReady();
        } else {
            return ((MediaPlayer) mMediaPlayer).isPlaying();
        }
    }

    public void start() {
        if (isExoPLayer) {
            ((ExoPlayer) mMediaPlayer).setPlayWhenReady(true);
        } else {
            ((MediaPlayer) mMediaPlayer).start();
        }
    }

    public void pause() {
        if (isExoPLayer) {
            ((ExoPlayer) mMediaPlayer).setPlayWhenReady(false);
        } else {
            ((MediaPlayer) mMediaPlayer).pause();
        }
    }

    public void stop() {
        if (isExoPLayer) {
            ((ExoPlayer) mMediaPlayer).setPlayWhenReady(false);
            ((ExoPlayer) mMediaPlayer).stop();
        } else {
            ((MediaPlayer) mMediaPlayer).stop();
        }
    }

    public void release() {
        if (isExoPLayer) {
            ((ExoPlayer) mMediaPlayer).removeListener((Player.EventListener) exoPlayerListener);
            ((ExoPlayer) mMediaPlayer).release();
        } else {
            ((MediaPlayer) mMediaPlayer).release();
        }
    }

    public void seekTo(int msec) {
        if (isExoPLayer) {
            ((ExoPlayer) mMediaPlayer).seekTo(msec);
        } else {
            ((MediaPlayer) mMediaPlayer).seekTo(msec);
        }
    }

    public void playAsync(String strUri) {
        if (isExoPLayer) {
            DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, "MediaPlayerImp");
            if (strUri.endsWith("m3u8")) {
                MediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(strUri));
                ((ExoPlayer) mMediaPlayer).prepare(hlsMediaSource, true, true);
            } else {
                MediaSource extraMediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(strUri));
                ((ExoPlayer) mMediaPlayer).prepare(extraMediaSource);
            }
        } else {
            try {
                ((MediaPlayer) mMediaPlayer).setDataSource(strUri);
                ((MediaPlayer) mMediaPlayer).prepareAsync();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public long getDuration() {
        if (isExoPLayer) {
            return ((ExoPlayer) mMediaPlayer).getDuration();
        } else {
            return ((MediaPlayer) mMediaPlayer).getDuration();
        }
    }

    public long getCurrentPosition() {
        if (isExoPLayer) {
            return ((ExoPlayer) mMediaPlayer).getCurrentPosition();
        } else {
            return ((MediaPlayer) mMediaPlayer).getCurrentPosition();
        }
    }

    public void setUaiMediaListener(@NonNull UaiMediaListener listener) {
        this.listener = listener;
    }

    private Object createMediaPlayer(Context context) {
        if (isExoPLayer) {
            // Create the player
            ExoPlayer exoPlayer = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(context),
                    new DefaultTrackSelector(), new DefaultLoadControl());
            exoPlayerListener = new Player.DefaultEventListener() {

                @Override
                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                    if (playbackState == Player.STATE_READY) {
                        listener.onPrepared();
                    }
                    if (playbackState == Player.STATE_ENDED) {
                        listener.onCompletion();
                    }
                }

                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    listener.onError();
                }

                @Override
                public void onSeekProcessed() {
                    listener.onSeekComplete();
                }
            };
            exoPlayer.addListener((Player.EventListener) exoPlayerListener);
            return exoPlayer;
        } else {
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setOnPreparedListener((mp) -> {
                listener.onPrepared();

            });
            mediaPlayer.setOnErrorListener((mp, what, extra) -> {
                listener.onError();
                return true;
            });
            mediaPlayer.setOnCompletionListener((mp) -> {
                listener.onCompletion();

            });
            mediaPlayer.setOnSeekCompleteListener((mp) -> {
                listener.onSeekComplete();
            });
            return mediaPlayer;
        }
    }


}

这样实现在不改变原项目有接口的基础上进行播放器的适配

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ExoPlayerMediaPlayerAndroid系统中作为视频播放器的实现有一些不同点。首先,MediaPlayerAndroid系统原生提供的实现,而ExoPlayer是一个开源的第三方库。\[1\] 其次,ExoPlayer相对于MediaPlayer具有更多的优点。首先,ExoPlayer支持通过HTTP(DASH)和SmoothStreaming进行动态自适应流,而这两种格式在MediaPlayer中不受支持。此外,ExoPlayer还支持许多其他格式,并且能够自定义和扩展播放器以适应各种不同需求。\[2\] 另外,ExoPlayer的组件可以自定义替换,这使得它更加灵活和可扩展。它还可以接入ffmpeg组件,从而满足更多的需求。相比之下,MediaPlayer的扩展性较差,只适合最简单的视频播放需求。\[2\] 然而,ExoPlayer也有一些缺点。首先,它的最低支持版本是Android 4.4。此外,相对于MediaPlayerExoPlayer的实现较为复杂。\[2\] 综上所述,ExoPlayer相对于MediaPlayer在功能和扩展性上具有更多的优势,但也需要考虑到其最低支持版本和实现复杂性。 #### 引用[.reference_title] - *1* *2* [Android中视频播放器的选择,MediaPlayerExoPlayer、ijkplayer简单对比](https://blog.csdn.net/qq_34895720/article/details/101511876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [+ 可以调节分辨率|字幕|倍速的视频播放器(MediaPlayer + ExoPlayer实现)](https://blog.csdn.net/intbird/article/details/105970536)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值