美文网首页面试题音视频高级UI
Android高度封装的MediaPlayer,一行代码实现音视

Android高度封装的MediaPlayer,一行代码实现音视

作者: yinhaide | 来源:发表于2019-11-30 17:28 被阅读0次

    HDMediaPlayer

    该类包依托于谷歌Mediaplayer二次封装,一行代码就可以实现播放的逻辑。
    谷歌中国API链接: Google官网API

    演示动画

    Github地址

    https://github.com/yinhaide/HDMediaPlayer

    特性

    • 该类支持播放格式有:音乐(.mp3、.wav、.ogg)、视频(.mp4、.3gp)

    • 支持播放本地音频、视频

    • 支持播放Assets目录下的音频、视频

    • 支持播放网络网络流媒体(仅限上述格式)

    如何快速集成

    导入方式

    在工程级别的build.gradle添加

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    在应用级别的build.gradle添加

    api 'com.github.yinhaide:HDMediaPlayer:0.0.5'
    

    如何使用

    • 一行代码实现播放Assets目录下的mp4:
    MediaPlayerHelper.getInstance().setSurfaceView(surfaceView).playAsset(context,"test.mp4");
    
    • 一行代码实现播放Assets目录下的mp3:
    MediaPlayerHelper.getInstance().playAsset(context,"test.mp3");
    
    • 一行代码实现播放网络流媒体或者本地全路径流媒体:
    /**
     * urlString 可为网络流媒体连接,也可以为本地存储全路径链接
     */
    MediaPlayerHelper.getInstance().setSurfaceView(surfaceView).play(urlString);
    
    • 如果想得到详细的回调信息:
    MediaPlayerHelper.getInstance().setMediaPlayerHelperCallBack(new MediaPlayerHelper.MediaPlayerHelperCallBack() {
        @Override
        public void onCallBack(MediaPlayerHelper.CallBackState state, MediaPlayerHelper mediaPlayerHelper, Object... args) {
            Log.v(TAG,"--"+state.toString());
            if(state== MediaPlayerHelper.CallBackState.PROGRESS){
                int percent=(int)args[0];
                Log.v(TAG,"--progress:"+percent);
            }
        }
    });
    
    • 更多的用法请查看demo:
    /** 设置播放进度回调时间间隔 */
    MediaPlayerHelper.getInstance().setProgressInterval(msec);
    /** 获得MediaPlayer对象,进行更多的自定义的操作 */
    MediaPlayerHelper.getInstance().getMediaPlayer().pause();
    MediaPlayerHelper.getInstance().getMediaPlayer().start();
    MediaPlayerHelper.getInstance().getMediaPlayer().stop();
    

    注意点

    1、播放结束后到下次播放有黑屏现象

    在部分配置比较低的电视或者手机设备中,视频播放完毕到下次播放之间可能存在1s左右的黑屏现象,原因是部分机器软解吗能力较弱,需要将数据解码放在内存当中导致黑屏。解决方案是开启手机的硬件加速能力,让硬件协助解码,消除黑屏现象。

    <application
        android:hardwareAccelerated="true"
        ...
    </application>
    

    2、部分机型/电视存在黑屏有声音的现象

    在部分机型中,会有播放没画面的,原因是因为SurfaceHolder可能在创建的时候尺寸不对,需要动态赋值。这个操作必须在主线程中进行。

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        ...
        if(holder != null && uiHolder.surfaceView != null){
            uiHolder.surfaceView.post(() -> holder.setFixedSize(uiHolder.surfaceView.getWidth(),uiHolder.surfaceView.getHeight()));
        }
        ...
    }
    

    这个项目会持续更新中...

    都看到这里了,如果觉得写的可以或者对你有帮助的话,顺手给个星星点下Star~

    这个控件内部采用一个Fragment框架,如果有兴趣的话可以去了解一下

    关于我

    相关文章

      网友评论

        本文标题:Android高度封装的MediaPlayer,一行代码实现音视

        本文链接:https://www.haomeiwen.com/subject/jpnowctx.html