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功能
接口名称 用途描述
seekTo seek到指定位置之前的最近的一个关键帧
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_UNKNOWN 1 未知信息
MEDIA_INFO_STARTED_AS_NEXT 2 播放下一条
MEDIA_INFO_VIDEO_RENDERING_START 3 视频开始整备中,准备渲染
MEDIA_INFO_VIDEO_TRACK_LAGGING 700 视频日志跟踪
MEDIA_INFO_BUFFERING_START 701 开始缓冲中 开始缓冲
MEDIA_INFO_BUFFERING_END 702 网络带宽,网速方面
MEDIA_INFO_NETWORK_BANDWIDTH 703 缓冲结束
MEDIA_INFO_BAD_INTERLEAVING 800
MEDIA_INFO_NOT_SEEKABLE 801 不可设置播放位置,直播方面
MEDIA_INFO_METADATA_UPDATE 802
MEDIA_INFO_TIMED_TEXT_ERROR 900
MEDIA_INFO_UNSUPPORTED_SUBTITLE 901 不支持字幕
MEDIA_INFO_SUBTITLE_TIMED_OUT 902 字幕超时
MEDIA_INFO_VIDEO_INTERRUPT 10000 数据连接中断,一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的
MEDIA_INFO_VIDEO_ROTATION_CHANGED 10001 视频方向改变,视频选择信息
MEDIA_INFO_AUDIO_RENDERING_START 10002 音频开始整备中
MEDIA_INFO_AUDIO_DECODED_START 10003
MEDIA_INFO_VIDEO_DECODED_START 10004
MEDIA_INFO_OPEN_INPUT 10005
MEDIA_INFO_FIND_STREAM_INFO 10006
MEDIA_INFO_COMPONENT_OPEN 10007
MEDIA_INFO_VIDEO_SEEK_RENDERING_START 10008
MEDIA_INFO_AUDIO_SEEK_RENDERING_START 10009
MEDIA_INFO_MEDIA_ACCURATE_SEEK_COMPLETE 10100
MEDIA_INFO_NETWORK_SPEED 10003
MEDIA_INFO_PKTSIZE 10004
MEDIA_INFO_PLAY_DISCONTINUOUS 704
MEDIA_INFO_SNAP 705
MEDIA_INFO_DOMAINANALYTIC_TIME 706
MEDIA_INFO_CONNECT_TIME 707
  • ERROR
字段 说明
MEDIA_ERROR_UNKNOWN 1
MEDIA_ERROR_PLAY_STOP -10000 播放停止或失败
MEDIA_ERROR_SERVER_DIED 100 服务挂掉,视频中断,一般是视频源异常或者不支持的视频类型。
MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK 200 数据错误没有有效的回收
MEDIA_ERROR_IO -1004 IO 错误
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.**

results matching ""

    No results matching ""