Android应用端SDK提供了音视频播放、语音对讲等功能。
获取SDK
前提条件
视频设备已接入智能视频服务,详细操作,请参见设备接入。
开发前的环境要求如下表所示。
类别
说明
系统版本
支持Android 4.4及以上版本。
Java版本
支持Java 1.7及以上版本。
API LEVEL
支持Android SDK API LEVEL 18及以上版本。
Android Studio版本
支持Android Studio 2.3以上版本。
配置步骤
创建Android Studio工程。
配置依赖。
在您创建的Android Studio工程,根目录下的build.gradle文件中,添加Aliyun Maven仓库地址。
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
在app文件夹下的build.gradle文件中添加如下依赖。
implementation('com.aliyun.iotx:linkvisual-media:1.2.16')
混淆配置。
在proguard-rules.pro文件中添加如下混淆配置。
# keep and don't warn Link Visual -dontwarn com.aliyun.iotx.linkvisual.** -dontwarn com.google.android.exoplayer2.** -keep class com.aliyun.iotx.linkvisual.media.** { *; }
RTMP播放器
播放器概述
播放器类型
RTMP播放协议支持以下两类播放器:
直播播放器
即LivePlayer播放器,用于播放RTMP协议的直播视频源。
设备录像点播播放器
即VodPlayer播放器,用于播放RTMP协议的设备端存储的视频文件。
示例代码
请参考如下示例代码,了解直播播放器和设备录像点播播放器的使用方法。
直播播放器
// 构造播放器实例
LivePlayer player = new LivePlayer(getApplicationContext());
// 设置TextureView
player.setTextureView(textureView);
// 设置必要的状态监听
player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
@Override
public void onPlayerStateChange(int playerState){
Log.d(TAG, "play state= " + playerState);
switch (playerState) {
case Player.STATE_BUFFERING:
break;
case Player.STATE_IDLE:
break;
case Player.STATE_READY:
break;
case Player.STATE_ENDED:
break;
default:
break;
}
}
});
// 设置错误监听
player.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(PlayerException exception){
makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
}
});
// 设置RTMP地址
player.setDataSource("rtmp://××.××.××.××:××/livetv/hunantv");
// 设置数据源就绪监听器
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(){
// 数据源就绪后开始播放
player.start();
}
});
player.prepare();
...
// 停止播放
player.stop();
...
// 释放播放器资源
player.release();
设备录像点播播放器
// 构造播放器实例
VodPlayer player = new VodPlayer(getApplicationContext());
// 设置TextureView
player.setTextureView(textureView);
// 设置必要的状态监听
player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
@Override
public void onPlayerStateChange(int playerState){
Log.d(TAG, "play state= " + playerState);
switch (playerState) {
case Player.STATE_BUFFERING:
break;
case Player.STATE_IDLE:
break;
case Player.STATE_READY:
break;
case Player.STATE_ENDED:
break;
default:
break;
}
}
});
// 设置错误监听
player.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(PlayerException exception){
makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
}
});
// 设置支持点播的RTMP地址
player.setDataSource("rtmp://xxxx");
// 设置数据源就绪监听器
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(){
// 数据源就绪后开始播放
player.start();
}
});
player.prepare();
...
// 暂停播放
player.pause();
...
// 恢复播放
player.start();
...
// 停止播放
player.stop();
...
// 释放播放器资源
player.release();
直播播放器接口说明
构造方法
/**
*构造方法
*@param applicationContext ApplicationContext
*/
LivePlayer(Context applicationContext);
设置非加密播放源
/**
* 设置播放源
* @param URL RTMP地址
*/
void setDataSource(String url) throws IllegalArgumentException;
设置加密播放源
/**
* 设置加密播放源(请确保播放源已进行AES加密)
* @param url RTMP源地址
* @param isEncrypted 是否是加密源
* @param decryptIv 解密向量,16 Byte Array
* @param decryptKey 解密密钥,16 Byte Array
* @throws IllegalArgumentException
*/
void setDataSource(String url, boolean isEncrypted, byte[] decryptIv, byte[] decryptKey) throws IllegalArgumentException;
校验和准备数据
/**
* 校验和准备数据
*/
void prepare();
开始播放视频
/**
* 开始播放视频
*/
void start();
停止播放
/**
* 停止播放
*/
void stop();
重置播放器
/**
* 重置播放器
*/
void reset();
释放播放器资源
/**
* 释放播放器资源
*/
void release();
设置重连次数
/**
* 设置重连次数
* 只针对发生{@link PlayerException#SUB_CODE_UNEXPECTED_PULL_STREAM_ERROR}错误时做重连
* @param count默认为0,建议重连次数不超过3次
*/
void setReconnectCount(int count);
截图
/**
* 当前视频画面截图
* @return 如果当前无画面则返回null
*/
Bitmap snapShot();
截图到文件
/**
* 当前视频画面截图
* @param jpegFile 保存截图JPEG的文件
* @return true表示文件保存成功
*/
boolean snapShotToFile(File jpegFile);
开始录屏
/**
* 开始录制当前播放内容,生成MPEG-4格式转存到指定的文件中
* 文件名后缀必须为.mp4
* 须在{@link PlayerState#STATE_READY}时调用有效
* @param contentFile
* @return 操作成功或失败
*/
boolean startRecordingContent(File contentFile) throws IOException;
获取当前录制的视频时长
/**
* 获取当前录制的视频时长
* @return 单位为毫秒
*/
long getCurrentRecordingContentDuration();
结束录屏
/**
* 停止记录播放内容
* @return 操作成功与否
*/
boolean stopRecordingContent();
设置播放器音量
/**
* 设置播放器音量
* @param audioVolume 范围为0~1,0为静音
*/
void setVolume(float audioVolume);
设置音频流通道类型
/**
* 设置音频流通道类型,see {@link android.media.AudioManager},默认使用AudioManager.STREAM_MUSIC
* 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
* @param audioStreamType
*/
void setAudioStreamType(int audioStreamType);
设置画面缩放模式
/**
* 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
* @param videoScalingMode 参见:
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
*/
void setVideoScalingMode(int videoScalingMode);
设置播放停止时画面的绘制策略
/**
*设置播放停止时画面的绘制策略
*@param playerStoppedDrawingMode
*ALWAYS_KEEP_LAST_FRAME 播放停止时始终保留最后一帧画面
*KEEP_LAST_FRAME_WITHOUT_ERROR 只有播放停止后未出现错误时,才保留最后一帧画面(默认是此模式)
*ALWAYS_BLACK 播放停止时始终显示黑色
*/
void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)
设置播放器固定缓存帧数
/**
* 设置播放器固定缓存帧数
* @param frameCount 播放器固定缓存帧数,范围为0~16帧,数值越大播放器延迟越大,流畅性越好,默认为5帧
*/
void setBufferedFrameCount(int frameCount);
设置SurfaceView
/**
*设置SurfaceView, 必须为GLSurfaceView,同一个Window中同一时间只允许一个播放器播放,若需要支持多播放实例,请使用TextureView方法
*注意:GLSurfaceView,必须在Activity的onResume和onPause回调方法中,调用GLSurfaceView的onResume和onPause方法;
*GLSurfaceView及其容器不可设置背景色。
*@param surfaceview
*/
void setSurfaceView(SurfaceView surfaceview);
清除SurfaceView
/**
* 清除SurfaceView
*/
void clearSurfaceView();
设置TextureView
/**
* 设置TextureView,同一个TextureView不可被多个播放器共享,
提供支持手势操作的控件ZoomableTextureView可做参照
* @param textureview
*/
void setTextureView(TextureView textureView);
清除TextureView
/**
* 清除TextureView
*/
void clearTextureView();
设置是否由外部渲染YUV数据
/**
* 设置是否由外部渲染YUV数据
* @param useExternalRender 外部渲染:设置为true;内部渲染:设置为false
*/
void setUseExternalRender(boolean useExternalRender);
获取是否使用外部渲染
/**
* 获取是否使用外部渲染
* @return 外部渲染:设置为true;内部渲染:设置为false
*/
boolean useExternalRender();
设置外部渲染监听器
/**
* 设置外部渲染监听器
* @param onExternalRenderListener
*/
void setOnExternalRenderListener(OnExternalRenderListener onExternalRenderListener);
public interface OnExternalRenderListener{
public interface OnExternalRenderListener{
/**
* 通知已经有YUV数据帧需要被渲染
* @param width视频帧宽
* @param height视频帧高
* @param timestamp时间戳,单位为毫秒
*/
void onVideoFrameUpdate(int width, int height ,long timestamp);
}
获取YUV帧数据用于渲染
/**
* 获取YUV帧数据用于渲染,只在外部渲染模式下有效
* @return YUV 420P格式视频帧
*/
Yuv420pFrame getYuvFrame();
设置SEI信息监听器
/**
* 设置SEI信息监听器
*
* @param seiInfoBuffer 创建用于存储SEI帧数据的缓存,必须保证码流中的SEI信息长度不会超过缓存大小,超过的帧将会被丢弃
* @param onSeiInfoListener
*/
void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener);
interface OnSeiInfoListener{
/**
* 当SEI信息更新时回调
* 请不要执行阻塞的操作,并在该回调中及时处理seiInfoBuffer数据
* @param seiInfoBuffer
*/
void onSeiInfoUpdate(SeiInfoBuffer seiInfoBuffer);
}
设置数据源准备就绪事件监听器
/**
* 设置数据源准备就绪事件监听器
* @param listener
*/
void setOnPreparedListener(OnPreparedListener listener);
public interface OnPreparedListener {
/**
* 数据源准备就绪回调
*/
void onPrepared();
}
设置播放器错误事件监听器
/**
* 设置播放器错误事件监听器,错误类型参见:
* {@link PlayerException.SOURCE_ERROR}
* {@link PlayerException.RENDER_ERROR}
* {@link PlayerException.UNEXPECTED_ERROR}
* @param listener
*/
void setOnErrorListener(OnErrorListener listener);
public interface OnErrorListener{
/**
* 播放器错误回调,参见
* {@link PlayerException}
* @param exception
*/
void onError(PlayerException exception);
}
设置播放状态变更事件监听器
/**
* 设置播放状态变更事件监听器,请参见视频播放器状态介绍
* @param listener
*/
void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
public interface OnPlayerStateChangedListener{
/**
* 播放器状态变更回调
*
* @param playerState 参见
* {@link PlayerState#STATE_IDLE}
* {@link PlayerState#STATE_BUFFERING}
* {@link PlayerState#STATE_READY}
* {@link PlayerState#STATE_ENDED}
*/
void onPlayerStateChange(int playerState);
}
设置首帧被渲染事件监听器
/**
* 设置首帧被渲染事件监听器
* @param listener
*/
void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
public interface OnRenderedFirstFrameListener {
/**
* 首帧被渲染回调
*/
void onRenderedFirstFrame();
}
设置视频内容宽高变更回调
/**
* 设置视频内容宽高变更回调
* @param listener
*/
void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
public interface OnVideoSizeChangedListener{
/**
* 内容宽高改变时的回调
*
* @param width 视频内容宽,单位为像素
* @param height 视频内容高,单位为像素
*/
void onVideoSizeChanged(int width, int height);
}
获取音量
/**
* 获取音量
* @return 音量范围0~1,0为静音
*/
float getVolume();
获取播放器状态
/**
* 获取播放状态
* @return 状态枚举:
* {@link PlayerState#STATE_IDLE} 播放器初始状态
* {@link PlayerState#STATE_BUFFERING} 缓冲中状态
* {@link PlayerState#STATE_READY} 缓冲结束,开始播放状态
* {@link PlayerState#STATE_ENDED} 播放完成状态
*/
int getPlayState();
获取播放器当前流的连接类型
/**
* 获取播放器当前流的连接类型
* 播放器状态为{@link PlayerState#STATE_READY},即缓冲结束,开始播放状态时调用有效
*
* @return {@link StreamConnectType}
*/
StreamConnectType getStreamConnectType();
获取播放器当前的帧率或码率等信息
/**
* 获取播放器当前的帧率或码率等信息
* 播放器为如下状态时调用有效:
* {@link PlayerState#STATE_BUFFERING}缓冲中状态
* {@link PlayerState#STATE_READY}缓冲结束,开始播放状态
* @return 包含帧率或码率等信息的JSON string
*/
PlayInfo getCurrentPlayInfo();
ZoomableTextureView相关接口
设置画面放大倍数上限
/**
* 设置画面放大倍数上限
* 默认为4倍
*
* @param scale 倍数
*/
void setMaxScale(float scale);
重置画面缩放比例为1
/**
* 重置画面缩放比例为1
*
* @param smooth 是否带有平滑变化效果
*/
void zoomOut(boolean smooth);
获取当前缩放比
/**
* 获取当前缩放比
*
* @return 未放缩时为1.0f
*/
float getScale();
设置监听器
/* 设置监听器
* @param listener
*/
void setOnZoomableTextureListener(OnZoomableTextureListener listener);
public interface OnZoomableTextureListener{
/**
* 当画面缩放比例发生变化时回调
*
* @param zoomableTextureView
* @param scale 画面缩放比例
*/
void onScaleChanged(ZoomableTextureView zoomableTextureView, float scale);
/**
* view双击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理,如果返回false,则会启用内部缩放逻辑
*/
boolean onDoubleTap(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view单击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理
*/
boolean onSingleTapConfirmed(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view长按事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
*/
void onLongPress(ZoomableTextureView zoomableTextureView, MotionEvent e);
}
设置边缘监听器
void setOnViewEdgeListener(OnViewEdgeListener listener)
interface OnViewEdgeListener{
/**
* 当第一次拖动到view的边缘
*/
void onViewEdgeFirstTouched();
/**
* 当拖动到view下边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onBottomEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view上边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onTopEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view右边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onRightEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view左边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onLeftEdge(ZoomableTextureView zoomableTextureView, float delta);
}
设备录像点播播放器接口说明
构造方法
/**
* 构造方法
* @param applicationContext ApplicationContext
*/
VodPlayer(Context applicationContext);
设置非加密播放源
/**
* 设置播放源
* @param url RTMP地址
*/
void setDataSource(String url) throws IllegalArgumentException;
设置加密播放源
/**
* 设置加密播放源(请确保播放源做过AES加密)
* @param url RTMP源地址
* @param isEncrypted 是否是加密源
* @param decryptIv 解密向量,16 byte array
* @param decryptKey 解密密钥,16 byte array
* @throws IllegalArgumentException
*/
void setDataSource(String url, boolean isEncrypted, byte[] decryptIv, byte[] decryptKey) throws IllegalArgumentException;
校验和准备数据
/**
* 校验和准备数据
*/
void prepare();
开始或恢复播放视频
/**
* 开始播放或恢复播放视频
*/
void start();
暂停播放
/**
* 暂停播放,调用start()恢复播放
*/
void pause();
跳转到指定位置
/**
* 跳转到指定位置
* @param position 单位为毫秒
*/
void seekTo(long positionInMs);
停止播放
/**
* 停止播放
*/
void stop();
重置播放器
/**
* 重置播放器
*/
void reset();
释放播放器资源
/**
* 释放播放器资源
*/
void release();
截图
/**
* 当前视频画面截图
* @return 如果当前无画面则返回null
*/
Bitmap snapShot();
截图到文件
/**
* 当前视频画面截图
* @param jpegFile保存截图的JPEG文件
* @return 返回true表示文件保存成功
*/
boolean snapShotToFile(File jpegFile);
开始录屏
/**
* 开始录制当前播放内容,生成MPEG-4格式转存到指定的文件中
* 文件名后缀必须为mp4
* 须在{@link PlayerState#STATE_READY}时调用有效
* @param contentFile
* @return 操作成功与否
*/
boolean startRecordingContent(File contentFile) throws IOException;
获取当前录制的视频时长
/**
* 获取当前录制的视频时长
* @return 单位为毫秒
*/
long getCurrentRecordingContentDuration();
结束录屏
/**
* 停止记录播放内容
* @return 操作成功与否
*/
boolean stopRecordingContent();
设置播放器音量
/**
* 设置播放器音量
* @param audioVolume范围为0~1,0为静音
*/
void setVolume(float audioVolume);
设置音频流通道类型
/**
* 设置音频流通道类型,参见{@link android.media.AudioManager}
* 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
* @param audioStreamType
*/
void setAudioStreamType(int audioStreamType);
设置画面缩放模式
/**
* 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
* @param videoScalingMode 参见:
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
*/
void setVideoScalingMode(int videoScalingMode);
设置播放停止时的画面绘制策略
/**
*设置播放停止时的画面绘制策略
*@param playerStoppedDrawingMode
*ALWAYS_KEEP_LAST_FRAME 播放停止时始终保留最后一帧画面
*KEEP_LAST_FRAME_WITHOUT_ERROR (默认是此模式)只有播放停止后未出现错误时,才保留最后一帧画面
*ALWAYS_BLACK 播放停止时始终显示黑色
*/
void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)
设置SurfaceVview
/**
*设置SurfaceView,必须为GLSurfaceView,同一个Window中同时只允许一个播放器播放,若需要支持多播放实例,请使用TextureView
*注意GLSurfaceView必须在Activity的onResume和onPause回调方法中调用GLSurfaceView的onResume和onPause方法
*GLSurfaceView及其容器不可设置背景色
*@param SurfaceVview
*/
void setSurfaceView(SurfaceView surfaceview);
清除SurfaceView
/**
* 清除SurfaceView
*/
void clearSurfaceView();
设置TextureView
/**
* 设置TextureView,同一个TextureView不可被多个播放器共享,提供ZoomableTextureView带手势放缩处理可做参照
* @param TextureView
*/
void setTextureView(TextureView textureView);
清除TextureView
/**
* 清除TextureView
*/
void clearTextureView();
设置是否由外部完成YUV数据的渲染
/**
* 设置是否由外部完成YUV数据的渲染
* @param useExternalRender true为由外部渲染,false为由内部渲染
*/
void setUseExternalRender(boolean useExternalRender);
获取是否使用外部渲染
/**
* 获取是否使用外部渲染
* @return true为由外部渲染,false为由内部渲染
*/
boolean useExternalRender();
设置外部渲染监听器
/**
* 设置外部渲染监听器
* @param onExternalRenderListener
*/
void setOnExternalRenderListener(OnExternalRenderListener onExternalRenderListener);public interface OnExternalRenderListener{
public interface OnExternalRenderListener{
/**
* 通知已经有YUV数据帧需要被渲染
* @param width 视频帧宽
* @param height 视频帧高
* @param timestamp 时间戳,单位为毫秒
*/
void onVideoFrameUpdate(int width, int height ,long timestamp);
}
获取YUV帧数据用于渲染
/**
* 获取YUV帧数据用于渲染,只在外部渲染模式下有效
* @return Yuv420p格式视频帧
*/
Yuv420pFrame getYuvFrame();
设置SEI信息监听器
/**
* 设置SEI信息监听器
*
* @param seiInfoBuffer 创建用于存储SEI帧数据的缓存,必须保证码流中的SEI信息长度不会超过缓存大小,超过的帧将会被丢弃
* @param onSeiInfoListener
*/
void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener);
interface OnSeiInfoListener{
/**
* 当SEI信息更新时回调
* 请不要执行阻塞的操作,并在该回调中及时处理seiInfoBuffer数据
* @param seiInfoBuffer
*/
void onSeiInfoUpdate(SeiInfoBuffer seiInfoBuffer);
}
设置数据源准备就绪事件监听器
/**
* 设置数据源准备就绪事件监听器
* @param listener
*/
void setOnPreparedListener(OnPreparedListener listener);
interface OnPreparedListener {
/**
* 数据源准备就绪回调
*/
void onPrepared();
}
设置播放器错误事件监听器
/**
* 设置播放器错误事件监听器,错误类型参见:
* {@link PlayerException.SOURCE_ERROR}
* {@link PlayerException.RENDER_ERROR}
* {@link PlayerException.UNEXPECTED_ERROR}
* @param listener
*/
void setOnErrorListener(OnErrorListener listener);
interface OnErrorListener{
/**
* 播放器错误回调,参见
* {@link PlayerException}
* @param exception
*/
void onError(PlayerException exception);
}
设置播放状态变更事件监听器
/**
* 设置播放状态变更事件监听器
* @param listener
*/
void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
interface OnPlayerStateChangedListener{
/**
* 播放器状态变更回调
*
* @param playerState 参见
* {@link PlayerState#STATE_IDLE} 播放器初始状态
* {@link PlayerState#STATE_BUFFERING} 缓冲中状态
* {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
* {@link PlayerState#STATE_ENDED} 播放完成状态
*/
void onPlayerStateChange(int playerState);
}
设置首帧被渲染事件监听器
/**
* 设置首帧被渲染事件监听器
* @param listener
*/
void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
interface OnRenderedFirstFrameListener {
/**
* 首帧被渲染回调
*/
void onRenderedFirstFrame();
}
设置视频内容宽高变更回调
/**
* 设置视频内容宽高变更回调
* @param listener
*/
void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
interface OnVideoSizeChangedListener{
/**
* 内容宽高改变时的回调
*
* @param width 视频内容宽,单位像素
* @param height 视频内容高,单位像素
*/
void onVideoSizeChanged(int width, int height);
}
设置播放到内容结束事件监听器
/**
* 设置播放到内容结束事件监听器
* 收到该事件后,需要调用stop,播放器状态才会切到STATE_END
* @param listener
*/
void setOnCompletionListener(OnCompletionListener listener);
interface OnCompletionListener {
/**
* 播放到文件末尾回调
*/
void onCompletion();
}
获取当前播放进度
/**
* 获取当前播放进度,相对于开始位置的偏移量
* 播放器状态为{@link PlayerState#STATE_READY}时调用有效
* @return 单位MS
*/
long getCurrentPosition();
获取视频总时长
/**
* 获取视频总时长
* 播放器状态为{@link #STATE_READY}时调用有效
* @return 单位MS
*/
long getDuration();
设置回放速率
/**
* 设置播放速率
* 须在{@link PlayerState#STATE_BUFFERING}及{@link PlayerState#STATE_READY}时调用有效
* 非1倍速率下默认关闭声音
* @param speed 只支持1/16、1/8、1/4、1/2、1、2、4、8、16倍速
*/
void setPlaybackSpeed(float speed)
获取音量
/**
* 获取音量
* @return 范围为0~1,0为静音
*/
float getVolume();
获取播放器状态
/**
* 获取播放状态
* @return 状态枚举:
* {@link PlayerState#STATE_IDLE} 播放器初始状态
* {@link PlayerState#STATE_BUFFERING} 缓冲中状态
* {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
* {@link PlayerState#STATE_ENDED} 播放完成状态
*/
int getPlayState();
获取播放器当前流的连接类型
/**
* 获取播放器当前流的连接类型
* 播放器状态为{@link PlayerState#STATE_READY},即缓冲结束开始播放状态时调用有效
* @return {@link StreamConnectType}
*/
StreamConnectType getStreamConnectType();
获取播放器当前的帧率、码率等信息
/**
* 获取播放器当前的帧率、码率等信息
* 播放器状态为以下状态时有效:
* {@link PlayerState#STATE_BUFFERING}:缓冲中状态
* {@link PlayerState#STATE_READY}:缓冲结束开始播放状态
* @return 包含帧率/码率等信息的JSON string
*/
PlayInfo getCurrentPlayInfo();
ZoomableTextureView相关接口
设置画面放大倍数上限
/**
* 设置画面放大倍数上限
* 默认为4倍
*
* @param scale 倍数
*/
void setMaxScale(float scale);
重置画面缩放比例为1
/**
* 重置画面缩放比例为1
*
* @param smooth 是否带有平滑变化效果
*/
void zoomOut(boolean smooth);
获取当前缩放比
/**
* 获取当前缩放比
*
* @return 未放缩时为1.0f
*/
float getScale();
设置监听器
/* 设置监听器
* @param listener
*/
void setOnZoomableTextureListener(OnZoomableTextureListener listener);
public interface OnZoomableTextureListener{
/**
* 当画面缩放比例发生变化时回调
*
* @param zoomableTextureView
* @param scale 画面缩放比例
*/
void onScaleChanged(ZoomableTextureView zoomableTextureView, float scale);
/**
* view双击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理,如果返回false,则会启用内部缩放逻辑
*/
boolean onDoubleTap(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view单击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理
*/
boolean onSingleTapConfirmed(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view长按事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
*/
void onLongPress(ZoomableTextureView zoomableTextureView, MotionEvent e);
}
设置边缘监听器
void setOnViewEdgeListener(OnViewEdgeListener listener)
interface OnViewEdgeListener{
/**
* 当第一次拖动到view的边缘
*/
void onViewEdgeFirstTouched();
/**
* 当拖动到view下边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onBottomEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view上边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onTopEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view右边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onRightEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view左边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onLeftEdge(ZoomableTextureView zoomableTextureView, float delta);
}
HLS播放器
播放器概述
播放器类型
HLS播放协议的播放器,支持MPEG-TS和fMP4容器,AES-128加密方式,包括以下两类播放器:
自研HLS播放器
ExoPlayer HLS播放器
推荐您使用自研HLS播放器。
示例代码
请参考如下示例代码,了解自研HLS播放器和ExoPlayer HLS播放器的使用方法。
自研HLS播放器
HlsPlayer player = new HlsPlayer(getApplicationContext());
// 设置Textureview
player.setTextureView(textureView);
// 设置错误监听
player.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(PlayerException exception){
makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
}
});
// 设置状态监听
player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
@Override
public void onPlayerStateChange(int playerState){
switch (playerState) {
case Player.STATE_BUFFERING:
break;
case Player.STATE_IDLE:
break;
case Player.STATE_READY:
break;
case Player.STATE_ENDED:
break;
default:
break;
}
}
});
// 设置m3u8地址
player.setDataSource("http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear3/prog_index.m3u8");
// 设置数据源就绪监听器
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(){
// 数据源就绪后开始播放
player.start();
}
});
player.prepare();
...
// 暂停播放
player.pause();
...
// 恢复播放
player.start();
...
// 停止播放
player.stop();
...
// 释放播放器资源
player.release();
...
ExoPlayer HLS播放器
ExoHlsPlayer player = new ExoHlsPlayer(getApplicationContext());
// 设置textureview
player.setTextureView(textureView);
// 也可以使用Exo的SimpleExoPlayerView来作为播放器的UI组件
// simpleExoPlayerView.setPlayer(player.getExoPlayer());
// simpleExoPlayerView.requestFocus();
// 设置错误监听
player.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(PlayerException exception){
makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
}
});
// 设置状态监听
player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
@Override
public void onPlayerStateChange(int playerState){
switch (playerState) {
case Player.STATE_BUFFERING:
break;
case Player.STATE_IDLE:
break;
case Player.STATE_READY:
break;
case Player.STATE_ENDED:
break;
default:
break;
}
}
});
// 设置m3u8地址
player.setDataSource("http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear3/prog_index.m3u8");
// 设置数据源就绪监听器
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(){
// 数据源就绪后开始播放
player.start();
}
});
player.prepare();
...
// 暂停播放
player.pause();
...
// 恢复播放
player.start();
...
// 停止播放
player.stop();
...
// 释放播放器资源
player.release();
自研HLS播放器接口说明
构造方法
/**
*构造方法
*@param applicationContext ApplicationContext
*/
HlsPlayer(Context applicationContext);
设置播放地址
/**
* 设置播放源
* @param url HLS播放地址
*/
void setDataSource(String url) throws IllegalArgumentException;
校验和准备数据
/**
* 校验和准备数据
*/
void prepare();
开始或恢复播放视频
/**
* 开始播放或恢复播放视频
*/
void start();
暂停播放
/**
* 暂停播放,调用start()恢复播放
*/
void pause();
跳转到指定位置
/**
* 跳转到指定位置
* @param position 单位为毫秒
*/
void seekTo(long positionInMs);
停止播放
/**
* 停止播放
*/
void stop();
重置播放器
/**
* 重置播放器
*/
void reset();
释放播放器资源
/**
* 释放播放器资源
*/
void release();
截图
/**
* 当前视频画面截图
* @return 如果当前无画面则返回 null
*/
Bitmap snapShot();
截图到文件
/**
* 当前视频画面截图
* @param jpegFile 保存截图为JPEG格式的文件
* @return 返回true表示文件保存成功
*/
boolean snapShotToFile(File jpegFile);
开始录屏
/**
* 开始录制当前播放内容,生成MPEG-4格式转存到指定的文件中
* 文件名后缀必须为.mp4
* 须在{@link PlayerState#STATE_READY},即在缓冲结束开始播放状态时调用有效
* @param contentFile
* @return 返回是否操作成功
*/
boolean startRecordingContent(File contentFile) throws IOException;
获取当前录制的视频时长
/**
* 获取当前录制的视频时长
* @return 单位为毫秒
*/
long getCurrentRecordingContentDuration();
结束录屏
/**
* 停止记录播放内容
* @return 返回是否操作成功
*/
boolean stopRecordingContent();
设置回放速率
/**
* 设置播放速率
* 须在以下状态调用时有效:
*{@link PlayerState#STATE_BUFFERING}:缓冲中状态
*{@link PlayerState#STATE_READY}:缓冲结束开始播放状态
* 非1倍速率下默认关闭声音
* @param speed 只支持1/16、1/8、1/4、1/2、1、2、4、8、16倍速
*/
void setPlaybackSpeed(float speed)
设置播放器音量
/**
* 设置播放器音量
* @param audioVolume 范围为0~1,0为静音
*/
void setVolume(float audioVolume);
设置音频流通道类型
/**
* 设置音频流通道类型,参见{@link android.media.AudioManager}
* 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
* @param audioStreamType
*/
void setAudioStreamType(int audioStreamType);
设置画面缩放模式
/**
* 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
* @param videoScalingMode 参见:
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
*/
void setVideoScalingMode(int videoScalingMode);
设置播放停止时画面的绘制策略
/**
*设置播放停止时画面的绘制策略
*@param playerStoppedDrawingMode
*ALWAYS_KEEP_LAST_FRAME 播放停止时始终保留最后一帧画面
*KEEP_LAST_FRAME_WITHOUT_ERROR 播放停止时只有未出现错误时才保留最后一帧画面(默认是此模式)
*ALWAYS_BLACK 播放停止时始终显示黑色
*/
void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)
设置SurfaceView
/**
*设置SurfaceView,必须为GLSurfaceView,同一个Window中同时只允许一个播放器播放,若需要支持多播放实例,请使用TextureView
*注意GLSurfaceView必须在Activity的onResume和onPause回调方法中调用GLSurfaceView的onResume和onPause方法
*GLSurfaceView及其容器不可设置背景色
*@param surfaceview
*/
void setSurfaceView(SurfaceView surfaceview);
清除SurfaceView
/**
* 清除SurfaceView
*/
void clearSurfaceView();
设置TextureView
/*
* 设置TextureView,同一个TextureView不可被多个播放器共享,提供支持手势操作的控件ZoomableTextureView可做参照
* @param textureview
*/
void setTextureView(TextureView textureView);
清除TextureView
/**
* 清除TextureView
*/
void clearTextureView();
设置是否由外部完成YUV数据的渲染
/**
* 设置是否由外部完成YUV数据的渲染
* @param useExternalRender true为由外部渲染,false为由内部渲染
*/
void setUseExternalRender(boolean useExternalRender);
获取是否使用外部渲染
/**
* 获取是否使用外部渲染
* @return true为由外部渲染,false为由内部渲染
*/
boolean useExternalRender();
设置外部渲染监听器
/**
* 设置外部渲染监听器
* @param onExternalRenderListener
*/
void setOnExternalRenderListener(OnExternalRenderListener onExternalRenderListener);public interface OnExternalRenderListener{
public interface OnExternalRenderListener{
/**
* 通知已经有YUV数据帧需要被渲染
* @param width 视频帧宽
* @param height 视频帧高
* @param timestamp 时间戳,单位为毫秒
*/
void onVideoFrameUpdate(int width, int height ,long timestamp);
}
获取YUV帧数据用于渲染
/**
* 获取YUV帧数据用于渲染,只在外部渲染模式下有效
* @return Yuv420p格式视频帧
*/
Yuv420pFrame getYuvFrame();
设置SEI信息监听器
/**
* 设置SEI信息监听器
*
* @param seiInfoBuffer 创建用于存储SEI帧数据的缓存,必须保证码流中的SEI信息长度不会超过缓存大小,超过的帧将会被丢弃
* @param onSeiInfoListener
*/
void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener);
interface OnSeiInfoListener{
/**
* 当SEI信息更新时回调
* 请不要执行阻塞的操作,并在该回调中及时处理seiInfoBuffer数据
* @param seiInfoBuffer
*/
void onSeiInfoUpdate(SeiInfoBuffer seiInfoBuffer);
}
设置数据源准备就绪事件监听器
/**
* 设置数据源准备就绪事件监听器
* @param listener
*/
void setOnPreparedListener(OnPreparedListener listener);
interface OnPreparedListener {
/**
* 数据源准备就绪回调
*/
void onPrepared();
}
设置播放器错误事件监听器
/**
* 设置播放器错误事件监听器,错误类型参见:
* {@link PlayerException.SOURCE_ERROR}
* {@link PlayerException.RENDER_ERROR}
* {@link PlayerException.UNEXPECTED_ERROR}
* @param listener
*/
void setOnErrorListener(OnErrorListener listener);
interface OnErrorListener{
/**
* 播放器错误回调,参见
* {@link PlayerException}
* @param exception
*/
void onError(PlayerException exception);
}
设置播放状态变更事件监听器
/**
* 设置播放状态变更事件监听器
* @param listener
*/
void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
interface OnPlayerStateChangedListener{
/**
* 播放器状态变更回调
*
* @param playerState 参见
* {@link PlayerState#STATE_IDLE} 播放器初始状态
* {@link PlayerState#STATE_BUFFERING} 缓冲中状态
* {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
* {@link PlayerState#STATE_ENDED} 播放完成状态
*/
void onPlayerStateChange(int playerState);
}
设置首帧被渲染事件监听器
/**
* 设置首帧被渲染事件监听器
* @param listener
*/
void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
interface OnRenderedFirstFrameListener {
/**
* 首帧被渲染回调
*/
void onRenderedFirstFrame();
}
设置视频内容宽高变更回调
/**
* 设置视频内容宽高变更回调
* @param listener
*/
void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
interface OnVideoSizeChangedListener{
/**
* 内容宽高改变时的回调
*
* @param width 视频内容宽,单位为像素
* @param height 视频内容高,单位为像素
*/
void onVideoSizeChanged(int width, int height);
}
设置视频内容播放结束的事件监听器
/**
* 设置视频内容播放结束的事件监听器
* 收到该事件后,需要调用stop方法,播放器状态才会切到STATE_END
* @param listener
*/
void setOnCompletionListener(OnCompletionListener listener);
interface OnCompletionListener {
/**
* 播放至视频文件末尾回调
*/
void onCompletion();
}
获取当前播放进度
/**
* 获取当前播放进度,相对于开始位置的偏移量
* 播放器状态为{@link PlayerState#STATE_READY},即缓冲结束开始播放状态时调用有效
* @return 单位为毫秒
*/
long getCurrentPosition();
获取视频总时长
/**
* 获取视频总时长
* 播放器状态为{@link #STATE_READY},即缓冲结束开始播放状态时调用有效
* @return 单位为毫秒
*/
long getDuration();
获取音量
/**
* 获取音量
* @return 取值范围为0~1,0为静音
*/
float getVolume();
获取播放器状态
/**
* 获取播放状态
* @return 状态枚举:
* {@link PlayerState#STATE_IDLE} 播放器初始状态
* {@link PlayerState#STATE_BUFFERING} 缓冲中状态
* {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
* {@link PlayerState#STATE_ENDED} 播放完成状态
*/
int getPlayState();
获取播放器当前流的连接类型
/**
* 获取播放器当前流的连接类型
* 播放器状态为{@link PlayerState#STATE_READY},即缓冲结束开始播放状态时调用有效
* @return {@link StreamConnectType}
*/
StreamConnectType getStreamConnectType();
获取播放器当前的帧率或码率等信息
/**
* 获取播放器当前的帧率或码率等信息
* 播放器状态为以下状态时调用有效:
* {@link PlayerState#STATE_BUFFERING}:缓冲中状态
* {@link PlayerState#STATE_READY}:缓冲结束开始播放状态
* @return 包含帧率或码率等信息的JSON string
*/
PlayInfo getCurrentPlayInfo();
ZoomableTextureView相关接口
设置画面放大倍数上限
/**
* 设置画面放大倍数上限
* 默认为4倍
*
* @param scale 倍数
*/
void setMaxScale(float scale);
重置画面缩放比例为1
/**
* 重置画面缩放比例为1
*
* @param smooth 是否带有平滑变化效果
*/
void zoomOut(boolean smooth);
获取当前缩放比
/**
* 获取当前缩放比
*
* @return 未放缩时为1.0f
*/
float getScale();
设置监听器
/* 设置监听器
* @param listener
*/
void setOnZoomableTextureListener(OnZoomableTextureListener listener);
public interface OnZoomableTextureListener{
/**
* 当画面缩放比例发生变化时回调
*
* @param zoomableTextureView
* @param scale 画面缩放比例
*/
void onScaleChanged(ZoomableTextureView zoomableTextureView, float scale);
/**
* view双击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理,如果返回false,则会启用内部缩放逻辑
*/
boolean onDoubleTap(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view单击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理
*/
boolean onSingleTapConfirmed(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view长按事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
*/
void onLongPress(ZoomableTextureView zoomableTextureView, MotionEvent e);
}
设置边缘监听器
void setOnViewEdgeListener(OnViewEdgeListener listener)
interface OnViewEdgeListener{
/**
* 当第一次拖动到view的边缘
*/
void onViewEdgeFirstTouched();
/**
* 当拖动到view下边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onBottomEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view上边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onTopEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view右边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onRightEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view左边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onLeftEdge(ZoomableTextureView zoomableTextureView, float delta);
}
ExoPlayer HLS播放器接口说明
构造方法
ExoHlsPlayer(Context context);
设置M3U8播放地址
/**
* 设置播放源
* @param url M3U8地址
*/
void setDataSource(String url);
按云存储录像的文件名设置视频数据源
/**
* 按云存储录像的文件名设置视频数据源
* @param iotId 设备iotId
* @param fileName 录像文件名
*/
void setDataSourceByIPCRecordFileName(String iotId, String fileName);
校验和准备数据
/**
* 校验和准备数据
*/
void prepare();
开始或恢复播放视频
/**
* 开始播放或恢复播放视频
*/
void start();
暂停播放
/**
* 暂停播放, 调用start()恢复播放
*/
void pause();
跳转到指定位置
/**
* 跳转到指定位置
* @param position 单位为毫秒
*/
void seekTo(long positionInMs);
停止播放
**
* 停止播放
*/
void stop();
重置播放器
/**
* 重置播放器
*/
void reset();
释放播放器资源
/**
* 释放播放器资源
*/
void release();
设置是否循环播放
/**
* 设置是否循环播放
* @param circlePlay true为循环播放
*/
void setCirclePlay(boolean circlePlay);
设置回放速率
/**
* 设置回放的播放速率
* @param speed 表示速率因子,取值范围为(0,2],1表示正常速率
*/
void setPlaybackSpeed(float speed);
设置播放器音量
/**
* 设置播放器音量
* @param audioVolume范围为0~1,0为静音
*/
void setVolume(float audioVolume);
设置音频流通道类型
/**
* 设置音频流通道类型,参见{@link android.media.AudioManager}
* 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
* @param audioStreamType
*/
void setAudioStreamType(int audioStreamType);
设置画面缩放模式
/**
* 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
* @param videoScalingMode 参见:
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
* {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
*/
void setVideoScalingMode(int videoScalingMode);
设置SurfaceView
/**
* 设置SurfaceView
* @param surfaceview
*/
void setSurfaceView(SurfaceView surfaceview);
清除SurfaceView
/**
* 清除surfaceview
*/
void clearSurfaceView();
设置TextureView
/**
* 设置TextureView,同一个TextureView不可被多个播放器共享,提供支持手势操作的控件ZoomableTextureView可做参照
* @param textureview
*/
void setTextureView(TextureView textureView);
清除TextureView
/**
* 清除textureview
*/
void clearTextureView();
设置数据源准备就绪事件监听器
/**
* 设置数据源准备就绪事件监听器
* @param listener
*/
void setOnPreparedListener(OnPreparedListener listener);
interface OnPreparedListener {
/**
* 数据源准备就绪回调
*/
void onPrepared();
}
设置播放器错误事件监听器
/**
* 设置播放器错误事件监听器,错误类型参见:
* {@link PlayerException.SOURCE_ERROR}
* {@link PlayerException.RENDER_ERROR}
* {@link PlayerException.UNEXPECTED_ERROR}
* @param listener
*/
void setOnErrorListener(OnErrorListener listener);
interface OnErrorListener{
/**
* 播放器错误回调,参见
* {@link PlayerException}
* @param exception
*/
void onError(PlayerException exception);
}
设置播放状态变更事件监听器
/**
* 设置播放状态变更事件监听器
* @param listener
*/
void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
interface OnPlayerStateChangedListener{
/**
* 播放器状态变更回调
*
* @param playerState 参见
* {@link PlayerState#STATE_IDLE}
* {@link PlayerState#STATE_BUFFERING}
* {@link PlayerState#STATE_READY}
* {@link PlayerState#STATE_ENDED}
*/
void onPlayerStateChange(int playerState);
}
设置首帧被渲染事件监听器
/**
* 设置首帧被渲染事件监听器
* @param listener
*/
void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
interface OnRenderedFirstFrameListener {
/**
* 首帧被渲染回调
*/
void onRenderedFirstFrame();
}
设置视频内容宽高变更回调
/**
* 设置视频内容宽高变更回调
* @param listener
*/
void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
interface OnVideoSizeChangedListener{
/**
* 内容宽高改变时的回调
*
* @param width 视频内容宽,单位为像素
* @param height 视频内容高,单位为像素
*/
void onVideoSizeChanged(int width, int height);
}
获取当前播放进度
/**
* 获取当前播放进度,相对于开始位置的偏移量
* 播放器状态为{@link PlayerState#STATE_READY}时调用有效
* @return 单位MS
*/
long getCurrentPosition();
获取视频总时长
/**
* 获取视频总时长
* 播放器状态为{@link #STATE_READY}时调用有效
* @return 单位MS
*/
long getDuration();
获取音量
/**
* 获取音量
* @return 取值范围0~1
*/
float getVolume();
获取播放器状态
/**
* 获取播放状态
* @return 状态枚举:
* {@link PlayerState#STATE_IDLE} 播放器初始状态
* {@link PlayerState#STATE_BUFFERING} 缓冲中状态
* {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
* {@link PlayerState#STATE_ENDED} 播放完成状态
*/
int getPlayState();
ZoomableTextureView相关接口
设置画面放大倍数上限
/**
* 设置画面放大倍数上限
* 默认为4倍
*
* @param scale 倍数
*/
void setMaxScale(float scale);
重置画面缩放比例为1
/**
* 重置画面缩放比例为1
*
* @param smooth 是否带有平滑变化效果
*/
void zoomOut(boolean smooth);
获取当前缩放比
/**
* 获取当前缩放比
*
* @return 未放缩时为1.0f
*/
float getScale();
设置监听器
/* 设置监听器
* @param listener
*/
void setOnZoomableTextureListener(OnZoomableTextureListener listener);
public interface OnZoomableTextureListener{
/**
* 当画面缩放比例发生变化时回调
*
* @param zoomableTextureView
* @param scale 画面缩放比例
*/
void onScaleChanged(ZoomableTextureView zoomableTextureView, float scale);
/**
* view双击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理,如果返回false,则会启用内部缩放逻辑
*/
boolean onDoubleTap(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view单击事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
* @return 事件是否被处理
*/
boolean onSingleTapConfirmed(ZoomableTextureView zoomableTextureView, MotionEvent e);
/**
* view长按事件回调
*
* @param zoomableTextureView
* @param e MotionEvent
*/
void onLongPress(ZoomableTextureView zoomableTextureView, MotionEvent e);
}
设置边缘监听器
void setOnViewEdgeListener(OnViewEdgeListener listener)
interface OnViewEdgeListener{
/**
* 当第一次拖动到view的边缘
*/
void onViewEdgeFirstTouched();
/**
* 当拖动到view下边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onBottomEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view上边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onTopEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view右边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onRightEdge(ZoomableTextureView zoomableTextureView, float delta);
/**
* 当拖动到view左边缘,持续拖动会持续回调
*
* @param zoomableTextureView
* @param delta 持续处于边缘时触摸移动相对上次的差值
*/
void onLeftEdge(ZoomableTextureView zoomableTextureView, float delta);
}
视频播放错误列表
SOURCE_ERROR
该错误主码表示数据源相关错误。
子码 | 描述 | 解决方法 |
SUB_CODE_SOURCE_STREAM_CONNECT_ERROR(1005) | 与数据源建立连接失败。 | 通常因网络问题引起连接失败,请您确保网络正常后重试。 |
SUB_CODE_SOURCE_INVALID_DECRYPTE_KEY(1006) | 无效的解密密钥。 | 您可忽略该问题,如有需要,可联系和您对接的阿里云技术人员。 |
SUB_CODE_SOURCE_INVALID_RTMP_URL(1007) | 无效的播放地址。 | 您可忽略该问题,如有需要,可联系和您对接的阿里云技术人员。 |
SUB_CODE_SOURCE_PARAMETER_ERROR(1008) | 错误的数据源参数。 | 请检查配置参数是否合法,然后重试。 |
SUB_CODE_SOURCE_QUERY_URL_FAILED(1009) | 请求播放地址失败。 | 请根据错误信息中 |
RENDER_ERROR
该错误主码表示渲染相关错误。
子码 | 描述 | 解决方法 |
SUB_CODE_RENDER_DECODE_ERROR(1000) | 解码错误。 | 若在持续一段时间内,解码均发生失败,您可转存码流数据,然后分析数据。转存的操作步骤如下:
|
UNEXPECTED_ERROR
该错误主码表示不符合预期错误。
子码 | 描述 | 解决方法 |
SUB_CODE_UNEXPECTED_PULL_STREAM_ERROR(1100) | 超过8秒未拉取到流或连接被异常断开。 | 请检查以下项目然后重试:
|
语音对讲
对讲类型
语音对讲的类型及其注意事项如下:
类型 | 说明 | 注意事项 |
单向对讲 | 应用端采集并发送音频数据到设备端进行播放。 | App端采集音频期间手机保持静音。 |
双向对讲 | 应用端和设备端同时采集音频和播放音频。 | 设备端必须支持声学回声消除AEC(Acoustic Echo Cancellation),否则不建议使用该功能。 |
音频类型
语音对讲支持G711a、G711u以及AAC_LC编码方式,三种音频类型详细信息为:
选择编码方式前,请确认您的设备端IPC设备是否支持。
采样率:8 kHz或16 kHz。
支持编码。
支持解码。
操作步骤
创建语音对讲实例,并设置对讲模式和音频参数。
liveIntercomV2 = new LiveIntercomV2(context, "", LiveIntercomV2.LiveIntercomMode.DoubleTalk, AudioParams.AUDIOPARAM_MONO_8K_G711A);
注册监听器,并处理语音对讲回调。
请在对应的事件回调中处理,包括对讲开始、录音开始、录音结束以及录音数据回调。录音数据回调可用于UI展示,如音量计算。
//设置语音对讲错误回调 liveIntercomV2.setLiveIntercomV2Listener(new LiveIntercomV2Listener() { @Override public void onTalkReady() { showToast("可以开始说话了"); } @Override public void onError(LiveIntercomException error) { showToast("code:" + error.getCode() + " msg:" + error.getMessage()); } @Override public void onRecordStart() { //直播播放器设置为静音 player.setVolume(0f); showToast("录音机已启动"); } @Override public void onRecordEnd() { //直播播放器恢复音量 player.setVolume(1f); showToast("录音机结束"); } @Override public void onRecordBufferReceived(byte[] buffer, int offset, int size) { //音频数据,可用于计算和绘制波形图 Log.d(TAG, "onBufferReceived:" + size); } });
设置声音采集的增益值。
增益值包括无、低、中、高、强五种水平,默认值为高,请您根据设备效果来调整。
liveIntercomV2.setGainLevel(LiveIntercomV2.GAIN_LEVEL_NONE); //设置增益值为无
开始对讲与停止对讲。
开始对讲:请求音频焦点,并设置为通话模式,同时将对端播放声音强制路由至扬声器,若已连接蓝牙耳机或者线控耳机则路由至耳机上。
停止对讲:释放音频焦点,并设置为常规模式,同时取消强制音频播放路由至扬声器或耳机。对讲过程中默认开启手机回声消除。
//开始对讲请求,请求参数由QueryVoiceIntercom接口返回 LiveIntercomRequest liveIntercomRequest = new LiveIntercomRequest(); liveIntercomRequest.setIv(android.util.Base64.decode(obj.getJSONObject("Data").getJSONObject("CryptoKey").getString("Iv"), NO_PADDING)); liveIntercomRequest.setKey(android.util.Base64.decode(obj.getJSONObject("Data").getJSONObject("CryptoKey").getString("Key"), NO_PADDING)); liveIntercomRequest.setUrl(obj.getJSONObject("Data").getString("Url")); liveIntercomV2.startWithExternalRequest(liveIntercomRequest); //主动停止 liveIntercomV2.stop();
说明QueryVoiceIntercom接口详细信息,请参考QueryVoiceIntercom。
构造方法
/**
* 创建对讲实例
*
* @param context application context
* @param iotId 设备的iotId,物联网平台为设备颁发的唯一标识符。此处置空不填写。
* @param liveIntercomMode 对讲模式,单讲SingleTalk、对讲DoubleTalk
* @param audioParams 音频参数(包括采样率、通道数、采样位宽和编码格式)
*/
LiveIntercomV2(Context context, final String iotId, final LiveIntercomMode liveIntercomMode, final AudioParams audioParams);
开始语音对讲
/**
* 开始对讲,建立对讲通道,开启录音和播放
* @param liveIntercomRequest 包括URL,Key和Iv信息,该信息由QueryVoiceIntercom接口获取
*/
void startWithExternalRequest(LiveIntercomRequest liveIntercomRequest);
QueryVoiceIntercom接口详细信息,请参考QueryVoiceIntercom。
关闭语音对讲
/**
* 关闭语音对讲,停止录音,关闭对讲通道,停止播放
*/
void stop();
释放对讲实例
/**
* 释放对讲实例
*/
void release();
设置静音
/**
* 设置静音
*
* @param mute true为静音,false为取消静音
*/
void setMute(boolean mute)
当前对讲是否静音
/**
* 当前对讲是否静音
*
* @return
*/
boolean isMute()
设置增益水平
/**
* 设置增益水平
*
* @param gainLevel
*/
void setGainLevel(int gainLevel)
设置是否开启支持蓝牙耳机和线控耳机
/**
* 设置是否开启支持蓝牙耳机和线控耳机,开启后优先使用外设进行录放音,默认支持
* @param supportExternalHeadset 是否支持
*/
void setSupportExternalHeadset(boolean supportExternalHeadset);
设置对讲监听器
/**
* 设置对讲监听器
*
* @param listener
*/
void setLiveIntercomV2Listener(LiveIntercomV2Listener listener);
interface LiveIntercomV2Listener {
/**
* 语音对讲对端就绪
*/
void onTalkReady();
/**
* 语音对讲发生错误
* @param error
*/
void onError(LiveIntercomException error);
/**
* 开始录音
*/
void onRecordStart();
/**
* 结束录音
*/
void onRecordEnd();
/**
* 接收录音数据
* @param buffer
* @param offset
* @param size
*/
void onRecordBufferReceived(byte[] buffer, int offset, int size);
}
错误信息 | 描述 | 解决方法 |
| 无效的语音对讲音频参数,即语音对讲功能接收端上报的音频参数,Android应用端SDK不支持。 | 请确保设备端和Android应用端支持如下音频格式并重试:
|
| 启动语音对讲失败。 | 检查并修复以下异常,然后重试:
|
| 建立语音流失败。 | 检查并修复以下异常,然后重试:
|
| 发送语音流数据失败。 | 网络环境异常,请切换至良好的网络环境中并重试。 |
| 接收语音流数据失败。 | 网络环境异常,请切换至良好的网络环境中并重试。 |
| 初始化录音机失败。 | 检查并修复以下异常,然后重试:
|
| 启动录音机错误。 | 检查是否有其它应用占用了录音机,终止应用进程并重试。 |
| 读取录音数据错误。 | 录音机异常,需重启应用端设备,例如重启手机。 |
| 创建音频播放器失败。 | 录音机异常,需重启应用端设备,例如重启手机。 |