直播云

  • 直播云 > SDK 下载 > Android 播放端 SDK

    Android 播放端 SDK

    最近更新时间: 2021-03-09 17:36:02

    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 设置加载动画

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

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

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

    4.3.5 设置播放状态监听器

    PLVideoViewPLVideoTextureView 都提供了丰富的播放状态消息回调,您可以通过 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 设置画面预览模式

    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.3.11 并排模式

    一个常见的场景是多个播放器实例并排播放,PLVideoTextureView 对此场景进行了专门优化,可以通过设置 PLVideoTexureView.setSplitMode() 进行处理。目前提供 PLVideoTextureView.SPLIT_MODE_VERTICALPLVideoTextureView.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

    可以通过 getRtmpAudioTimestampgetRtmpVideoTimestamp 方法获取时间戳

    
    /**
     * 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

    可以通过 getRtmpAudioTimestampgetRtmpVideoTimestamp 方法获取时间戳

    
    /**
     * 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_OPENAVOptions.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 播放器已被销毁,需要再次 setVideoURLprepareAsync
    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_LISTAVOptions.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 的问题
      • 修复了动态添加的 PLVideoTextureViewsetDisplayOrientation 不生效的问题
    • 2.0.4(Release Notes)

      • 发布 pldroid-player-2.0.4.jar
      • 更新 libQPlayer.so
      • 新增 AVOptions.KEY_LOG_LEVEL 字段
      • 新增 PLMediaPlayer.MEDIA_INFO_LOOP_DONE 字段
      • 新增 getRtmpVideoTimestampgetRtmpAudioTimestamp 方法
      • 修复了一些情况下开启 PLNetowrkManager.startDnsCacheService 后无法播放的问题
      • 修复了一些设备上无法加载 libqcCodec.so 的问题
      • 修复了播放一些 flv 直播流时卡顿的问题
      • 修复了一些情况下循环播放时卡顿的问题
      • 修复了一些情况下 PLVideoTextureView 画面不刷新的问题
      • 修复了一些情况下不会收到 OnSeekComplete 的问题
      • 修复了一些情况下出现 ERROR_CODE_SEEK_FAILED 的问题
      • 修复了一些情况下开启 PLVideoTextureView.setSplitMode 后 view 尺寸错误的问题
      • 修复了播放地址过长时离线缓存失败的问题
      • 修复了播放完成后时间可能继续增长的问题
      • 修复了 setDebuggingLogEnabledfalse 时仍会产生大量 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% 的问题
      • 修复了断网后部分视频进度异常的问题
      • 修复了部分视频流与音频流的兼容性问题
      • 修复了 PLVideoViewPLVideoTextureViewremove 然后重新 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 字段
      • 修复 pausegetPlayState 状态不对的问题
      • 修复 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
      • 支持后台播放
      • 优化点播的首开时间
      • 优化直播过程中的累积延时
      • 新增 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

    以上内容是否对您有帮助?
  • Qvm free helper
    Close