Android 播放器 SDK

优质
小牛编辑
131浏览
2023-12-01

Android播放器sdk

概述

YaguPlayer是一款基于Android平台的多媒体视频播放SDK。它为Android的开发者提供了简单易用的接口,帮助开发者方便快捷、低门槛的实现多媒体播放功能的开发。它支持HLS、RTMP、HTTP FLV、MP4等多种流媒体播放格式,视频支持h264格式、音频支持AAC格式。

功能

支持HLS、RTMP、HTTP FLV、MP4等流格式 支持h264+aac 支持armv7、arm64 支持直播首帧秒开 支持弱网条件下的丢帧策略 支持多实例,支持https 支持带切边的视频渲染模式

阅读对象

本文档面向所有使用该SDK的开发人员、测试人员以及对此感兴趣的用户,要求开发者对播放器的基本功能有一定的了解。

开发准备

设备和系统版本

android4.0及以上 手机芯片要求armv7或armv8架构

开发环境配置

本SDK开发环境为 JAVA1.7 | ANDROID SDK API LEVEL 14

安装包说明

  • lib:播放器SDK开发包,包括aar文件。

快速开发


开发步骤

1、需要在安卓应用程序中,声明以下权限:

    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

然后引入开发包,将yaguplayer.aar放入app/libs包,在build.gradle加入

implementation fileTree(include: ['*.aar'], dir: 'libs')

2、在AndroidManifesat文件下播放端Activity和Service配置如下:

<activity android:name=".PlayActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:mimeType="video/*" />
        <data android:mimeType="audio/*" />
        <data android:scheme="http" />
        <data android:scheme="file" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="video/*" />
    </intent-filter>
</activity>

<service
    android:name="com.mudu.yaguplayer.video.services.MediaPlayerService"
    android:enabled="false"
    android:exported="false"
    android:label="@string/app_name" >
</service>

3、在xml中使用videoView

<com.mudu.yaguplayer.video.widget.media.MuduVideoView
    android:id="@+id/video_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center">
</com.mudu.yaguplayer.video.widget.media.MuduVideoView>

4、获取VideoView,设置播放地址并播放

mVideoView = findViewById(R.id.video_view);
mVideoView.setVideoPath(mVideoPath);
mVideoView.start();

5、 结束播放

mVideoView.stopPlayback();

6、退出释放

mVideoView.release(true);
mVideoView.stopBackgroundPlay();

7、进入后台

mVideoView.enterBackground();

DEMO示例

在 SDK 中提供了 Demo,此 Demo 是用播放器 SDK 开发了一个完整的视频播放器,用户可以参考 Demo 进行播 放器的开发。 下面给出了部分重要的 Demo 中调用 SDK 的代码。

事件通知:

准备完成通知

    private IMediaPlayer.OnPreparedListener preparedListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer iMediaPlayer) {

        }
    };

完成事件通知

    private IMediaPlayer.OnCompletionListener completionListener = new IMediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(IMediaPlayer iMediaPlayer) {

        }
    };

播放错误通知

    private IMediaPlayer.OnErrorListener errorListener = new IMediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(IMediaPlayer iMediaPlayer, int what, int extra) {
            Log.e("mVideoView", what+"  "+extra);

            return false;
        }
    };

播放事件通知


    private IMediaPlayer.OnInfoListener infoListener = new IMediaPlayer.OnInfoListener() {
        @Override
        public boolean onInfo(IMediaPlayer mp, int arg1, int arg2) {
            Log.e("mVideoView", arg1+"  "+arg2);

            switch (arg1) {
                case IMediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
                    Log.e(TAG, "MEDIA_INFO_VIDEO_TRACK_LAGGING:");
                    break;
                case IMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                    Log.e(TAG, "MEDIA_INFO_VIDEO_RENDERING_START  ");
                    break;
                case IMediaPlayer.MEDIA_INFO_BUFFERING_START:
                    Log.e(TAG, "MEDIA_INFO_BUFFERING_START:");
                    break;
                case IMediaPlayer.MEDIA_INFO_BUFFERING_END:
                    Log.e(TAG, "MEDIA_INFO_BUFFERING_END:");
                    break;
                case IMediaPlayer.MEDIA_INFO_NETWORK_BANDWIDTH:
                    Log.e(TAG, "MEDIA_INFO_NETWORK_BANDWIDTH: arg1" + arg1 + "  arg2: " + arg2);
                    break;
                case IMediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
                    Log.e(TAG, "MEDIA_INFO_BAD_INTERLEAVING:");
                    break;
                case IMediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
                    Log.e(TAG, "MEDIA_INFO_NOT_SEEKABLE:");
                    break;
                case IMediaPlayer.MEDIA_INFO_METADATA_UPDATE:
                    Log.e(TAG, "MEDIA_INFO_METADATA_UPDATE:");
                    break;
                case IMediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE:
                    Log.e(TAG, "MEDIA_INFO_UNSUPPORTED_SUBTITLE:");
                    break;
                case IMediaPlayer.MEDIA_INFO_SUBTITLE_TIMED_OUT:
                    Log.e(TAG, "MEDIA_INFO_SUBTITLE_TIMED_OUT:");
                    break;
                case IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED:
                    Log.e(TAG, "MEDIA_INFO_VIDEO_ROTATION_CHANGED: " + arg2);
                    break;
                case IMediaPlayer.MEDIA_INFO_NETWORK_SPEED:
                    break;
                case IMediaPlayer.MEDIA_INFO_PKTSIZE:
                    break;
                case IMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:
                    Log.e(TAG, "MEDIA_INFO_AUDIO_RENDERING_START:");
                    break;
                case IMediaPlayer.MEDIA_INFO_PLAY_DISCONTINUOUS:
                    Log.e(TAG, " getmessage MEDIA_INFO_PLAY_DISCONTINUOUS time = " );
                    break;
                case IMediaPlayer.MEDIA_INFO_DOMAINANALYTIC_TIME:
                    int time1 = arg2;
                    Log.e(TAG,"Test MEDIA_INFO_DOMAINANALYTIC_TIME = " + time1);
                    break;
                case IMediaPlayer.MEDIA_INFO_CONNECT_TIME:
                    int time2 = arg2;
                    Log.e(TAG,"Test MEDIA_INFO_CONNECT_TIME = " + time2);
                    break;
            }
            return false;
        }
    };
seek功能
接口名称用途描述
seekToseek到指定位置之前的最近的一个关键帧
seekToAccurate精准跳转到指定位置 除了上述可配置的功能和参数,IMediaPlayer还定义了播放器的事件状态通知和错误代码,以方便开发者掌握播放器的运行状态

除了上述可配置的功能和参数,IMediaPlayer还定义了播放器的事件状态通知和错误代码,以方便开发者掌 握播放器的运行状态。 若需要了解上述功能和接口的详细用法,请参照下节的接口说明。

接口说明


MuduVideoView

类名:MuduVideoView 功能:媒体播放器提供,提供播放封装 成员方法:

成员方法功能
setVideoPath设置播放本地路径
setVideoURI设置播放URI,会重置底层mediaplayer
getMediaPlayer获取底层mediaPlayer
seekTo跳转到指定位置
isPlaying是否正在播放
getDuration获取总进度
getCurrentPosition获取当前进度
release释放播放器
stopBackgroundPlay停止背景播放
enterBackground进入后台播放
isBackgroundPlayEnabled是否允许进入后台播放
canPause是否可以暂停
canSeekBackward是否可以跳转到前面的进度
canSeekForward是否可以跳转到后面的进度
setSpeed调整播放速率
start开始播放
pause暂停
resume重置状态,包括重置mediaPlayer
setOnPreparedListener注册视频准备完成通知 (开始播放监听)
setOnErrorListener注册播放错误通知 (结束播放或播放错误-10000)
setOnInfoListener注册播放信息通知
setOnCompletionListener注册播放完成通知

IMediaPlayer

类名:IMediaPlayer 功能:媒体播放器接口类,提供播放控制 成员方法:

成员方法功能
prepareAsync准备播放
start开始播放视频
pause暂停视频播放
stop停止视频播放
reset重置播放器
seekTo跳转到指定位置
isPlaying是否正在播放
setVolume调节音量
getVideoWidth获取视频宽度
getVideoHeight获取视频高度
getDuration获取视频长度
getCurrentPosition获取当前视频播放位置
setKeepInBackground是否支持后台保持
setSurfaceChanged设置 surface 发生改变
setDisplay设置视频显示的 surfaceholder
setSurface设置视频显示的surface
setDataSource设置mediaDataSource
isLooping是否循环播放
setLooping设置循环播放
getAudioSessionId获取audioSessionId
setAudioStreamType设置音频源类型
setDefaultDecoder设置默认的解码器
release回收播放器
setOnPreparedListener注册视频准备完成通知 (开始播放监听)
setOnErrorListener注册播放错误通知 (结束播放或播放错误-10000)
setOnInfoListener注册播放信息通知
setOnCompletionListener注册播放完成通知
setOnSeekCompleteListener注册跳转完成通知
setOnBufferingUpdateListener注册缓冲更新通知
setOnVideoSizeChangedListener注册视频大小改变通知
setOnTimedTextListener字幕监听

错误码说明

播放错误码

  • INFO
字段说明
MEDIA_INFO_UNKNOWN1未知信息
MEDIA_INFO_STARTED_AS_NEXT2播放下一条
MEDIA_INFO_VIDEO_RENDERING_START3视频开始整备中,准备渲染
MEDIA_INFO_VIDEO_TRACK_LAGGING700视频日志跟踪
MEDIA_INFO_BUFFERING_START701开始缓冲中 开始缓冲
MEDIA_INFO_BUFFERING_END702网络带宽,网速方面
MEDIA_INFO_NETWORK_BANDWIDTH703缓冲结束
MEDIA_INFO_BAD_INTERLEAVING800
MEDIA_INFO_NOT_SEEKABLE801不可设置播放位置,直播方面
MEDIA_INFO_METADATA_UPDATE802
MEDIA_INFO_TIMED_TEXT_ERROR900
MEDIA_INFO_UNSUPPORTED_SUBTITLE901不支持字幕
MEDIA_INFO_SUBTITLE_TIMED_OUT902字幕超时
MEDIA_INFO_VIDEO_INTERRUPT10000数据连接中断,一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的
MEDIA_INFO_VIDEO_ROTATION_CHANGED10001视频方向改变,视频选择信息
MEDIA_INFO_AUDIO_RENDERING_START10002音频开始整备中
MEDIA_INFO_AUDIO_DECODED_START10003
MEDIA_INFO_VIDEO_DECODED_START10004
MEDIA_INFO_OPEN_INPUT10005
MEDIA_INFO_FIND_STREAM_INFO10006
MEDIA_INFO_COMPONENT_OPEN10007
MEDIA_INFO_VIDEO_SEEK_RENDERING_START10008
MEDIA_INFO_AUDIO_SEEK_RENDERING_START10009
MEDIA_INFO_MEDIA_ACCURATE_SEEK_COMPLETE10100
MEDIA_INFO_NETWORK_SPEED10003
MEDIA_INFO_PKTSIZE10004
MEDIA_INFO_PLAY_DISCONTINUOUS704
MEDIA_INFO_SNAP705
MEDIA_INFO_DOMAINANALYTIC_TIME706
MEDIA_INFO_CONNECT_TIME707
  • ERROR
字段说明
MEDIA_ERROR_UNKNOWN1
MEDIA_ERROR_PLAY_STOP-10000播放停止或失败
MEDIA_ERROR_SERVER_DIED100服务挂掉,视频中断,一般是视频源异常或者不支持的视频类型。
MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK200数据错误没有有效的回收
MEDIA_ERROR_IO-1004IO 错误
MEDIA_ERROR_MALFORMED-1007
MEDIA_ERROR_UNSUPPORTED-1010数据不支持
MEDIA_ERROR_TIMED_OUT-110数据超时

添加混淆文件

在proguard-rules.pro文件下添加如下代码:

-keep class com.mudu.**{*;}
-dontwarn com.mudu.**

-keep class com.yagu.**{*;}
-dontwarn com.yagu.**

-keep class tv.danmaku.**{*;}
-dontwarn tv.danmaku.**