Android 播放器 SDK
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.**