1 概述

PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单、快捷的接口,帮助开发者在 Android 平台上快速开发播放器应用。

1.1 功能特性及版本号

功能特性/接口 描述 版本
支持软硬解自动切换 自动解码模式下,优先硬解,硬解失败自动切换到软解 v1.4.1(+)
支持 HTTPS 协议、speex 解码、mp4v 解码 v1.4.1(+)
提供接口获取 metadata 信息 用户可以调用接口获取播放的 metadata 信息 v1.4.1(+)
提供接口获取当前的播放状态 用户可以主动调用接口获取当前播放状态 v1.4.0(+)
支持设置封面 用户在播放开始前显示相关图片信息 v1.4.0(+)
支持带 IP 地址的播放 URL URL 格式:“protocol://ip/path?domain=xxxx.com” v1.3.0(+)
支持 DNS 解析优化 支持 DNS 提前解析和缓存管理 v1.3.0(+)
支持直播累积延时优化 优化直播过程中的累积延时 v1.2.3(+)
支持后台播放 支持退到后台只播放音频 v1.2.3(+)
支持音量设置 设置播放器音量,可实现静音功能 v1.2.2(+)
支持画面镜像翻转 由 PLVideoTextureView 提供,支持播放画面镜像翻转 v1.2.2(+)
支持首屏秒开 在网络条件好的情况下,可以实现秒开 v1.2.0(+)
PLMediaPlayer 类似 Android MediaPlayer,提供了播放器的核心功能 v1.2.0(+)
PLVideoView 类似 Android VideoView,基于 SurfaceView 的播放控件 v1.2.0(+)
PLVideoTextureView 类似 Android VideoView,基于 TextureView 的播放控件 v1.2.0(+)
支持画面旋转 由 PLVideoTextureView 提供,支持播放画面以 0度、90度、180度,270度进行旋转 v1.2.0(+)
支持设置画面预览模式 由 PLVideoView 和 PLVideoTextureView 提供,支持多种画面预览模式,包括:原始尺寸、适应屏幕、全屏铺满、16:9、4:3 等 v1.2.0(+)
支持 ARM, X86 芯片体系架构 v1.1.3(+)
支持 ARM64v8a 芯片体系架构 v1.1.1(+)
AVOptions 用于配置播放器参数,包括:超时时间、软硬件编解码 v1.1.1(+)
AudioPlayer 用于纯音频播放,支持后台运行(注:从 v1.2.0 开始被标记为 Deprecated,并使用 PLMediaPlayer 代替) v1.1.0(+)
支持 ARMv7a 芯片体系架构 v1.0.0(+)
VideoView 基于 SurfaceView 的播放控件(注:从 v1.2.0 开始被标记为 Deprecated,并使用 PLVideoView 代替) v1.0.0(+)

1.2 特性

  • [x] Android Min API 9
  • [x] 支持 RTMP 和 HLS 协议的直播流媒体播放
  • [x] 支持常见的音视频文件播放(MP4、M4A、flv 等)
  • [x] 支持 MediaCodec 硬件解码
  • [x] 提供播放器核心类 PLMediaPlayer
  • [x] 提供 PLVideoView 控件
  • [x] 提供 PLVideoTextureView 控件
  • [x] 支持多种画面预览模式
  • [x] 支持画面旋转(0度,90度,180度,270度)
  • [x] 支持画面镜像变换
  • [x] 支持播放器音量设置,可实现静音功能
  • [x] 支持纯音频播放
  • [x] 支持后台播放
  • [x] 支持首屏秒开
  • [x] 支持直播累积延时优化
  • [x] 支持带 IP 地址的播放 URL
  • [x] 支持设置封面
  • [x] 支持软硬解自动切换
  • [x] 支持 HTTPS 协议、speex 解码、mp4v 解码
  • [x] 可高度定制化的 MediaController
  • [x] 支持 ARM, ARMv7a, ARM64v8a, X86 主流芯片体系架构

2 阅读对象

本文档为技术文档,需要阅读者:

  • 具有基本的 Android 开发能力
  • 准备接入七牛云直播

3 开发准备

3.1 设备以及系统要求

  • 系统要求:Android 2.3 (API 9) 及其以

3.2 混淆

为了保证正常使用 SDK ,请在 proguard-rules.pro 文件中添加以下代码:

-keep class com.pili.pldroid.player.** { *; }
-keep class tv.danmaku.ijk.media.player.** {*;}

3.3 版本升级须知

v1.5.0

从 v1.5.0 开始,有如下重大更新:

  • 需要在项目的 build.gradle 中删除如下配置:
    compile 'com.qiniu.pili:pili-android-qos:0.8.+'

v1.3.1

从 v1.3.1 开始,有如下重大更新:

  • 需要在项目的 build.gradle 中加入如下语句:
dependencies {compile 'com.qiniu.pili:pili-android-qos:0.8.+'
}
  • 更新了 PLMediaPlayer 的构造函数
    如果直接使用 PLMediaPlayer 进行播放的话,需要多添加一个 Context 参数
public PLMediaPlayer(Context context);
public PLMediaPlayer(Context context, AVOptions options);

v1.3.0

从 v1.3.0 开始,有如下重大更新:

  • 新增 PLNetworkManager 类,提供 DNS 缓存管理服务

    如果需要使用 SDK 提供的 DNS 缓存管理服务,则需要在项目中加入如下配置:

// 添加 happydns 的依赖
dependencies {compile 'com.qiniu:happy-dns:0.2.+'
}
// 添加网络状态监测的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

4 快速开始

4.1 开发环境

  • Android Studio 开发工具,官方下载地址
  • Android 官方开发 SDK,官方下载地址。

4.2 SDK 集成

首先,下载最新版本的 PLDroidPlayer SDK

4.2.1 导入 SDK

SDK 主要包含 demo 代码、 PLDroidPlayer jar 包,以及 sdk 依赖的动态库文件。

其中,release 目录下是需要拷贝到您的 Android 工程的所有文件,列表如下:

PLDroidPlayer SDK 支持 armv5、armv7、arm64 和 x86 多种 CPU 架构,目前市场上主流机型的 CPU 都采用的是 armv7 架构。您可以根据兼容性的需要,将 release 目录下的动态库,拷贝到您的工程对应的目录下,例如:armeabi-v7a 目录下的 so 则拷贝到工程的 jniLibs/armeabi-v7a 目录下。

同时,还需要将 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')compile 'com.qiniu.pili:pili-android-qos:0.8.+'
}

4.2.3 添加相关权限

在 app/src/main 目录中的 AndroidManifest.xml 中增加如下 uses-permission 声明

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

4.3 使用 PLVideoView 或者 PLVideoTextureView 实现媒体播放功能

PLDroidPlayer SDK 提供的 PLVideoView 类和 PLVideoTextureView 类可以快速实现带界面的播放器功能,它们的接口与 Android 官方的 VideoView 类基本保持一致,其内部封装了 PLMediaPlayer 类所提供的播放功能。

他们的使用方法基本相同,唯一的区别在于 PLVideoView 类使用了 SurfaceView 来完成视频画面的渲染,而 PLVideoTextureView 采用了 TextureView 完成视频画面的渲染 ,因此,在这里合并在一起来介绍。

4.3.1 布局

如果采用 PLVideoView 的话,布局如下:

<com.pili.pldroid.player.widget.PLVideoViewandroid:id="@+id/PLVideoView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center" />

如果采用 PLVideoTextureView 的话,布局如下:

<com.pili.pldroid.player.widget.PLVideoTextureViewandroid: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 设置加载动画

PLVideoViewPLVideoTextureView 提供了设置加载动画的接口,在播放器进入缓冲状态时,自动显示加载界面,缓冲结束后,自动隐藏加载界面,设置方法如下:

View loadingView = findViewById(R.id.LoadingView);
mVideoView.setBufferingIndicator(loadingView);

loadingView 可以是任意的 Android View 视图对象。

4.3.5 设置播放状态监听器

PLVideoViewPLVideoTextureView 都提供了丰富的播放状态消息回调,您可以通过 setXXXListener 接口实现各种消息状态的获取,示例如下:

public class PLVideoViewActivity extends Activity implementsPLMediaPlayer.OnPreparedListener,PLMediaPlayer.OnInfoListener,PLMediaPlayer.OnCompletionListener,PLMediaPlayer.OnVideoSizeChangedListener,PLMediaPlayer.OnErrorListener {...mVideoView.setOnPreparedListener(this);mVideoView.setOnInfoListener(this);mVideoView.setOnCompletionListener(this);mVideoView.setOnVideoSizeChangedListener(this);mVideoView.setOnErrorListener(this);
...

关于各个消息状态的详细含义,将在 功能使用 章节详细说明。

4.3.6 设置画面预览模式

PLVideoViewPLVideTextureView 提供了各种画面预览模式,包括:原始尺寸、适应屏幕、全屏铺满、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.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 implementsPLMediaPlayer.OnPreparedListener,PLMediaPlayer.OnInfoListener,PLMediaPlayer.OnCompletionListener,PLMediaPlayer.OnVideoSizeChangedListener,PLMediaPlayer.OnErrorListener {...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() 开始准备播放了,该过程是异步的,因此需要首先注册一个 OnPreparedListener 获取准备结束的回调(如果前面已经注册过,则不用重复注册)。

mMediaPlayer.setOnPreparedListener(new PLMediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(PLMediaPlayer plMediaPlayer) {mMediaPlayer.start();}
});
mMediaPlayer.prepareAsync();

4.4.6 播放控制

PLMediaPlayer 提供的播放控制接口如下:

mMediaPlayer.start();
mMediaPlayer.pause();
mMediaPlayer.stop();
mMediaPlayer.reset();

当播放完成,系统退出时,不要忘记调用 release 函数释放资源:

mMediaPlayer.release();

4.5 使用 VideoView 实现媒体播放功能

从 1.2.0 版开始,VideView 已经被设置为 deprecated,推荐使用 PLVideoView,它提供了 VideView 所提供的所有功能,并且提供了许多新的功能。

4.5.1 布局

<com.pili.pldroid.player.widget.VideoViewandroid:id="@+id/VideoView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center" />

4.5.2 初始化

VideoView mVideoView = (VideoView) findViewById(R.id.VideView);

4.5.3 关联播放控制器

Demo 里面提供了一个播放控制器示例,MediaController,您可以随意修改满足定制化需求,将该控制器控件关联到 VideoView 的方法如下:

MediaController mMediaController = new MediaController(this);
mVideoView.setMediaController(mMediaController);

4.5.4 设置播放状态监听器

VideView 提供了丰富的播放状态消息回调,您可以通过 setXXXListener 接口实现各种消息状态的获取,示例如下:

public class PLVideoViewActivity extends Activity implementsIjkMediaPlayer.OnPreparedListener,IjkMediaPlayer.OnInfoListener,IjkMediaPlayer.OnCompletionListener,IjkMediaPlayer.OnVideoSizeChangedListener,IjkMediaPlayer.OnErrorListener {...mVideoView.setOnPreparedListener(this);mVideoView.setOnInfoListener(this);mVideoView.setOnCompletionListener(this);mVideoView.setOnVideoSizeChangedListener(this);mVideoView.setOnErrorListener(this);
...

关于各个消息状态的详细含义,将在 功能使用 章节详细说明。

4.5.5 全屏播放

您只需在 VideoView 的布局文件中设置对应的属性即可,例如:

<com.pili.pldroid.player.widget.VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerInParent="true"android:layout_alignParentTop="true"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_alignParentRight="true" />

4.5.6 设置播放地址

这是最重要的环节,在调用播放器的控制接口之前,必须先设置好播放地址。

传入播放地址,可以是 /path/to/local.mp4 本地文件绝对路径,或 HLS URL,或 RTMP URL

mVideoView.setVideoPath(videoPath);

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;// 解码方式:
// 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);// 准备超时时间,包括创建资源、建立连接、请求码流等,单位是 ms
// 默认值是:无
options.setInteger(AVOptions.KEY_PREPARE_TIMEOUT, 10 * 1000);// 读取视频流超时时间,单位是 ms
// 默认值是:10 * 1000
options.setInteger(AVOptions.KEY_GET_AV_FRAME_TIMEOUT, 10 * 1000);// 当前播放的是否为在线直播,如果是,则底层会有一些播放优化
// 默认值是:0
options.setInteger(AVOptions.KEY_LIVE_STREAMING, 1);// 是否开启"延时优化",只在在线直播流中有效
// 默认值是:0
options.setInteger(AVOptions.KEY_DELAY_OPTIMIZATION, 1);// 默认的缓存大小,单位是 ms
// 默认值是:2000
options.setInteger(AVOptions.KEY_CACHE_BUFFER_DURATION, 2000);// 最大的缓存大小,单位是 ms
// 默认值是:4000
options.setInteger(AVOptions.KEY_MAX_CACHE_BUFFER_DURATION, 4000);// 是否自动启动播放,如果设置为 1,则在调用 `prepareAsync` 或者 `setVideoPath` 之后自动启动播放,无需调用 `start()`
// 默认值是:1
options.setInteger(AVOptions.KEY_START_ON_PREPARED, 1);// 播放前最大探测流的字节数,单位是 byte
// 默认值是:128 * 1024
options.setInteger(AVOptions.KEY_PROBESIZE, 128 * 1024);// 是否开启音视频播放时间戳回调
// 默认值是:0
options.setInteger(AVOptions.KEY_AUDIO_RENDER_MSG, 1);
options.setInteger(AVOptions.KEY_VIDEO_RENDER_MSG, 1);// 请在开始播放之前配置
mVideoView.setAVOptions(options);

5.2 播放状态回调

PLDroidPlayer SDK 提供的所有状态监听接口,状态、错误的常量,均定义在 PLMediaPlayer 类中。

5.2.1 OnPreparedListener

/*** Called when the media file is ready for playback.** @param mp the PLMediaPlayer that is ready for playback** @param preparedTime prepared time: ms*/
public interface OnPreparedListener {void onPrepared(PLMediaPlayer mp, int preparedTime);
}

该对象用于监听播放器的 prepare 过程,该过程主要包括:创建资源、建立连接、请求码流等等,当 prepare 完成后,SDK 会回调该对象的 onPrepared 接口,下一步则可以调用播放器的 start() 启动播放。

5.2.2 OnInfoListener

public interface OnInfoListener {boolean onInfo(PLMediaPlayer mp, int what, int extra);
}

what 定义了消息类型,extra 是附加参数

what value 描述
MEDIA_INFO_UNKNOWN 1 未知消息
MEDIA_INFO_VIDEO_RENDERING_START 3 第一帧视频已成功渲染
MEDIA_INFO_BUFFERING_START 701 开始缓冲
MEDIA_INFO_BUFFERING_END 702 停止缓冲
MEDIA_INFO_VIDEO_ROTATION_CHANGED 10001 获取到视频的播放角度
MEDIA_INFO_AUDIO_RENDERING_START 10002 第一帧音频已成功播放
MEDIA_INFO_VIDEO_GOP_TIME 10003 获取视频的I帧间隔
MEDIA_INFO_SWITCHING_SW_DECODE 802 硬解失败,自动切换软解
MEDIA_INFO_VIDEO_FRAME_RENDERING 10004 获取当前视频播放时间戳
MEDIA_INFO_AUDIO_FRAME_RENDERING 10005 获取当前音频播放时间戳

该对象用于监听播放器的状态消息,在播放器启动后,SDK 会在播放器发生状态变化时调用该对象的 onInfo 方法,同步状态信息。

5.2.3 OnCompletionListener

public interface OnCompletionListener {void onCompletion(PLMediaPlayer mp);
}

该对象用于监听播放结束的消息,关于该回调的时机,有如下定义:

  • 如果是播放文件,则是播放到文件结束后产生回调
  • 如果是在线视频,则会在读取到码流的EOF信息后产生回调,回调前会先播放完已缓冲的数据
  • 如果播放过程中产生onError,并且没有处理的话,最后也会回调本接口
  • 如果播放前设置了 setLooping(true),则播放结束后会自动重新开始,不会回调本接口

5.2.4 OnErrorListener

public interface OnErrorListener {boolean onError(PLMediaPlayer mp, int errorCode);
}

该对象用于监听播放器的错误消息,一旦播放过程中产生任何错误信息,SDK 都会回调该接口,返回值决定了该错误是否已经被处理,如果返回 false,则代表没有被处理,下一步则会触发 onCompletion 消息。

errorCode value 描述
MEDIA_ERROR_UNKNOWN -1 未知错误
ERROR_CODE_INVALID_URI -2 无效的 URL
ERROR_CODE_IO_ERROR -5 网络异常
ERROR_CODE_STREAM_DISCONNECTED -11 与服务器连接断开
ERROR_CODE_EMPTY_PLAYLIST -541478725 空的播放列表
ERROR_CODE_404_NOT_FOUND -875574520 播放资源不存在
ERROR_CODE_CONNECTION_REFUSED -111 服务器拒绝连接
ERROR_CODE_CONNECTION_TIMEOUT -110 连接超时
ERROR_CODE_UNAUTHORIZED -825242872 未授权,播放一个禁播的流
ERROR_CODE_PREPARE_TIMEOUT -2001 播放器准备超时
ERROR_CODE_READ_FRAME_TIMEOUT -2002 读取数据超时
ERROR_CODE_HW_DECODE_FAILURE -2003 硬解码失败

5.2.5 OnBufferingUpdateListener

public interface OnBufferingUpdateListener {void onBufferingUpdate(PLMediaPlayer mp, int percent);
}

该回调用于监听当前播放器已经缓冲的数据量占整个视频时长的百分比,在播放直播流中无效,仅在播放文件和回放时才有效。

5.2.6 OnVideoSizeChangedListener

public interface OnVideoSizeChangedListener {void onVideoSizeChanged(PLMediaPlayer mp, int width, int height);
}

该回调用于监听当前播放的视频流的尺寸信息,在 SDK 解析出视频的尺寸信息后,会触发该回调,开发者可以在该回调中调整 UI 的视图尺寸。

5.2.7 OnSeekCompleteListener

public interface OnSeekCompleteListener {void onSeekComplete(PLMediaPlayer mp);
}

该回调用于监听 seek 完成的消息,当调用的播放器的 seekTo 方法后,SDK 会在 seek 成功后触发该回调。

5.3 连接状态处理

5.3.1 如何判断直播结束

对于直播应用而言,播放器本身是无法判断直播是否结束,这需要通过业务服务器来告知。当主播端停止推流后,播放器会因为读取不到新的数据而产生超时,从而触发 onCompletion 回调。

建议的处理方式是:在 onCompletion 回调后,查询业务服务器,获知直播是否结束,如果已经结束,则关闭播放器,清理资源;如果直播没有结束,则尝试重连。

如果使用的是 PLVideoView 或者 PLVideoTextureView,重连的方法如下:

mVideoView.setVideoPath(mVideoPath);
mVideoView.start();

如果使用的是 PLMediaPlayer,重连的方法如下:

mMediaPlayer.reset();
mMediaPlayer.setDisplay(mSurfaceView.getHolder());
mMediaPlayer.setDataSource(mVideoPath);
mMediaPlayer.prepareAsync();

重连之前,建议使用如下方法判断一下网络的联通性,并且在每次重连之前,delay 1~2s

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

这种情况下,通常要做如下判断来考虑是否需要重连:

  • 查询业务服务器,获知直播是否结束,如果没有结束,则可以尝试做重连
  • 判断网络是否断开,如果网络连接是正常的,则可以尝试做重连

重连的使用方法,可以参考 如何判断直播结束

需要注意,如果决定做重连,则 onError 回调中,请返回 true,否则会导致触发 onCompletion.

5.4 播放器声音调节

如果期望调节播放器的音量,接口如下所示:

public void setVolume(float leftVolume, float rightVolume);

音量参数的取值范围是:0.0~1.0,使用如下代码可以达到静音的效果:

setVolume(0.0f, 0.0f);

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);
  • 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();

6 API查询

  • PLDroidPlayer API Reference

7 历史记录

  • 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
    • 支持后台播放
    • 优化点播的首开时间
    • 优化直播过程中的累积延时
    • 新增 setWakeModesetScreenOnWhilePlaying 接口
    • 新增 setLoopingisLooping 接口
    • 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
    • 修复 getCurrentPositiongetDuration 返回值异常问题
    • 修复播放过程中,概率性不间断地回调 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 // ms
    • AVOptions.KEY_MEDIACODEC // 1 means enable, 0 means disable
    • AVOptions.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_REFUSEDEXTRA_CODE_EOF
    • 优化播放延时
    • 优化播放过程中因断流导致的等待时间
    • 修复部分机型硬解码异常问题
    • 添加纯音频播放展示界面
  • 1.0.0 (Release Notes)

    • 发布 PLDroidPlayer v1.0.0

8 反馈及意见

当你遇到任何问题时,可以通过在 GitHub 的 repo 提交 issues 来反馈问题,请尽可能的描述清楚遇到的问题,如果有错误信息也一同附带,并且在 Labels 中指明类型为 bug 或者其他。

通过这里查看已有的 issues 和提交 Bug。

七牛Android播放器V1版本开发文档相关推荐

  1. android 播放器 音乐,音乐我最行 七款Android播放器大比拼

    随着手机技术的飞速发展,如今的手机已能满足人们日常的很多需要,早已不再是为了打个电话或发个短信.上网,拍照,看电影,听音乐,玩游戏等这些自然都不在话下.手机的影音功能让我们丢掉了传统的MP3,MP4, ...

  2. 开博尔智能android播放器C3,Kaiboer开博尔C3第九代双核智能机顶盒KIUI 7.0安卓4.4.2线刷固件 电视盒固件 开博尔...

    驱动说明 Kaiboer开博尔C3第九代双核智能机顶盒KIUI 7.0安卓4.4.2线刷固件(2014年6月6日发布)虽说现在安卓设备的内存越来越大了,动辄2G.3G,不过安卓机顶盒的内存一直没什么变 ...

  3. Android UI 设计规范,androidsdk开发文档

    底部动作条是一个从屏幕底部边缘向上滑出的一个面板,使用这种方式向用户呈现一组功能.底部动作条呈现了简单.清晰.无需额外解释的一组操作. 通常以列表形式出现,支持上下滚动.

  4. 秀杰音乐盒之mtv播放器 v1.0 怎么用

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  5. 迷你音乐播放器v1.0正式上线!

    迷你音乐播放器V1.0正式上线! 版本介绍: 1.随机播放切换开关(通过点击专辑图片) 2.通过拖动歌曲名及艺术家名调整歌曲播放进度 3.手机浏览访问支持熄屏播放 4.暂不支持在线搜索功能 快来一起分 ...

  6. java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...

    文件名称: VideoViewDemo下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 194 KB 上传时间: 2014-09-19 下载次数: 5 详细说明:a ...

  7. ijk基于exo_github上十二款最著名的Android播放器开源项目

    1.ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器.实现了跨平台功能,API 易于集成:编译配置可裁剪,方便控制 ...

  8. github上十二款最著名的Android播放器开源项目

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  9. android 音乐视频播放器(github上十二款最著名的Android播放器开源项目)

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  10. Chrome 出现“您未安装Flash Player播放器或者版本过低”问题

    Chrome 出现"您未安装Flash Player播放器或者版本过低"问题 方法: 1.在Chrome地址栏输入chrome://components 2.看到谷歌浏览器所有已安 ...

最新文章

  1. 13.最为经典的动态规划入门
  2. 在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】
  3. 魅族适配鸿蒙吗,魅族智能生活发布会新增看点:接入鸿蒙操作系统
  4. Configuration of OpenCV 2.4.7 in VS2012 (X86)
  5. 题目1144:Freckles
  6. python用for循环读取图片_python 使用for循环简单爬取图片(1)
  7. HDU 2176(Nim博弈)
  8. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
  9. VS2008找不到MFC90d.dll错误解决方法
  10. 拓端tecdat|R语言结构方程模型 SEM 多元回归和模型诊断分析学生测试成绩数据与可视化
  11. python统计段落单词词频_python词频统计实例
  12. nfs挂载方式启动linux,飞凌OK6410挂载nfs启动步骤
  13. glassfish配置错误问题
  14. 第13期 《仰望星空,脚踏实地》 12月刊
  15. Netty实战:Springboot+Netty+protobuf开发高性能服务器 (附源码下载)
  16. 蓝牙BLE之系统学习
  17. 逻辑门电路 逻辑运算
  18. 网站添加头部Meta property=og协议的使用方法详解教程
  19. 「科普」如何评价供应商的MES系统
  20. java连接ftp工具类

热门文章

  1. 加密狗厂商及工作原理介绍
  2. Kali Linux镜像安装(1)
  3. 嵌入式软件工程师岗位笔试、面试题(1)
  4. TakeColor 屏幕取色器 8.0 中文绿色版
  5. 子空间方法——MUSIC算法
  6. 华中科技大学计算机基地班,华中科技大学基地班管理方法.doc
  7. matlab高等数学实验答案,MATLAB高等数学实验-(第2版)
  8. Ubuntu小技巧13--grep命令详解
  9. Unity —Spine动画
  10. grub清除linux密码,忘了grub密码和root密码时的root密码更改和grub密码清除方法