目前开源播放器很多,项目中采用了七牛播放器
,再次小结一下
1. 版本迭代
最近几个版本更新,更多记录点我查看:
GitHub:播放器地址
文档地址:官方SDK文档
2. 播放器特点
2.1
播放控件有2种方法可选
-
PLVideoView,基于 SurfaceView
-
PLVideoTextureView,基于TextureView
2.2
播放器参数
-
软硬解自动切换
-
变速播放
/**
* 设置倍数播放
* @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);
- 视频截图(captureImage视频截图,截图数据将会在 PLOnImageCapturedListener 中回调)
/**
* Capture video image
* @param delayTimeMs 截取调用此方法后相应毫秒后的视频画面,仅对点播流生效
*/
public void captureImage(long delayTimeMs);
- 播放地址,可以是 /path/to/local.mp4 本地文件绝对路径,或 HLS URL,或 RTMP URL,所以是支持直播的
- 通过 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);
3. 集成注意点
-
由于 Android 7.0 使用 BoringSSL 替换了 OpenSSL,一些依赖系统内建 OpenSSL 的程序在一些 7.0+ 的 ROM 里可能会崩溃。如果您的应用 targetSdkVersion >= 24,那么强烈推荐将 libopenssl.so 加入至 jniLibs 目录
-
集成播放器可设置预加载动画
View loadingView = findViewById(R.id.LoadingView);
mVideoView.setBufferingIndicator(loadingView);
- 画面预览模式
// 原始尺寸、适应屏幕、全屏铺满、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);
- 一个常见的场景是多个播放器实例并排播放,PLVideoTextureView 对此场景进行了专门优化,可以通过设置 PLVideoTexureView.setSplitMode() 进行处理
/**
* 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()
- 当播放完成,系统退出时,不要忘记调用 release 函数释放资源
mMediaPlayer.release();
- 功能设置相关几个参数
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, 1);
// 设置 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);
- 错误码的我觉得还是有必要贴张图
- 播放首开时间过长,注意一下DNS 解析优化
- 版本迭代更新细节,可参考更新文档滑到页面底部查看