更新时间:2024-09-14 03:01:15下载pdf
除了 实时视频直播 和 存储卡视频回放 以外,IPC SDK 还提供了一些额外的音视频功能,例如本地录制、视频截图、实时对讲、切换清晰度等。
当视频成功开始播放以后(可以是视频直播或者存储卡视频回放),可以将当前正在播放的视频录制到手机中。
MediaStore
API。录制视频需要写存储卡权限。
接口说明
int startRecordLocalMp4(String folderPath, Context context, OperationDelegateCallBack callBack);
参数说明
参数 | 说明 |
---|---|
folderPath | 保存视频的文件路径 |
context | 上下文 |
callBack | 操作回调 |
示例代码
private IThingSmartCameraP2P mCameraP2P;
if (Constants.hasStoragePermission()) {
String picPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Camera/";
File file = new File(picPath);
if (!file.exists()) {
file.mkdirs();
}
mCameraP2P.startRecordLocalMp4(picPath, CameraPanelActivity.this, new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
isRecording = true;
mHandler.sendEmptyMessage(MSG_VIDEO_RECORD_BEGIN);
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
mHandler.sendEmptyMessage(MSG_VIDEO_RECORD_FAIL);
}
});
recordStatue(true);
} else {
Constants.requestPermission(CameraPanelActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, Constants.EXTERNAL_STORAGE_REQ_CODE, "open_storage");
}
接口说明
int stopRecordLocalMp4(OperationDelegateCallBack callBack);
参数说明
参数 | 说明 |
---|---|
callBack | 操作回调 |
示例代码
mCameraP2P.stopRecordLocalMp4(new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
//成功
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
//失败
}
});
截取实时视频的影像图片存储到手机上。
如果需要将截图保存至系统相册,需要您自己实现。注意,Android 10 开始采用 分区存储 机制(可禁用,但 Android 11 强制使用),保存媒体文件至系统相册需使用 MediaStore
API。
接口说明
int snapshot(String absoluteFilePath, Context context, OperationDelegateCallBack callBack);
参数说明
参数 | 说明 |
---|---|
absoluteFilePath | 图片存储路径 |
context | 上下文 |
callBack | 操作回调 |
示例代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Camera/";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
picPath = path;
}
mCameraP2P.snapshot(picPath, CameraPanelActivity.this, new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
//data 返回的是文件路径
mHandler.sendMessage(MessageUtil.getMessage(MSG_SCREENSHOT, ARG1_OPERATE_SUCCESS, data));
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
mHandler.sendMessage(MessageUtil.getMessage(MSG_SCREENSHOT, ARG1_OPERATE_FAIL));
}
});
当视频成功开始播放(视频直播或者视频回放)以后,可以开启视频声音。声音默认是关闭状态。
接口说明
开启或关闭视频声音。
void setMute(int mute, OperationDelegateCallBack callBack);
参数说明
参数 | 说明 |
---|---|
mute | 音频模式
|
示例代码
mCameraP2P.setMute(1, new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
//data 返回的是对应操作之后的结果值
previewMute = Integer.valueOf(data);
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
}
});
接口说明
切换扬声器和听筒模式。P2P 1.0 设备不支持此接口。
void setLoudSpeakerStatus(boolean enable);
参数说明
参数 | 说明 |
---|---|
enable |
|
接口说明
设置变声类型。
void setAudioEffect(@AudioEffect int type);
参数说明
参数 | 说明 |
---|---|
type | 变声类型 |
AudioEffect
枚举值 | 说明 |
---|---|
NONE | 原声 |
BOY | 哥哥音 |
UNCLE | 大叔音 |
ROBOT | 机器人音 |
GIRL | 萝莉音 |
在 P2P 连接成功后,可以开启与设备的实时通话功能,在开始对讲前,请确保 App 已获得手机麦克风的访问权限。
打开手机声音,传输给摄像机操作。
示例代码
if (Constants.hasRecordPermission()) {
mCameraP2P.startAudioTalk(new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
isSpeaking = true;
ToastUtil.shortToast(CameraPanelActivity.this, "start talk success");
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
isSpeaking = false;
ToastUtil.shortToast(CameraPanelActivity.this, "operation fail");
}
});
} else {
Constants.requestPermission(CameraPanelActivity.this, Manifest.permission.RECORD_AUDIO, Constants.EXTERNAL_AUDIO_REQ_CODE, "open_recording");
}
关闭手机声音,传输给摄像机操作。
示例代码
mCameraP2P.stopAudioTalk(new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
isSpeaking = false;
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
isSpeaking = false;
}
});
对讲和录制是互斥的,而且只有在影像预览时可以开启对讲。
在实时视频直播时,打开视频声音,则播放的声音即为摄像机实时采集的人声与环境声音。此时打开 App 到摄像机的声音通道,即可实现双向对讲功能。
部分摄像机可能没有扬声器或者拾音器,此类摄像机无法实现双向对讲。
单向对讲功能需要您来实现控制:
在实时视频直播时,可以切换清晰度。目前只有高清和标清两种清晰度,少数 IPC 设备仅支持一种清晰度。
只有实时视频直播才支持切换清晰度。存储卡视频录像在录制时,只会保存一种清晰度的视频流。
纯音频模式需要设备支持。
参数说明
参数 | 说明 |
---|---|
clarity | 清晰度模式
|
获取摄像机传过来的影像清晰度。
示例代码
mCameraP2P.getVideoClarity(new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
}
});
请在影像预览(startPreview
)画面出来后,再调取该函数。
设置摄像机播放的影像清晰度。
示例代码
mCameraP2P.setVideoClarity(2, new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
videoClarity = Integer.valueOf(data);
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
}
});
IPC SDK 提供访问视频裸流数据的回调方法,此方法返回视频帧的 YUV 数据,颜色编码格式为 YUV 420sp。
接口说明
接收视频帧回调需要在 AbsP2pCameraListener
向 IThingSmartCameraP2P
注册监听器,您只需要重写自己关心的回调即可。
void registerP2PCameraListener(AbsP2pCameraListener listener);
接口说明
public void onReceiveFrameYUVData(int sessionId, ByteBuffer y, ByteBuffer u, ByteBuffer v, int width, int height, int nFrameRate, int nIsKeyFrame, long timestamp, long nProgress, long nDuration, Object camera)
参数说明
参数 | 说明 |
---|---|
Y | 视频 Y 数据 |
u | 视频 U 数据 |
v | 视频 V 数据 |
width | 视频画面的宽 |
height | 视频画面的高 |
nFrameRate | 帧率 |
nIsKeyFrame | 是否为 I 帧 |
timestamp | 时间戳 |
nProgress | 时间进度,消息中心视频播放的进度 |
nDuration | 视频时长,消息中心视频播放时长 |
接口说明
public void onSessionStatusChanged(Object camera, int sessionId, int sessionStatus)
参数说明
参数 | 说明 |
---|---|
sessionId | P2P 连接通道 ID |
sessionStatus | P2P 连接通道状态:
|
示例代码
private IThingSmartCameraP2P mCameraP2P;
@Override
protected void onResume() {
super.onResume();
if (null != mCameraP2P) {
//注册 P2P 监听器
mCameraP2P.registerP2PCameraListener(p2pCameraListener);
}
}
@Override
protected void onPause() {
super.onPause();
if (null != mCameraP2P) {
//注销 P2P 监听器
mCameraP2P.removeOnP2PCameraListener(p2pCameraListener);
}
}
private AbsP2pCameraListener p2pCameraListener = new AbsP2pCameraListener() {
@Override
public void onSessionStatusChanged(Object o, int i, int i1) {
super.onSessionStatusChanged(o, i, i1);
//连接状态变化时回调
}
};
禁止在 onSessionStatusChanged
回调线程里调用其他 API。否则,可能会造成死锁。
如果您需要对 App 采集的音频数据做额外处理,例如变声等,IPC SDK 提供 App 采集音频数据的回调方法,且音频已经过回声消除处理。接收音频回调需要向 IThingSmartCameraP2P
注册监听器。
接口说明
注册监听器。
void registerSpeakerEchoProcessor(ISpeakerEchoProcessor processor);
接口说明
注销监听器。
void unregisterSpeakerEchoProcessor();
接口说明
音频数据处理后,传给设备播放。
void sendAudioTalkData(byte[] outbuf, int length);
参数说明
参数 | 说明 |
---|---|
outbuf | 音频数据字节数组 |
length | 数据长度 |
示例代码
mCameraP2P.registerSpeakerEchoProcessor(new ISpeakerEchoProcessor() {
@Override
public void receiveSpeakerEchoData(ByteBuffer pcm, int sampleRate) {
// pcm 数据; 采样率
}
});
在视频直播的过程中,如果设备检查到移动物体,智能画框 会在对应的物体上标记一个白色的矩形框。
首先,您需要开启设备的智能画框功能。开启后,设备会随着视频帧发送移动物体的坐标,通过 DP 198
(ipc_object_outline
)来开启设备端的智能画框功能。设备控制接口功能,请参考 设备控制。
在设备端智能画框功能开启的前提下,直播视频播放时,您需要打开 IPC SDK 的智能画框功能。SDK 会根据设备发送的移动物体坐标,在视频图像上绘制矩形框。
接口说明
智能画框功能开关,通常在影像预览 startPreview
或设置清晰度 setVideoClarity
后调用。
void setEnableIVA(boolean enableIVA);
参数说明
参数 | 说明 |
---|---|
enable | 是否开启智能画框 |
通过设置智能画框的属性来控制框的样式,例如框的颜色,画笔宽度,闪烁频率等。
接口说明
智能画框属性设置,结合设备上报的 SEI(Supplemental Enhancement Information)信息,通过传入指定格式的 JSON 字符串来实现。
void setSmartRectFeatures(String rectFeatures);
参数说明
参数 rectFeatures
为 JSON 格式字符串,格式约定:
{
"SmartRectFeature":[
{
"type":0,
"index":0,
"brushWidth":1,
"flashFps":{
"drawKeepFrames":2,
"stopKeepFrames":2
},
"rgb":0xFF0000,
"shape":0
},
{
"type":0,
"index":1,
"brushWidth":2,
"flashFps":{
"drawKeepFrames":3,
"stopKeepFrames":2
},
"rgb":0x00FF00,
"shape":1
}
]
}
参数 | 类型 | 说明 |
---|---|---|
SmartRectFeature | Array | 固定标识,支持数组格式(表示多个框的设置),必传 |
type | Int | 画框类型
|
index | Int | 框的索引,对应 SEI 信息里面的 od 的每个 ID 值 |
shape | Int | 矩形框形状
|
rgb | Int | 矩形框颜色,由 RGB 格式转化,默认为 0xFC4747,取值范围 0x000000~0xFFFFFF |
brushWidth | Int | 矩形框画笔粗细
|
flashFps | String | 矩形框闪烁频率
|
SEI 协议定义
与设备侧约定协议,IPC SDK 解析 SEI 上报的信息,在对应的位置结合相应的属性进行画框。
{
"AGTX":{
"time":6885,
"chn":0,
"key":1,
"iva":{
"od":[
{
"obj":{
"id":0,
"type":1,
"twinkle":1,
"rect":[
0,0,
25,25,
50,50,
80, 80,
100,100
],
"vel":[0,10],
"cat":"PEDESTRIAN"
}
},
{
"obj":{
"id":1,
"type":1,
"twinkle":1,
"rect":[
0,0,
100,100
],
"vel":[0,10],
"cat":"PEDESTRIAN"
}
}
]
}
}
}
设备上报解析 iva
下相关参数说明:
参数 | 说明 |
---|---|
id | 多个画框数据的索引序号 |
type | 画框类型:
|
twinkle | 闪动设置:
|
rect | 每两个数字表示一个点的坐标,所有点按顺时针顺序排列,SDK 会将这些点画成一个封闭的多边形,2 个点即可表示一个矩形框 |
SEI 协议中的 rect
坐标点通常是 App 通过 设备控制 DP 设置传递给设备的,坐标锚点数据约定协议:
偶数位是横(x)坐标上的百分比分子。
奇数位是纵(y)坐标上的百分比分子。
数值最大为 100,奇偶成对出现。
视频解码后,可通过设置对画面渲染再处理,支持拉伸或缩放,左右或上下镜像,90、180、270 度旋转等。
接口说明
void setDeviceFeatures(String renderFeatures);
参数说明
参数 renderFeatures
为 JSON 格式 字符串,格式约定:
{
"DecPostProcess":{
"video":[
{
"restype":"4",
"oldres":"944*1080",
"newres":"1920*1080"
},
{
"restype":"2",
"oldres":"944*1080",
"newres":"1920*1080"
}
],
"mirror":0,
"rotation":2
}
}
参数 | 说明 |
---|---|
DecPostProcess | 固定标识,必传 |
video | 视频分辨率,数组,支持多组分辨率设置:
|
mirror | 镜像设置
|
rotation | 旋转角度
|
使用手机本地摄像头功能,包括打开/停止采集,发送/停止发送/暂停发送/恢复发送设备数据,切换前后置镜头等能力。
初始化本地摄像头,并开启摄像头采集数据。
需要在主线程调用,并赋予 Manifest.permission.CAMERA
权限。
接口说明
打开本地摄像头并开启采集,返回 Boolean 值判断是否开启成功。通过IRegistorIOTCListener#receiveLocalVideoFrame(int sessionId, ByteBuffer y, ByteBuffer u, ByteBuffer v, int width, int height)
,进行数据回调。
@MainThread
@RequiresPermission(Manifest.permission.CAMERA)
boolean startVideoCapture();
@MainThread
@RequiresPermission(Manifest.permission.CAMERA)
boolean startVideoCapture(int width, int height, int frameRate);
参数说明
参数 | 说明 |
---|---|
width | 采集视频的宽度 |
height | 采集视频的高度 |
frameRate | 帧率 |
接口说明
关闭本地摄像头。
void stopVideoCapture();
切换前置/后置摄像头。
需要在主线程调用。
接口说明
切换本地摄像头前后置镜头,返回 Boolean 值判断是否切换成功。
boolean switchCamera();
参考 实时视频直播,创建播放器,实现接口 IRegistorIOTCListener#receiveLocalVideoFrame(int sessionId, ByteBuffer y, ByteBuffer u, ByteBuffer v, int width, int height)
,绑定 P2P 对象,可完成本地视频渲染。
示例代码
本地摄像头播放器。继承自 YUV 播放器,实现本地播放。
public class LocalCameraMonitor extends YUVMonitorTextureView implements IRegistorIOTCListener {
public LocalCameraMonitor(Context context) {
this(context, null);
}
public LocalCameraMonitor(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void receiveFrameYUVData(int sessionId, ByteBuffer y, ByteBuffer u, ByteBuffer v, ThingVideoFrameInfo videoFrameInfo, Object camera) {
}
@Override
public void receiveLocalVideoFrame(int sessionId, ByteBuffer y, ByteBuffer u, ByteBuffer v, int width, int height) {
updateFrameYUVData(y, u, v, width, height);
}
@Override
public void receivePCMData(int sessionId, ByteBuffer pcm, ThingAudioFrameInfo audioFrameInfo, Object camera) {
}
@Override
public void onSessionStatusChanged(Object camera, int sessionId, int sessionStatus) {
}
}
在 P2P 通道建立成功之后,开启视频对讲功能,可将本地视频发送到设备端。
接口说明
void startVideoTalk(OperationDelegateCallBack callBack);
关闭视频对讲功能,断开本地视频与设备数据传输通道(非断开 P2P)。
接口说明
void stopVideoTalk(OperationDelegateCallBack callBack);
暂停视频对讲功能。
接口说明
void pauseVideoTalk(OperationDelegateCallBack callback);
恢复视频对讲功能。
接口说明
void resumeVideoTalk(OperationDelegateCallBack callback);
接口说明
double getVideoBitRateKbps();
示例代码
double rate = mCameraP2P.getVideoBitRateKbps();
接口说明
渲染器默认支持双击放大,进行设置开启或者关闭。
public void setCameraViewDoubleClickEnable(boolean enable);
示例代码
ThingCameraView mVideoView = findViewById(R.id.camera_video_view);
mVideoView.setCameraViewDoubleClickEnable(false);
接口说明
ICameraConfigInfo
为设备能力类,它包含了多种设备功能接口。
ICameraConfigInfo getCameraConfig(String devId);
示例代码
IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
ICameraConfigInfo cameraConfig = cameraInstance.getCameraConfig(devId);
if (cameraConfig != null) {
int videoNum = cameraConfig.getVideoNum();
}
}
接口说明
设备支持的码流数量,如果等于 1
,表示设备只支持高清或者标清,通过默认清晰度来获取设备支持的码流。
int getVideoNum();
接口说明
设备默认清晰度,如果设备只支持 1 路码流,也表示设备唯一支持的清晰度。
int getDefaultDefinition();
接口说明
设备是否有扬声器,有扬声器,表示设备支持对讲。
boolean isSupportSpeaker();
接口说明
设备是否有拾音器,有拾音器,表示设备的视频有声音。
boolean isSupportPickup();
接口说明
int getDefaultTalkBackMode();
接口说明
是否可以切换对讲方式,可以切换,表示设备即可以单向对讲,也可以双向对讲。
boolean isSupportChangeTalkBackMode();
接口说明
获取 P2P 配置的原始数据。
String getRawDataJsonStr();
接口说明
List<Integer> getSupportPlaySpeedList();
返回值
返回值对应 ThingIPCConstant
常量:
ThingIPCConstant 常量 | 返回值 | 说明 |
---|---|---|
ThingIPCConstant.THING_SPEED_05TIMES | 0 | 0.5 倍速 |
ThingIPCConstant.THING_SPEED_10TIMES | 1 | 1 倍速 |
ThingIPCConstant.THING_SPEED_20TIMES | 3 | 2 倍速 |
ThingIPCConstant.THING_SPEED_40TIMES | 7 | 4 倍速 |
ThingIPCConstant.THING_SPEED_80TIMES | 8 | 8 倍速 |
ThingIPCConstant.THING_SPEED_160TIMES | 9 | 16 倍速 |
ThingIPCConstant.THING_SPEED_320TIMES | 10 | 32 倍速 |
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈