可以借助 getRtmpAudioTimestamp 与 getRtmpVideoTimestamp 方法获取时间戳
/**
* Get video timestamp in RTMP message
* @return timestamp
*/
public long getRtmpVideoTimestamp();
/**
* Get audio timestamp in RTMP message
* @return timestamp
*/
public long getRtmpAudioTimestamp();
可以借助 captureImage 方法进行视频截图,截图数据将要在 PLOnImageCapturedListener 中回调
/**
* Capture video image
* @param delayTimeMs 截取调用此方法后相应毫秒后的视频画面,仅对点播流生效
*/
public void captureImage(long delayTimeMs);
可以借助 setVideoArea 方法,播放视频的一部分区域。若一切参数均为 ,则不裁剪画面。
/**
* 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);
可以像功能的 SurfaceView 一样设置 PLVideoView 的 ZOrder 属性,原理如下:
public void setZOrderOnTop(boolean onTop);
public void setZOrderMediaOverlay(boolean overlay);
在播放点播流时,可以按照详细需求动态暂停/恢复播放器的预缓冲,原理如下:
/**
* Set buffering enabled
* @param enabled enable or not
*/
public void setBufferingEnabled(boolean enabled);
在播放 http 点播流时,可以获取播放器已经缓冲的 byte 数,原理如下:
/**
* Get buffered length
* @return length
*/
public BigInteger getHttpBufferSize();
PLDroidPlayer SDK 提供的 PLMediaPlayer 实现了一个媒体播放器的这些基础系统和插口,与 Android 官方的 MediaPlayer 的设计基本维持一致。
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" />

PLMediaPlayer mMediaPlayer = new PLMediaPlayer(mContext);
PLMediaPlayer mMediaPlayer = new PLMediaPlayer(mContext, mAVOptions);
mMediaPlayer.setDataSource(mVideoPath);
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);
...
关于各个传闻状态的具体含义,将在 章节详细说明。
当 SurfaceView 成功创建后,需要将 SurfaceHolder 传入PLMediaPlayer,实例如下:
mMediaPlayer.setDisplay(mSurfaceHolder);
注意,所以是纯音频播放的话,则没有这一步。
当所有都打算就绪之后,就可以读取 prepareAsync() 开始打算播放了,该过程是异步的,所以需要首先注册一个 PLOnPreparedListener 获取准备结束的下跌(因为后面已经注册过,则不用重复注册)。
mMediaPlayer.setOnPreparedListener(new PLOnPreparedListener() {
@Override
public void onPrepared(PLMediaPlayer plMediaPlayer) {
mMediaPlayer.start();
}
});
mMediaPlayer.prepareAsync();
PLMediaPlayer 提供的播映控制接口如下:
mMediaPlayer.start();
mMediaPlayer.pause();
mMediaPlayer.stop();
mMediaPlayer.reset();
当播放完成,功能退出时,不要忘记调用 release 函数释放资源:
mMediaPlayer.release();
可以借助 getRtmpAudioTimestamp 与 getRtmpVideoTimestamp 方法获取时间戳
/**
* Get video timestamp in RTMP message
* @return timestamp
*/
public long getRtmpVideoTimestamp();
/**
* Get audio timestamp in RTMP message
* @return timestamp
*/
public long getRtmpAudioTimestamp();
可以借助 captureImage 方法进行视频截图,截图数据将要在 PLOnImageCapturedListener 中回调
/**
* Capture video image
* @param delayTimeMs 截取调用此方法后相应毫秒后的视频画面
*/
public void captureImage(long delayTimeMs);
可以借助 setVideoArea 方法,播放视频的一部分区域。若一切参数均为 ,则不裁剪画面。
/**
* 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);
在播放点播流时,可以按照详细需求动态暂停/恢复播放器的预缓冲,原理如下:
/**
* Set buffering enabled
* @param enabled enable or not
*/
public void setBufferingEnabled(boolean enabled);
在播放 http 点播流时,可以获取播放器已经缓冲的 byte 数,原理如下:
/**
* Get buffered length
* @return length
*/
public BigInteger getHttpBufferSize();
在播放 http 点播流前,提前缓存头资料还有大概一个 gop 的内容,原理如下:
/**
* Add cache before play
* @param url
*/
public void addCache(String url)
去除预缓存的内容,取值为 null 表示清理所有预缓存内容,原理如下:
/**
* Clear cache
* @param url
*/
public void delCache(String url)
获取请求 http 点播流的号召信息,可以在播放开始后读取,原理如下:
/**
* Get connect response info
* @return String info
*/
public String getResponseInfo()

设置预加载的形状,单位为 byte,默认 10 * 1024,原理如下:
/**
* Set IOCache size
* @param size
*/
public void setIOCacheSize(long size)
在播放 http 点播流前,提前加载部分文档的内容,原理如下:
/**
* Add IOCache before play
* @param url
*/
public void addIOCache(String url)
去除预加载的内容七牛云开发者中心,取值为 null 表示清理所有预加载内容,原理如下:
/**
* Clear IOCache
* @param url
*/
public void delIOCache(String url)
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);
PLDroidPlayer SDK 提供的所有状况接口,状况、错误的常量,均定义在 PLMediaPlayer 类中。
/**
* 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() 启动播放。
public interface PLOnInfoListener {
void onInfo(int what, int extra);
}
what 定义了传闻类型,extra 是附加参数
whatvalue描述
MEDIA_INFO_UNKNOWN
未知消息
MEDIA_INFO_VIDEO_RENDERING_START
第一帧视频已成功渲染
MEDIA_INFO_CONNECTED
连接成功
MEDIA_INFO_METADATA
调用到 metadata 信息
MEDIA_INFO_BUFFERING_START
直到缓冲
MEDIA_INFO_BUFFERING_END
停止缓冲
MEDIA_INFO_SWITCHING_SW_DECODE
硬解失败,自动切换软解
MEDIA_INFO_CACHE_DOWN
预加载完成

MEDIA_INFO_LOOP_DONE
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
离线缓存的部份播放完成
MEDIA_INFO_IS_SEEKING
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-118828-2.html
忍不住转