Android播放器sdk
概述
YaguPlayer 是一款基于 Android 平台的多媒体视频播放 SDK。它为 Android 的开发者提供了简单易用的接口,帮助开发者方便快捷、低门槛的实现多媒体播放功能的开发。它支持 HLS、RTMP、HTTP FLV、MP4 等多种流媒体播放格式,视频支持 h264 格式、音频支持 AAC 格式。
功能
支持 HLS、RTMP、HTTP FLV、MP4 等流格式
支持 h264+aac
支持 armv7、arm64
支持直播首帧秒开
支持弱网条件下的丢帧策略
支持多实例,支持 https
支持带切边的视频渲染模式
开发准备
环境要求
- android 4.1(SDK API 16)及以上
- Android Studio 3.5+
- 支持 armeabi, armeabi-v7a 和 arm64-v8a
集成 SDK
集成原内核引擎
将
yaguplayer.aar
yaguplayer-engine.aar
放入app/libs
在
app/build.gradle
加入implementation (name: 'yaguplayer', ext: 'aar') implementation (name: 'yaguplayer-engine', ext: 'aar')
配置 App 权限
在 app/AndroidManifest.xml
中声明以下权限
<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"/>
如 targetSdkVersion >= 30
AndroidManifast.xml 的 application 中需要加 android:allowNativeHeapPointerTagging="false"
<application
android:allowNativeHeapPointerTagging="false"
...
快速开发
开发步骤
1、在 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>
2、获取 VideoView,设置播放地址并播放
mVideoView = findViewById(R.id.video_view);
mVideoView.setUrl(url);
mVideoView.start();
3、跳转
mVideoView.seekTo(1000);
4、暂停
mVideoView.pause();
5、继续播放
mVideoView.resume();
6、退出释放
mVideoView.release();
事件通知
准备完成通知
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;
}
};
接口说明
MuduVideoView
功能:媒体播放器提供,提供播放封装
成员方法 | 功能 |
---|---|
setUrl | 设置播放地址 |
setVideoRadius | 设置圆角 |
setOnlyPlayAudio | 只播放音频(播放音频资源时使用) |
setSpeed | 调整播放速率(1:为正常速率) |
setPTSInterval | 设置PTS |
seekTo | 跳转到指定位置(毫秒) |
isPlaying | 是否正在播放 |
isError | 是否播放错误 |
isPaused | 是否播放暂停 |
getDuration | 获取总进度 |
getCurrentPosition | 获取当前进度 |
getScreenImage | 获取截图 |
getNetSpeedText | 获取网络速度(已格式化) |
setAspectRatio | 设置画面比例 |
start | 开始播放 |
pause | 暂停播放 |
resume | 继续播放 |
release | 释放播放器 |
setOnPreparedListener | 注册视频准备完成通知 (开始播放监听) |
setOnErrorListener | 注册播放错误通知 (结束播放或播放错误-10000) |
setOnInfoListener | 注册播放信息通知 |
setOnCompletionListener | 注册播放完成通知 |
setOnSeekCompleteListener | 注册跳转完成通知 |
错误码说明
- 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.**