Android 播放端 SDK
1 概述
PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单、快捷的接口,帮助开发者在 Android 平台上快速开发播放器应用。
SDK 的 Github 地址:https://github.com/pili-engineering/PLDroidPlayer
1 功能特性及版本号
功能 | 描述 | 版本 |
---|---|---|
PLMediaPlayer | 类似 Android MediaPlayer,提供了播放器的核心功能 | 1.2.0+ |
PLVideoView | 类似 Android VideoView,基于 SurfaceView 的播放控件 | 1.2.0+ |
PLVideoTextureView | 类似 Android VideoView,基于 TextureView 的播放控件 | 1.2.0+ |
主流架构支持 | 包括 arm64-v8a, armeabi-v7a 与 x86 | 1.2.0+ |
画面镜像与旋转 | 由 PLVideoTextureView 提供,支持播放画面镜像与旋转 | 1.2.2+ |
后台播放 | 退到后台只播放音频 | 1.2.3+ |
IP 地址播放 | URL 格式:protocol://ip/path?domain=xxxx.com | 1.3.0+ |
设置播放封面 | 在播放开始前显示封面 view | 1.4.0+ |
软硬解自动切换 | 优先硬解,硬解失败自动切换到软解 | 1.4.1+ |
自动直播延迟优化 | 播放直播流时可以通过自动变速播放来优化延迟 | 2.0.0+ |
H.265 软解 | 软解播放 H.265 视频流 | 2.0.0+ |
变速播放 | 支持设置播放速度 | 2.0.0+ |
MP4 离线缓存 | 支持播放过程中缓存 MP4 文件到本地 | 2.0.0+ |
解码数据回调 | 回调解码后的音视频数据,可以外部渲染 | 2.0.0+ |
七牛私有加密 HLS 播放 | 支持播放七牛私有加密 HLS 视频 | 2.0.0+ |
分屏播放 | 由 PLVideoTextureView 提供,支持两个 view 并排分屏播放 | 2.0.3+ |
自定义 DNS 服务器 | 支持自定义 DNS 服务器与设置预解析域名 | 2.0.5+ |
视频截图 | 支持视频截图 | 2.1.0+ |
区域播放 | 支持播放视频画面的部分区域 | 2.1.0+ |
音量增强 | 支持将播放音量增强到大于原始音量 | 2.1.0+ |
快开模式 | 极大加快相同协议与格式的视频流的打开速度 | 2.1.0+ |
预缓存 | 加快资源打开速度 | 2.1.5+ |
预加载 | 加载资源打开速度 | 2.1.6+ |
本地日志 | 排查播放器运行状态 | 2.1.6+ |
七牛私有加密 MP4 播放 | 支持播放七牛私有加密 MP4 视频 | 2.1.7+ |
2 阅读对象
本文档为技术文档,需要阅读者:
- 具有基本的 Android 开发能力
- 准备接入七牛云直播
3 开发准备
3.1 设备以及系统要求
- 系统要求:Android 2.3 (API 9) 及其以
3.2 混淆
为了保证正常使用 SDK ,请在 proguard-rules.pro 文件中添加以下代码:
-keep class com.pili.pldroid.player.** { *; }
-keep class com.qiniu.qplayer.mediaEngine.MediaPlayer{*;}
4 快速开始
4.1 开发环境
4.2 SDK 集成
首先,下载最新版本的 PLDroidPlayer SDK
4.2.1 导入 SDK
SDK 主要包含 demo 代码、 PLDroidPlayer jar 包,以及 sdk 依赖的动态库文件。
将 SDK 文件导入您的工程:
PLDroidPlayer SDK 支持 armv5、armv7、arm64 和 x86 多种 CPU 架构,目前市场上主流机型的 CPU 都采用的是 armv7 架构。您可以根据兼容性的需要,将 release 目录下的动态库,拷贝到您的工程对应的目录下,例如:armeabi-v7a 目录下的 so 则拷贝到工程的 jniLibs/armeabi-v7a 目录下。
由于 Android 7.0 使用 BoringSSL 替换了 OpenSSL,一些依赖系统内建 OpenSSL 的程序在一些 7.0+ 的 ROM 里可能会崩溃。如果您的应用 targetSdkVersion >= 24,那么强烈推荐将 libopenssl.so 加入至 jniLibs 目录。
同时,还需要将 pldroid-player-x.x.x.jar 包也拷贝到工程的 libs 目录下,具体可以参考 SDK 包含的 demo 工程,集成后的工程示例如下:
4.2.2 修改 build.gradle
双击打开您的工程目录下的 build.gradle
,确保已经添加了如下依赖,如下所示:
dependencies {
compile files('libs/pldroid-player-x.x.x.jar')
}
4.2.3 添加相关权限
在 app/src/main 目录中的 AndroidManifest.xml 中增加如下 uses-permission
声明
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
4.3 使用 PLVideoView 或者 PLVideoTextureView 实现媒体播放功能
PLDroidPlayer SDK 提供的 PLVideoView
类和 PLVideoTextureView
类可以快速实现带界面的播放器功能,它们的接口与 Android 官方的 VideoView
类基本保持一致,其内部封装了 PLMediaPlayer
类所提供的播放功能。
他们的使用方法基本相同,唯一的区别在于 PLVideoView
类使用了 SurfaceView
来完成视频画面的渲染,而 PLVideoTextureView
采用了 TextureView
完成视频画面的渲染 ,因此,在这里合并在一起来介绍。
4.3.1 布局
如果采用 PLVideoView
的话,布局如下:
<com.pili.pldroid.player.widget.PLVideoView
android:id="@+id/PLVideoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
如果采用 PLVideoTextureView
的话,布局如下:
<com.pili.pldroid.player.widget.PLVideoTextureView
android:id="@+id/PLVideoTextureView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
4.3.2 初始化
如果采用 PLVideoView
的话,初始化的方法如下:
PLVideoView mVideoView = (PLVideoView) findViewById(R.id.PLVideView);
如果采用 PLVideoTextureView
的话,初始化的方法如下:
PLVideoTextureView mVideoView = (PLVideoTextureView) findViewById(R.id.PLVideoTextureView);
4.3.3 关联播放控制器
Demo 里面提供了一个播放控制器示例,MediaController
,您可以随意修改满足定制化需求,将该控制器控件关联到 PLVideoView
或者 PLVideoTextureView
的方法如下:
MediaController mMediaController = new MediaController(this);
mVideoView.setMediaController(mMediaController);
4.3.4 设置加载动画
PLVideoView
和 PLVideoTextureView
提供了设置加载动画的接口,在播放器进入缓冲状态时,自动显示加载界面,缓冲结束后,自动隐藏加载界面,设置方法如下:
View loadingView = findViewById(R.id.LoadingView);
mVideoView.setBufferingIndicator(loadingView);
该 loadingView
可以是任意的 Android View 视图对象。
4.3.5 设置播放状态监听器
PLVideoView
和 PLVideoTextureView
都提供了丰富的播放状态消息回调,您可以通过 setXXXListener
接口实现各种消息状态的获取,示例如下:
public class PLVideoViewActivity extends Activity implements
PLPreparedListener,
PLOnInfoListener,
PLOnCompletionListener,
PLOnVideoSizeChangedListener,
PLOnErrorListener {
...
mVideoView.setOnPreparedListener(this);
mVideoView.setOnInfoListener(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setOnVideoSizeChangedListener(this);
mVideoView.setOnErrorListener(this);
...
关于各个消息状态的详细含义,将在 功能使用 章节详细说明。
4.3.6 设置画面预览模式
PLVideoView
和 PLVideTextureView
提供了各种画面预览模式,包括:原始尺寸、适应屏幕、全屏铺满、16:9、4:3 等,设置方法如下:
mVideoView.setDisplayAspectRatio(PLVideoView.ASPECT_RATIO_ORIGIN);
mVideoView.setDisplayAspectRatio(PLVideoView.ASPECT_RATIO_FIT_PARENT);
mVideoView.setDisplayAspectRatio(PLVideoView.ASPECT_RATIO_PAVED_PARENT);
mVideoView.setDisplayAspectRatio(PLVideoView.ASPECT_RATIO_16_9);
mVideoView.setDisplayAspectRatio(PLVideoView.ASPECT_RATIO_4_3);
4.3.7 设置画面旋转
PLVideTextureView
还支持画面旋转,支持播放画面以 0度,90度,180度,270度旋转,设置方法如下:
mVideoView.setDisplayOrientation(90); // 旋转90度
4.3.8 设置播放画面镜像变换
PLVideTextureView
还支持画面的镜像变换,设置方法如下:
mVideoView.setMirror(true);
4.3.9 设置播放地址
这是最重要的环节,在调用播放器的控制接口之前,必须先设置好播放地址。
传入播放地址,可以是 /path/to/local.mp4 本地文件绝对路径,或 HLS URL,或 RTMP URL
mVideoView.setVideoPath(videoPath);
/**
* Sets video path.
*
* @param path the path of the video.
*/
public void setVideoPath(String path)
/**
* Sets video path
* @param path path of the video
* @param headers http headers
*/
public void setVideoPath(String path, Map<String, String> headers)
4.3.10 播放控制
如果已经关联了 MediaController
,可以直接通过该控件实现播放过程的控制,包括:暂停、继续、停止等,当然,您也可以通过 PLVideoView
提供的接口自行进行播放过程的控制,相关函数如下:
mVideoView.start();
mVideoView.pause();
mVideoView.stopPlayback();
4.3.11 并排模式
一个常见的场景是多个播放器实例并排播放,PLVideoTextureView 对此场景进行了专门优化,可以通过设置 PLVideoTexureView.setSplitMode()
进行处理。目前提供 PLVideoTextureView.SPLIT_MODE_VERTICAL
与 PLVideoTextureView.SPLIT_MODE_HORIZONTAL
两种。若需要取消并排模式,则需调用 PLVideoTextureView.disableSplitMode()
。
/**
* Set split mode
* @param mode the mode
* @param preferredSplitWidth preferred width, in px
* @param preferredSplitHeight preferred height, in px
*/
public void setSplitMode(int mode, int preferredSplitWidth, int preferredSplitHeight)
/**
* Disable split mode
*/
public void disableSplitMode()
4.3.12 获取 RTMP Message Timestamp
可以通过 getRtmpAudioTimestamp
与 getRtmpVideoTimestamp
方法获取时间戳
/**
* Get video timestamp in RTMP message
* @return timestamp
*/
public long getRtmpVideoTimestamp();
/**
* Get audio timestamp in RTMP message
* @return timestamp
*/
public long getRtmpAudioTimestamp();
4.3.13 视频截图
可以通过 captureImage
方法进行视频截图,截图数据将会在 PLOnImageCapturedListener
中回调
/**
* Capture video image
* @param delayTimeMs 截取调用此方法后相应毫秒后的视频画面,仅对点播流生效
*/
public void captureImage(long delayTimeMs);
4.3.14 设置播放区域
可以通过 setVideoArea
方法,播放视频的一部分区域。若所有参数均为 0,则不裁剪画面。
/**
* Set video area
* @param topLeftX top left x
* @param topLeftY top left y
* @param bottomRightX bottom right x
* @param bottomRightY bottom right y
*/
public void setVideoArea(int topLeftX, int topLeftY, int bottomRightX, int bottomRightY);
4.3.15 设置 ZOrder 属性
可以像系统的 SurfaceView
一样设置 PLVideoView
的 ZOrder 属性,方法如下:
public void setZOrderOnTop(boolean onTop);
public void setZOrderMediaOverlay(boolean overlay);
4.3.16 暂停/恢复播放器的预缓冲
在播放点播流时,可以根据具体需求动态暂停/恢复播放器的预缓冲,方法如下:
/**
* Set buffering enabled
* @param enabled enable or not
*/
public void setBufferingEnabled(boolean enabled);
4.3.17 获取已经缓冲的长度
在播放 http 点播流时,可以获取播放器已经缓冲的 byte 数,方法如下:
/**
* Get buffered length
* @return length
*/
public BigInteger getHttpBufferSize();
4.4 使用 PLMediaPlayer 实现媒体播放功能
PLDroidPlayer SDK 提供的 PLMediaPlayer
实现了一个媒体播放器的各种基础功能和接口,与 Android 官方的 MediaPlayer
的设计基本保持一致。
4.4.1 布局
PLMediaPlayer
不是一个 View
控件,因此,如果希望用它播放视频而不是纯音频的话,则需要在布局文件中自己定义一个 SurfaceView
或者 TextureView
控件,然后将 Surface
或者 SurfaceHolder
传递给 PLMediaPlayer
,示例布局如下:
<SurfaceView
android:id="@+id/SurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
4.4.2 创建对象
PLMediaPlayer mMediaPlayer = new PLMediaPlayer(mContext);
PLMediaPlayer mMediaPlayer = new PLMediaPlayer(mContext, mAVOptions);
4.4.3 设置播放地址
mMediaPlayer.setDataSource(mVideoPath);
4.4.4 设置播放状态监听器
PLMediaPlayer
提供了丰富的播放状态消息回调,您可以通过 setXXXListener
接口实现各种消息状态的获取,示例如下:
public class PLMediaPlayerActivity extends Activity implements
PLOnPreparedListener,
PLOnInfoListener,
PLOnCompletionListener,
PLOnVideoSizeChangedListener,
PLOnErrorListener {
...
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setOnErrorListener(this);
...
关于各个消息状态的详细含义,将在 功能使用 章节详细说明。
4.4.5 配置和准备
当 SurfaceView
成功创建后,需要将 SurfaceHolder
传入PLMediaPlayer
,示例如下:
mMediaPlayer.setDisplay(mSurfaceHolder);
注意,如果是纯音频播放的话,则没有这一步。
当一切都准备就绪以后,就可以调用 prepareAsync()
开始准备播放了,该过程是异步的,因此需要首先注册一个 PLOnPreparedListener
获取准备结束的回调(如果前面已经注册过,则不用重复注册)。
mMediaPlayer.setOnPreparedListener(new PLOnPreparedListener() {
@Override
public void onPrepared(PLMediaPlayer plMediaPlayer) {
mMediaPlayer.start();
}
});
mMediaPlayer.prepareAsync();
4.4.6 播放控制
PLMediaPlayer
提供的播放控制接口如下:
mMediaPlayer.start();
mMediaPlayer.pause();
mMediaPlayer.stop();
mMediaPlayer.reset();
当播放完成,系统退出时,不要忘记调用 release
函数释放资源:
mMediaPlayer.release();
4.4.7 获取 RTMP Message Timestamp
可以通过 getRtmpAudioTimestamp
与 getRtmpVideoTimestamp
方法获取时间戳
/**
* Get video timestamp in RTMP message
* @return timestamp
*/
public long getRtmpVideoTimestamp();
/**
* Get audio timestamp in RTMP message
* @return timestamp
*/
public long getRtmpAudioTimestamp();
4.4.8 视频截图
可以通过 captureImage
方法进行视频截图,截图数据将会在 PLOnImageCapturedListener
中回调
/**
* Capture video image
* @param delayTimeMs 截取调用此方法后相应毫秒后的视频画面
*/
public void captureImage(long delayTimeMs);
4.4.9 设置播放区域
可以通过 setVideoArea
方法,播放视频的一部分区域。若所有参数均为 0,则不裁剪画面。
/**
* Set video area
* @param topLeftX top left x
* @param topLeftY top left y
* @param bottomRightX bottom right x
* @param bottomRightY bottom right y
*/
public void setVideoArea(int topLeftX, int topLeftY, int bottomRightX, int bottomRightY);
4.4.10 暂停/恢复播放器的预缓冲
在播放点播流时,可以根据具体需求动态暂停/恢复播放器的预缓冲,方法如下:
/**
* Set buffering enabled
* @param enabled enable or not
*/
public void setBufferingEnabled(boolean enabled);
4.4.11 获取已经缓冲的长度
在播放 http 点播流时,可以获取播放器已经缓冲的 byte 数,方法如下:
/**
* Get buffered length
* @return length
*/
public BigInteger getHttpBufferSize();
4.4.12 添加预缓存
在播放 http 点播流前,提前缓存头信息以及大约一个 gop 的内容,方法如下:
/**
* Add cache before play
* @param url
*/
public void addCache(String url)
4.4.13 清除预缓存
清除预缓存的内容,参数为 null 表示清理所有预缓存内容,方法如下:
/**
* Clear cache
* @param url
*/
public void delCache(String url)
4.4.14 获取请求响应信息
获取请求 http 点播流的响应信息,可以在播放开始后调用,方法如下:
/**
* Get connect response info
* @return String info
*/
public String getResponseInfo()
4.4.15 设置文件预加载预大小
设置预加载的大小,单位为 byte,默认 10 * 1024,方法如下:
/**
* Set IOCache size
* @param size
*/
public void setIOCacheSize(long size)
4.4.16 添加预加载资源
在播放 http 点播流前,提前加载部分文件的内容,方法如下:
/**
* Add IOCache before play
* @param url
*/
public void addIOCache(String url)
4.4.17 清除预加载内容
清除预加载的内容,参数为 null 表示清理所有预加载内容,方法如下:
/**
* Clear IOCache
* @param url
*/
public void delIOCache(String url)
5 功能使用
5.1 播放参数配置
PLDroidPlayer SDK 提供的 AVOptions
类,可以用来配置播放参数,例如:
AVOptions options = new AVOptions();
public final static int MEDIA_CODEC_SW_DECODE = 0;
public final static int MEDIA_CODEC_HW_DECODE = 1;
public final static int MEDIA_CODEC_AUTO = 2;
// DNS 服务器设置
// 若不设置此项,则默认使用 DNSPod 的 httpdns 服务
// 若设置为 127.0.0.1,则会使用系统的 DNS 服务器
// 若设置为其他 DNS 服务器地址,则会使用设置的服务器
options.setString(AVOptions.KEY_DNS_SERVER, server);
// DNS 缓存设置
// 若不设置此项,则每次播放未缓存的域名时都会进行 DNS 解析,并将结果缓存
// 参数为 String[],包含了要缓存 DNS 结果的域名列表
// SDK 在初始化时会解析列表中的域名,并将结果缓存
options.setStringArray(AVOptions.KEY_DOMAIN_LIST, domainList);
// 解码方式:
// codec=AVOptions.MEDIA_CODEC_HW_DECODE,硬解
// codec=AVOptions.MEDIA_CODEC_SW_DECODE, 软解
// codec=AVOptions.MEDIA_CODEC_AUTO, 硬解优先,失败后自动切换到软解
// 默认值是:MEDIA_CODEC_SW_DECODE
options.setInteger(AVOptions.KEY_MEDIACODEC, codec);
// 若设置为 1,则底层会进行一些针对直播流的优化
options.setInteger(AVOptions.KEY_LIVE_STREAMING, 1);
// 快开模式,启用后会加快该播放器实例再次打开相同协议的视频流的速度
options.setInteger(AVOptions.KEY_FAST_OPEN, 1);
// 打开重试次数,设置后若打开流地址失败,则会进行重试
options.setInteger(AVOptions.KEY_OPEN_RETRY_TIMES, 5);
// 预设置 SDK 的 log 等级, 0-4 分别为 v/d/i/w/e
options.setInteger(AVOptions.KEY_LOG_LEVEL, 2);
// 打开视频时单次 http 请求的超时时间,一次打开过程最多尝试五次
// 单位为 ms
options.setInteger(AVOptions.KEY_PREPARE_TIMEOUT, 10 * 1000);
// 默认的缓存大小,单位是 ms
// 默认值是:500
options.setInteger(AVOptions.KEY_CACHE_BUFFER_DURATION, 500);
// 最大的缓存大小,单位是 ms
// 默认值是:2000,若设置值小于 KEY_CACHE_BUFFER_DURATION 则不会生效
options.setInteger(AVOptions.KEY_MAX_CACHE_BUFFER_DURATION, 4000);
// 是否开启直播优化,1 为开启,0 为关闭。若开启,视频暂停后再次开始播放时会触发追帧机制
// 默认为 0
options.setInteger(AVOptions.KEY_LIVE_STREAMING);
// 设置拖动模式,1 位精准模式,即会拖动到时间戳的那一秒;0 为普通模式,会拖动到时间戳最近的关键帧。默认为 0
options.setInteger(AVOptions.KEY_SEEK_MODE);
// 设置 HLS DRM 密钥
byte[] key = {0x##, 0x##, 0x##, 0x##, 0x##, ……};
options.setByteArray(AVOptions.KEY_DRM_KEY, key);
// 设置 MP4 DRM 密钥
String key = "AbcDefgh";
options.setString(AVOptions.KEY_COMP_DRM_KEY, key);
// 设置偏好的视频格式,设置后会加快对应格式视频流的打开速度,但播放其他格式会出错
// m3u8 = 1, mp4 = 2, flv = 3
options.setInteger(AVOptions.KEY_PREFER_FORMAT, 1);
// 开启解码后的视频数据回调
// 默认值为 0,设置为 1 则开启
options.setInteger(AVOptions.KEY_VIDEO_DATA_CALLBACK, 1);
// 开启解码后的音频数据回调
// 默认值为 0,设置为 1 则开启
options.setInteger(AVOptions.KEY_VIDEO_DATA_CALLBACK, 1);
// 设置开始播放位置
// 默认不开启,单位为 ms
options.setInteger(AVOptions.KEY_START_POSITION, 10 * 1000);
// 请在开始播放之前配置
mVideoView.setAVOptions(options);
5.2 播放状态回调
PLDroidPlayer SDK 提供的所有状态监听接口,状态、错误的常量,均定义在 PLMediaPlayer
类中。
5.2.1 PLOnPreparedListener
/**
* Called when the media file is ready for playback.
*
* @param preparedTime prepared time: ms
*/
public interface PLOnPreparedListener {
void onPrepared(int preparedTime);
}
该对象用于监听播放器的 prepare
过程,该过程主要包括:创建资源、建立连接、请求码流等等,当 prepare
完成后,SDK 会回调该对象的 onPrepared
接口,下一步则可以调用播放器的 start()
启动播放。
5.2.2 PLOnInfoListener
public interface PLOnInfoListener {
void onInfo(int what, int extra);
}
what
定义了消息类型,extra
是附加参数
what | value | 描述 |
---|---|---|
MEDIA_INFO_UNKNOWN | 1 | 未知消息 |
MEDIA_INFO_VIDEO_RENDERING_START | 3 | 第一帧视频已成功渲染 |
MEDIA_INFO_CONNECTED | 200 | 连接成功 |
MEDIA_INFO_METADATA | 340 | 读取到 metadata 信息 |
MEDIA_INFO_BUFFERING_START | 701 | 开始缓冲 |
MEDIA_INFO_BUFFERING_END | 702 | 停止缓冲 |
MEDIA_INFO_SWITCHING_SW_DECODE | 802 | 硬解失败,自动切换软解 |
MEDIA_INFO_CACHE_DOWN | 901 | 预加载完成 |
MEDIA_INFO_LOOP_DONE | 8088 | loop 中的一次播放完成 |
MEDIA_INFO_VIDEO_ROTATION_CHANGED | 10001 | 获取到视频的播放角度 |
MEDIA_INFO_AUDIO_RENDERING_START | 10002 | 第一帧音频已成功播放 |
MEDIA_INFO_VIDEO_GOP_TIME | 10003 | 获取视频的I帧间隔 |
MEDIA_INFO_VIDEO_BITRATE | 20001 | 视频的码率统计结果 |
MEDIA_INFO_VIDEO_FPS | 20002 | 视频的帧率统计结果 |
MEDIA_INFO_AUDIO_BITRATE | 20003 | 音频的帧率统计结果 |
MEDIA_INFO_AUDIO_FPS | 20004 | 音频的帧率统计结果 |
MEDIA_INFO_VIDEO_FRAME_RENDERING | 10004 | 视频帧的时间戳 |
MEDIA_INFO_AUDIO_FRAME_RENDERING | 10005 | 音频帧的时间戳 |
MEDIA_INFO_CACHED_COMPLETE | 1345 | 离线缓存的部分播放完成 |
MEDIA_INFO_IS_SEEKING | 565 | 上一次 seekTo 操作尚未完成 |
该对象用于监听播放器的状态消息,在播放器启动后,SDK 会在播放器发生状态变化时调用该对象的 onInfo
方法,同步状态信息。
5.2.3 PLOnCompletionListener
public interface PLOnCompletionListener {
void onCompletion();
}
该对象用于监听播放结束的消息,关于该回调的时机,有如下定义:
- 如果是播放文件,则是播放到文件结束后产生回调
- 如果是在线视频,则会在读取到码流的
EOF
信息后产生回调,回调前会先播放完已缓冲的数据 - 如果播放过程中产生
onError
,并且没有处理的话,最后也会回调本接口 - 如果播放前设置了
setLooping(true)
,则播放结束后会自动重新开始,不会回调本接口 - 如果同时将
AVOptions.KEY_FAST_OPEN
与AVOptions.KEY_SEEK_MODE
设置为 1,并且希望在收到本接口后播放同一个视频,需要在start
后手动调用seekTo(0)
5.2.4 PLOnErrorListener
public interface PLOnErrorListener {
boolean onError(int errorCode);
}
errorCode | value | 描述 |
---|---|---|
MEDIA_ERROR_UNKNOWN | -1 | 未知错误 |
ERROR_CODE_OPEN_FAILED | -2 | 播放器打开失败 |
ERROR_CODE_IO_ERROR | -3 | 网络异常 |
ERROR_CODE_SEEK_FAILED | -4 | 拖动失败 |
ERROR_CODE_CACHE_FAILED | -5 | 预加载失败 |
ERROR_CODE_HW_DECODE_FAILURE | -2003 | 硬解失败 |
ERROR_CODE_PLAYER_DESTROYED | -2008 | 播放器已被销毁,需要再次 setVideoURL 或 prepareAsync |
ERROR_CODE_PLAYER_VERSION_NOT_MATCH | -9527 | so 库版本不匹配,需要升级 |
ERROR_CODE_PLAYER_CREATE_AUDIO_FAILED | -4410 | AudioTrack 初始化失败,可能无法播放音频 |
5.2.5 PLOnBufferingUpdateListener
public interface PLOnBufferingUpdateListener {
void onBufferingUpdate(int percent);
}
该回调用于监听当前播放器已经缓冲的数据量占整个视频时长的百分比,在播放直播流中无效,仅在播放文件和回放时才有效。
5.2.6 PLOnVideoSizeChangedListener
public interface PLOnVideoSizeChangedListener {
void onVideoSizeChanged(int width, int height);
}
该回调用于监听当前播放的视频流的尺寸信息,在 SDK 解析出视频的尺寸信息后,会触发该回调,开发者可以在该回调中调整 UI 的视图尺寸。
5.2.7 PLOnSeekCompleteListener
public interface PLOnSeekCompleteListener {
void onSeekComplete();
}
该回调用于监听 seek
完成的消息,当调用的播放器的 seekTo
方法后,SDK 会在 seek
成功后触发该回调。
5.2.8 PLOnImageCapturedListener
public interface PLOnImageCapturedListener {
/**
* On image captured
* @param data 编码后的 jpeg 截图数据
*/
void onImageCaptured(byte[] data);
}
该回调用于监听 captureImage
完成的消息,当调用播放器的 captureImage
方法后,SDK 会在相应内容截取完成后触发该回调。data 参数为编码后的 jpeg 图像数据,可以直接保存为 jpeg 文件。
5.3 连接状态处理
5.3.1 如何判断直播结束
对于直播应用而言,播放器本身是无法判断直播是否结束,这需要通过业务服务器来告知。当主播端停止推流后,播放器会因为读取不到新的数据而产生超时,从而触发 ERROR_CODE_IO_ERROR
回调。
建议的处理方式是:在 ERROR_CODE_IO_ERROR
回调后,查询业务服务器,获知直播是否结束,如果已经结束,则关闭播放器,清理资源;如果直播没有结束,则等待 SDK
内部自动做重连。
建议收到 ERROR_CODE_IO_ERROR
之后,使用如下方法判断一下网络的联通性,如果用户的网络已断,则可以退出播放。
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
记得添加如下权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
5.3.2 网络异常的处理
如果申请的直播并没有在推流,或者直播过程中发生网络错误(比如:WiFi 断开),播放器在请求超时或者播放完当前缓冲区中的数据后,会触发 onError
回调,errorCode
通常是 ERROR_CODE_IO_ERROR
,触发 ERROR_CODE_IO_ERROR
消息后,SDK 内部会自动重连,这种情况下,App 层面通常可以做如下判断来考虑是否需要退出播放:
- 查询业务服务器,获知直播是否结束,如果已经结束,则可以退出播放
- 判断网络是否断开,如果已经断网,则可以提出播放
5.4 播放器声音调节
如果期望调节播放器的音量,接口如下所示:
public void setVolume(float leftVolume, float rightVolume);
若参数为 0f,则会将视频静音;若参数大于 1f,播放音量会大于视频原来的音量。
5.5 DNS 解析优化
为了解决部分地区和某些网络条件下 DNS 解析过慢,导致播放首开时间过长的问题,从 1.3.0
版本开始,支持提前完成 DNS 解析,功能描述如下:
5.5.1 播放地址
从 1.3.0
版本开始,支持传入带 IP 地址的播放 URL,URL 的格式为:protocol://ip/path?domain=xxxx.com
目前支持的协议为:RTMP、HDL,暂时不支持 HLS 协议。
5.5.2 DNS 缓存管理服务
传入的播放地址:protocol://domain/path
转换后的播放地址:protocol://ip/path?domain=xxxx.com
PLNetworkManager
类的使用方法描述如下:
- 添加 happydns 的依赖
dependencies {
compile 'com.qiniu:happy-dns:0.2.+'
}
- 添加网络状态监测的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 启动 DNS 缓存管理服务
public void startDnsCacheService(Context context);
public void startDnsCacheService(Context context, String[] domainList);
提前传入待解析的域名列表会在第一次播放时得到更好的体验,不提前传入也没有问题,每次播放前,DNS 缓存服务会自动缓存播放域名。
- 停止 DNS 缓存管理服务
public void stopDnsCacheService(Context context);
- 使用自己的 DNS 解析服务器
PLNetworkManager
类默认使用了 “119.29.29.29” 服务器完成域名解析,当然,你也可以配置为自己的域名服务器,接口如下:
public void setDnsServer(String server);
- 使用自己的 DNSManager 对象
你也可以传入自己的 DNSManager 对象,接口如下:
public void setDnsManager(DNSManager manager);
- DNS 缓存更新时间间隔
PLNetworkManager
类默认的DNS缓存更新时间间隔是 100 秒,内部会根据域名服务器返回的 TTL 来判断是否需要向服务器发起一次查询请求,一般的域名服务器的 TTL 是 600 秒,建议这个更新时间间隔不要超过 600 秒,配置接口如下:
public void setDnsCacheUpdateInterval(int milliseconds);
5.6 设置播放封面
在开始播放前,PLVideoView、PLVideoTextureView 可以显示封面图片,设置接口如下:
public void setCoverView(View coverView);
5.7 获取播放器当前状态
在播放过程中,用户可以调用接口,获取播放器当前状态,接口如下:
public PlayerState getPlayerState();
5.8 获取 METADATA 信息
在播放过程中,用户可以调用接口,获取当前播放流的 METADATA 信息,接口如下:
public HashMap<String, String> getMetadata();
5.9 获取实时统计信息
public int getVideoFps();
public long getVideoBitrate();
public int getAudioBitrate();
public int getAudioFps();
5.10 倍数播放
/**
* 设置倍数播放
* @param speed 倍数值,16 进制表示,高 4 位代表分子,低 4 位代表分母
* 例如:0X00010002 表示 0.5 倍数,0X00040001 表示 4 倍数
* 范围:0.1~32 倍数
*/
public boolean setPlaySpeed(int speed);
/**
* 设置倍数播放
* @param speed 倍数值,0.1 - 32
*/
public boolean setPlaySpeed(float speed);
5.11 本地缓存功能
本地缓存功能,目前只支持 HTTP(s)-mp4 文件点播,开启本地缓存功能,只需要在播放前,配置缓存目录即可
// 设置本地缓存目录
// 目前只支持 mp4 点播
// 默认值是:无
options.setString(AVOptions.KEY_CACHE_DIR, dir);
// 设置本地缓存文件的后缀名
// 只有在设置了缓存目录后才会生效
// 一个流地址在设置了自定义后缀名后,再次播放前必须设置相同的后缀名,否则无法打开
// 默认值是 mp4
options.setString(AVOptions.KEY_CACHE_EXT, ext);
开启本地缓存功能后,拖动过程中遇到缓存过的数据,可以不用再次下载,从而节省了带宽和流量。当整个文件都缓存完毕后,则可以支持在离线状态下播放了。
5.12 音视频数据回调
播放支持将解码后的音视频数据回调出来,相关接口如下所述:
/**
* 获取视频数据回调的对象
*/
public interface PLOnVideoFrameListener {
/**
* 回调一帧视频帧数据
*
* @param data 视频帧数据
* @param size 数据大小
* @param width 视频帧的宽
* @param height 视频帧的高
* @param format 视频帧的格式,0代表 YUV420P,1 代表 JPEG, 2 代表 SEI
* @param ts 时间戳,单位是毫秒
*/
void onVideoFrameAvailable(byte[] data, int size, int width, int height, int format, long ts);
}
/**
* 获取音频数据回调的对象
*/
public interface PLOnAudioFrameListener {
/**
* 回调一帧音频帧数据
*
* @param data 音频帧数据
* @param size 数据大小
* @param samplerate 采样率
* @param channels 通道数
* @param datawidth 位宽,目前默认转换为了16bit位宽
* @param ts 时间戳,单位是毫秒
*/
void onAudioFrameAvailable(byte[] data, int size, int samplerate, int channels, int datawidth, long ts);
}
如何开启音视频数据回调 ?
- 配置 AVOption,开启音视频数据回调
// 开启解码后的视频数据回调
// 默认值为 0,设置为 1 则开启
options.setInteger(AVOptions.KEY_VIDEO_DATA_CALLBACK, 1);
// 开启解码后的音频数据回调
// 默认值为 0,设置为 1 则开启
options.setInteger(AVOptions.KEY_AUDIO_DATA_CALLBACK, 1);
- 设置音视频数据回调的监听对象
mVideoView.setOnVideoFrameListener(new PLOnVideoFrameListener() {
@Override
public void onVideoFrameAvailable(byte[] data, int size, int width, int height, int format, long ts) {
Log.i(TAG, "onVideoFrameAvailable: " + size + ", " + width + " x " + height + ", i420, " + ts);
}
});
mVideoView.setOnAudioFrameListener(new PLOnAudioFrameListener() {
@Override
public void onAudioFrameAvailable(byte[] data, int size, int samplerate, int channels, int datawidth, long ts) {
Log.i(TAG, "onAudioFrameAvailable: " + size + ", " + samplerate + ", " + channels + ", " + datawidth + ", " + ts);
}
});
5.13 自定义音视频渲染
在开启 ##5.12 音视频数据回调 的基础上,再开启如下配置,即可关闭 SDK 内部的视频渲染和音频播放
// 开启自定义视频数据渲染
// 默认值是:0,由 SDK 内部渲染视频
options.setInteger(AVOptions.KEY_VIDEO_RENDER_EXTERNAL, 1);
// 开启自定义音频数据播放
// 默认值是:0,由 SDK 内部播放音频
options.setInteger(AVOptions.KEY_AUDIO_RENDER_EXTERNAL, 1);
5.14 设置日志等级
可以在创建播放器时通过 AVOptions.KEY_LOG_LEVEL
设置,参数 0-4 分别为 v/d/i/w/e,若希望完全去除日志打印,则可设置大于 4 的整数;-1 为本地日志,dump 到 /sdcard/core.txt。
6 API查询
7 历史记录
-
2.2.0(Release Notes)
- 发布 pldroid-player-2.2.0.jar
- 更新 libQPlayer.so
- 修复了 SEI 几率性回调异常问题
- 修复了弱网时 seek 有几率出现 ANR 异常
- 更新 ffmpeg 版本到 3.3.2
-
2.1.9(Release Notes)
- 发布 pldroid-player-2.1.9.jar
- 更新 libQPlayer.so
- 新增 KEY_SDK_ID 的 AVOptions 设置
- 修复了 seek failed 后控件不显示的异常
- 修复了 Android Q 及部分场景 ssl handshake 异常
-
2.1.8(Release Notes)
- 发布 pldroid-player-2.1.8.jar
- 更新 libQPlayer.so
- 优化了部分 FLV 流播放流畅度
- 修复了部分场景的空指针异常
-
2.1.7(Release Notes)
- 发布 pldroid-player-2.1.7.jar
- 更新 libQPlayer.so
- 优化了配置缓存时的播放流畅性
- 优化了 HTTPS 连接速度
- 优化了 RMTP 重连速度
- 优化了切换 URL 时停止的耗时
- 新增了对七牛私有 MP4 DRM 解密播放
- 新增了对 G711 格式支持
- 新增了在暂停时截图特性
- 修复了播放纯视频 HLS 循环、速度不均匀异常
- 修复部分弱网、重连时 ANR
- 修复了播放部分 FMP4 的异常
-
2.1.6(Release Notes)
- 发布 pldroid-player-2.1.6.jar
- 更新 libQPlayer.so
- 优化了部分 HLS 播放流畅度
- 优化了重连速度
- 新增了 addCache、delCache 方法
- 新增了 setIOCacheSize、addIOCache、delIOCache 方法
- 新增了本地日志功能
- 修复了部分场景下播放状态异常
- 修复了播放时释放时偶现 ANR
- 修复 HLS 文件解析异常
- 修复了部分场景下空指针、空对象异常
-
2.1.5(Release Notes)
- 发布 pldroid-player-2.1.5.jar
- 合并 libQPlayer.so、libqcCodec.so 为 libQPlayer.so
- 优化了视频首帧的打开速度
- 优化了音频开始时间不为0的播放逻辑
- 取消了直播流时的变速播放
- 新增 KEY_MP4_PRELOAD 的 AVOptions 设置
- 新增了 getResponseInfo 方法
- 修复弱网时重复打开的崩溃
- 修复 m4a 不能播放
- 修复 mp4 缓存失败
- 修复了多个播放实例场景下的偶现崩溃
- 修复了 dns 解析造成的崩溃
- 修复了播放时释放时偶现 ANR
- 修复音画不同步问题
- 修复纯音频循环播放问题
- 修复 HLS 文件解析异常
-
2.1.4(Release Notes)
- 发布 pldroid-player-2.1.4.jar
- 更新 libQPlayer.so
- 优化了 mp4 长视频的打开速度
- 新增 KEY_START_POSITION 的 AVOptions 设置
- 添加了对 ffconcat 文件格式的支持
- 修复了设置
AVOptions.KEY_LIVE_STREAMING
后,暂停状态下切换播放地址画面不刷新的问题 - 修复了部分停止时造成的 ANR 问题
- 修复了 PLOnInfoListener 的 MEDIA_INFO_LOOP_DONE 回调不生效的问题
- 修复了部分 seek 无效的问题
- 修复了部分 HLS 文件音画不同步的问题
- 修复了偶现网络状态改变造成的 ANR 问题
-
2.1.3(Release Notes)
- 发布 pldroid-player-2.1.3.jar
- 更新 libQPlayer.so
- 修复了快速开始和停止会造成的 ANR 问题
- 修复了 Video Only 视频无法播放的问题
- 修复了循环播放时,某些视频结束时画面暂停,声音继续播放的问题
- 修复了软解下,某些 HTTP 视频偶现无法循环播放的问题
-
2.1.2(Release Notes)
- 发布 pldroid-player-2.1.2.jar
- 更新 libQPlayer.so
- 更新 libqcCodec.so
- 新增
setBufferingEnabled
方法 - 新增
getHttpBufferSize
方法 - 修复了特殊情况下的 ANR 问题
- 修复了一些情况下的空指针问题
- 修复了在
OnCompletionListener
中调用start
方法不生效的问题 - 修复了一些情况下视频封面不刷新的问题
- 修复了音频采样率较低时音画不同步的问题
- 移除
PLMediaPlayer.getMediaCodec
方法,可以在业务层记录设置的是硬解还是软解 - 移除
PLMediaPlayer.reset
方法,请用release
方法代替
-
2.1.1(Release Notes)
- 发布 pldroid-player-2.1.1.jar
- 更新 libQPlayer.so
PLVideoView
新增setZOrderOnTop
方法PLVideoView
新增setZOrderMediaOverlay
方法- 修复部分点播视频加载过慢的问题
- 修复了销毁播放器后的内存泄漏问题
- 修复 8.0+ 系统上播放 HLS 流时销毁播放器的 crash 问题
- 修复部分 HLS 流打开失败的问题
- 修复部分 HLS 流退出时 ANR 的问题
- 修复一些情况下
PLOnBufferingUpdateListener
可能不准确的问题
-
2.1.0(Release Notes)
- 发布 pldroid-player-2.1.0.jar
- 更新 libQPlayer.so
- 更新 libqcCodec.so
- 更新 libqcOpenSSL.so
- 新增
captureImage
方法 - 新增
setVideoArea
方法 - 新增
PLOnImageCapturedListener
接口 - 新增
setVolume
参数大于 1.0 时增大音量的功能 - 新增
setPlaySpeed(float)
方法 - 新增
AVOptions.KEY_FAST_OPEN
字段 - 新增
AVOptions.KEY_SEEK_MODE
字段 - 新增
AVOptions.KEY_CACHE_EXT
字段 - 新增
AVOptions.KEY_OPEN_RETRY_TIMES
字段 - 新增
PLOnInfoListener.MEDIA_INFO_CACHED_COMPLETE
字段 - 新增
PLOnInfoListener.MEDIA_INFO_IS_SEEKING
字段 - 新增
PLMediaPlayer.ERROR_CODE_PLAYER_CREATE_AUDIO_FAILED
字段 - 修复
PLVideoTextureView
复用时可能 crash 的问题 - 修复
PLVideoTextureView
部分场景下画面不刷新的问题 - 修复部分场合下自动断网重连失效的问题
- 修复开启离线缓存后断网时无法继续播放的问题
- 修复部分设备上后台播放音频卡顿的问题
- 修复循环播放时 buffer 时间较长的问题
- 修复播放部分 http-flv 格式时 crash 的问题
- 修复播放部分带有跳转的 URL 时crash 的问题
- 修复倍速播放时音调不正常的问题
- 修复播放本地文件时调用
seekTo
仍会出现 buffering 回调的问题 - 修复部分场景下
seekTo
不生效的问题 - 修复部分流中 SAR 与 DAR 字段不生效的问题
- 修复 SEI 数据回调为 0 的问题
- SDK 所有公开方法的参数名不再混淆,可以直接通过 IDE 查看
- 所有 Listener 类与相关常量从
PLMediaPlayer
下调整为单独的接口,并添加 PL 前缀 - 所有 Listener 类的回调方法中的
PLMediaPlayer
参数均被移除 PLOnInfoListener.onInfo
方法返回类型由boolean
修改为void
- 在一次
seekTo
未完成时进行下一次seekTo
,SDK 的回调由PLOnErrorListener.ERROR_SEEK_FAILED
更改为PLOnInfoListener.MEDIA_INFO_IS_SEEKING
,不会修改PlayerState
的状态 PLNetworkManager
类被移除,请删除应用层的相关调用,并移除 happydns 的依赖。如需管理 DNS 缓存或自定义 DNS 服务器,请通过AVOptions.KEY_DOMAIN_LIST
与AVOptions.KEY_DNS_SERVER
进行设置- 移除
setDebugLoggingEnabled
方法,日志选项统一通过AVOptions.KEY_LOG_LEVEL
控制
-
2.0.6(Release Notes)
- 发布 pldroid-player-2.0.6.jar
- 修复了一些场合下 MP4 离线缓存失效的问题
- 修复了部分设备在移动 4G 网络下偶现的崩溃问题
-
2.0.5(Release Notes)
- 发布 pldroid-player-2.0.5.jar
- 更新 libQPlayer.so
- 新增
AVOptions.KEY_DNS_SERVER
字段 - 新增
AVOptions.KEY_DOMAIN_LIST
字段 - 新增视频 header 中 rotate 字段的支持,SDK 会自动旋转画面
- 修复了部分视频音画不同步的问题
- 修复了部分视频开播时闪屏的问题
- 修复了部分视频循环播放时进度异常的问题
- 修复了部分 mp3 流打开失败的问题
- 修复了部分场合下
OnCompletionListener
不触发的问题 - 修复了部分场合下销毁播放器时 crash 的问题
- 修复了部分场合下快速切换播放地址时 crash 的问题
- 修复了连续调用
stopPlayback
时可能 crash 的问题 - 修复了动态添加的
PLVideoTextureView
的setDisplayOrientation
不生效的问题
-
2.0.4(Release Notes)
- 发布 pldroid-player-2.0.4.jar
- 更新 libQPlayer.so
- 新增
AVOptions.KEY_LOG_LEVEL
字段 - 新增
PLMediaPlayer.MEDIA_INFO_LOOP_DONE
字段 - 新增
getRtmpVideoTimestamp
与getRtmpAudioTimestamp
方法 - 修复了一些情况下开启
PLNetowrkManager.startDnsCacheService
后无法播放的问题 - 修复了一些设备上无法加载
libqcCodec.so
的问题 - 修复了播放一些 flv 直播流时卡顿的问题
- 修复了一些情况下循环播放时卡顿的问题
- 修复了一些情况下
PLVideoTextureView
画面不刷新的问题 - 修复了一些情况下不会收到
OnSeekComplete
的问题 - 修复了一些情况下出现
ERROR_CODE_SEEK_FAILED
的问题 - 修复了一些情况下开启
PLVideoTextureView.setSplitMode
后 view 尺寸错误的问题 - 修复了播放地址过长时离线缓存失败的问题
- 修复了播放完成后时间可能继续增长的问题
- 修复了
setDebuggingLogEnabled
为false
时仍会产生大量 log 的问题
-
2.0.3(Release Notes)
- 发布 pldroid-player-2.0.3.jar
- 更新 libopenssl.so,更名为 libqcopenssl.so
- 更新 libQPlayer.so
- 新增
PLVideoTextureView.setSplitMode
方法 - 新增
AVOptions.KEY_LIVE_STREAMING
字段 - 新增
PlayerState.PLAYING_CACHE
字段 - 新增
ERROR_CODE_PLAYER_DESTROYED
错误码 - 新增
ERROR_CODE_PLAYER_VERSION_NOT_MATCH
错误码 - 新增
PLNetworkManager.setDnsManager
方法 - 彻底修复一些场景下切换播放地址时的 crash 问题
- 彻底修复一些场景下销毁播放器时的 crash 问题
- 修复了 libopenssl 版本过低引发的问题
- 修复了
PLVideoTextureView
播放直播流时暂停后可能不会追帧的问题 - 修复了一些场景下画面不刷新的问题
- 修复了部分纯视频 mp4 无法循环播放的问题
- 修复了切换播放地址后,之前的
setVolume
没有继续生效的问题 - 修复了部分 hls 流拖动时卡住的问题
- 修复了部分 mp4 流循环播放时可能出现多次 COMPLETE 消息的问题
- 修复了
OnBufferingUpdate
回调在一些情况下不会出现 100% 或大于 100% 的问题 - 修复了断网后部分视频进度异常的问题
- 修复了部分视频流与音频流的兼容性问题
- 修复了
PLVideoView
与PLVideoTextureView
被remove
然后重新add
后黑屏的问题
-
2.0.2(Release Notes)
- 发布 pldroid-player-2.0.2.jar
- 更新 libQPlayer.so
- 发布 libopenssl.so
- 修复了
setVolume
导致静音的问题 - 修复了频繁切换播放地址时可能 crash 的问题
- 修复了销毁播放器时可能 crash 的问题
- 修复了播放 m3u8 视频流断网时
IO_ERROR
回调过于频繁的问题 - 修复了
AVOptions
为空时可能 crash 的问题 - 修复了部分 mp3 音频播放时可能 crash 的问题
- 修复了播放中再次
setSurface
时可能 crash 的问题 - 修复了 7.0 以上系统部分机型缺失
openssl
的问题 - 修复了
setDisplayAspectRatio
参数为ASPECT_RATION_ORIGIN
时画面不渲染的问题 - 修复了视频播放完毕后
MediaController
中时间戳继续增长的问题 - 修复了一些场景下设置 HTTP 头不生效的问题
- 修复了播放一些 m3u8 流时画面不连续的问题
- 修复了播放离线缓存内容时提前回调
onCompletion
的问题 - 修复了播放百度直播云视频流的兼容性问题
-
2.0.1(Release Notes)
- 发布 pldroid-player-2.0.1.jar
- 更新 libQPlayer.so
- 新增 SEI 数据帧回调
AVOptions
中新增PREFER_FORMAT
字段- 修复
pause
后getPlayState
状态不对的问题 - 修复
setVolume
在部分场合下不生效的问题 - 修复
setLooping
不生效的问题 - 修复
OnInfoListener
视频旋转角度缺失的问题 - 修复设置 HTTP 头无效的问题
- 修复部分视频流无法播放的问题
- 修复部分视频 seek 出错的问题
- 修复网络变化时可能 crash 的问题
- 修复倍数播放没有声音的问题
- 修复了部分由断网重连引发的问题
-
2.0.0 (Release Notes)
- 发布 pldroid-player-2.0.0.jar
- 发布 libQPlayer.so
- 发布 libqcCodec.so
- 删除 pldroidplayer.so
- 新增倍数播放功能(0.5x,1x,2x,4x 等)
- 新增 mp4 本地缓存功能
- 新增音视频解码数据回调
- 新增自定义音视频播放和渲染
- 新增 HLS 七牛私有 DRM 的支持
- 新增 H.265 格式播放的支持
- 优化 CPU、内存和功耗
- 优化首开效果,首开速度有大幅提升
- 优化包体大小,jar 包和 so 体积均有显著减小
- 优化重连逻辑,不用销毁播放器,网络断开后内部自动重连
- 优化 mp4 点播,使用双 IO 技术更高效地播放 moov 在尾部的 mp4 文件
- 支持播放过程中变速不变调,可实现更平滑的追帧效果,更少的卡顿率
-
1.6.0 (Release Notes)
- 发布 pldroid-player-1.6.0.jar
- 更新 libpldroidplayer.so
- 新增音视频播放时间戳回调
MEDIA_INFO_VIDEO_RENDERING_START
消息的extra
参数附带首帧时间MEDIA_INFO_AUDIO_RENDERING_START
消息的extra
参数附带首帧时间OnPreparedListener
消息的onPrepared
接口增加preparedTime
时间- 新增 setVideoUri(Uri uri, Map<String, String> headers) 接口,支持自定义消息头
-
1.5.1 (Release Notes)
- 发布 pldroid-player-1.5.1.jar
- 修复部分机型网络切换时产生的崩溃问题
- 修复码流分辨率改变导致的硬解花屏问题
-
1.5.0 (Release Notes)
- 发布 pldroid-player-1.5.0.jar
- 更新 libpldroidplayer.so
- 新增获取 GOP Time 的消息回调
- 新增获取实时帧率、码率的接口
- 修复了播放过程中切换前后台出现的频繁缓冲问题
- 修复使用 PLVideoTextureView 硬解从后台切换前台花屏的问题
-
1.4.1 (Release Notes)
- 发布 pldroid-player-1.4.1.jar
- 更新 libpldroidplayer.so
- 新增软硬解自动切换功能
- 新增
getMetadata()
接口 - 新增 HTTPS 协议、speex 解码、mp4v 解码支持
- 新增直播卡顿的消息回调
- 新增 “probesize” 配置选项
-
1.4.0 (Release Notes)
- 发布 pldroid-player-1.4.0.jar
- 更新 libpldroidplayer.so
- 新增
setCoverView(View coverView)
接口 - 新增
getPlayerState()
接口 - 修复了多次打开、关闭播放器出现 ANR 的问题
- 修复了播放地址含有多个 domain 时解析异常的问题
-
1.3.2 (Release Notes)
- 发布 pldroid-player-1.3.2.jar
- 修复了部分场景下直接使用 PLMediaPlayer 播放出现的崩溃问题
-
1.3.1 (Release Notes)
- 发布 pldroid-player-1.3.1.jar
- 更新 libpldroidplayer.so
- 添加了 QoS 功能
- 优化了纯音频播放的累积延时
- 修复了在部分场景下频繁重连导致的崩溃问题
- 修复了 DNS 解析优化在某些机型上出现崩溃的问题
- 修复了当服务端主动断开 TCP 连接,客户端没重连的问题
- 修复了 x86_64 架构下找不到动态库导致的崩溃问题
- 更新了 demo 代码,演示了如何进行重连
-
1.3.0 (Release Notes)
- 发布 pldroid-player-1.3.0.jar
- 更新 libpldroidplayer.so
- 优化直播累积延时
- 优化首开时间
- 优化播放器退出耗时较长
- 支持带 IP 地址的播放 URL
- 新增 PLNetworkManager 类,提供 DNS 缓存管理服务
- 新增 AVOptions 累积延时相关的配置参数
- 新增多种新的回调信息,方便更准确地感知播放过程中的状态变化
- 修复动态构建 PLVideoTextureView 导致崩溃的问题
- 修复 onError 回调 extra 为 0 的情况
- 修复了部分码流的时长解析不准确的问题
- 修复点播缓冲过程中,断网操作导致长时间无法恢复的问题
- 修复特殊网络情况下,退出播放器时的 ANR 问题
-
1.2.3 (Release Notes)
- 发布 pldroid-player-1.2.3.jar
- 更新 libpldroidplayer.so
- 支持后台播放
- 优化点播的首开时间
- 优化直播过程中的累积延时
- 新增
setWakeMode
和setScreenOnWhilePlaying
接口 - 新增
setLooping
和isLooping
接口 AVOption
添加prepare timeout
超时的配置- 修改
seekTo
的参数,类型改为long
型 - 解决播放部分纯音频流的时候,获取不到时长的问题
- 解决从后台切换回来后,播放从头开始加载的问题
- 修复
AudioManager
可能导致的内存泄漏问题
-
1.2.2 (Release Notes)
- 发布 pldroid-player-1.2.2.jar
AVOptions
新增KEY_START_ON_PREPARED
参数,便于配置是否自动开始播放PLVideoTextureView
新增setMirror
接口,可实现画面镜像变换- 新增
setVolume
接口,可实现播放器音量的设置,或静音功能
-
1.2.1 (Release Notes)
- 发布 pldroid-player-1.2.1.jar
- 恢复
SharedLibraryNameHelper.renameSharedLibrary
接口 - 恢复
SharedLibraryNameHelper.getSharedLibraryName
接口
-
1.2.0 (Release Notes)
- 发布 pldroid-player-1.2.0.jar
- 删除了 ijkmediaplayer.jar
- 实现播放器秒开优化,网络条件好的情况下,可以实现秒开
- 新增播放器核心类
PLMediaPlayer
- 新增
PLVideoView
控件 - 新增
PLVideoTextureView
控件 - 支持多种画面预览模式,包括:原始尺寸、适应屏幕、全屏铺满、16:9、4:3 等
- 支持画面旋转(0度,90度,180度,270度)
- 更新 Demo 程序,演示所有新增的接口类
-
1.1.4 (Release Notes)
- 发布 pldroid-player-1.1.4.jar
- 更新 libpldroidplayer.so
- 新增播放器全屏播放支持
- 新增纯音频播放
AVOptions
支持 - 修复播放过程中,概率性异常地回调
onCompletion
问题 VideoView
布局的展示代码
-
1.1.3 (Release Notes)
- 发布 pldroid-player-1.1.3.jar
- 更新 libpldroidplayer.so
- 新增 ARM, X86 支持
- 新增
KEY_LIVE_STREAMING
option - 修复
getCurrentPosition
和getDuration
返回值异常问题 - 修复播放过程中,概率性不间断地回调 onCompletion 问题
- 更新不同播放方式(直播或点播)设置 option 的展示代码
-
1.1.2 (Release Notes)
- 发布 pldroid-player-1.1.2.jar
- 更新 arm64-v8a/libpldroidplayer.so,armeabi-v7a/libpldroidplayer.so
- 修复推流端断流后,Player 概率性地无
onCompletion
回调通知 - 修复
AVOptions
的 key 没有设置 value 时候的 Crash 问题
-
1.1.1 (Release Notes)
- 发布 pldroid-player-1.1.1.jar
- 发布 arm64-v8a/libpldroidplayer.so,增加 ARM64v8a 支持
- 更新 ARMv7a 版本的 libpldroidplayer.so
- 增加
AVOptions
类,可设置如下属性:AVOptions.KEY_GET_AV_FRAME_TIMEOUT
// msAVOptions.KEY_MEDIACODEC
// 1 means enable, 0 means disableAVOptions.KEY_FFLAGS
// “nobuffer”AVOptions.KEY_BUFFER_TIME
// ms
- 修复部分音视频流无法播放的问题
- 修复仅含视频流无法播放的问题
- 优化连接时间
- 废除
setBufferTime(float ms)
接口,使用AVOptions
代替 - 增加
AVOptions
的演示代码
-
1.1.0 (Release Notes)
- 发布 pldroid-player-1.1.0.jar
- 更新 ijkmediaplayer.jar
- 更新 libpldroidplayer.so
- 添加纯音频播放接口,支持后台运行
- 添加 bufferTime 设置接口:
setBufferTime(float ms)
- 添加状态码:
EXTRA_CODE_CONNECTION_REFUSED
和EXTRA_CODE_EOF
- 优化播放延时
- 优化播放过程中因断流导致的等待时间
- 修复部分机型硬解码异常问题
- 添加纯音频播放展示界面
-
1.0.0 (Release Notes)
- 发布 PLDroidPlayer v1.0.0
8 反馈及意见
当你遇到任何问题时,可以通过在 GitHub 的 repo 提交 issues 来反馈问题,请尽可能的描述清楚遇到的问题,如果有错误信息也一同附带,并且在 Labels 中指明类型为 bug 或者其他。