更新时间:2023-05-22 06:38:31下载pdf
除了 实时视频直播 和 存储卡视频回放 以外,IPC SDK 还提供了一些额外的音视频功能,例如本地录制、视频截图、实时对讲、切换清晰度等。
当视频成功开始播放以后(可以是视频直播或者存储卡视频回放),可以将当前正在播放的视频录制到手机中。
MediaStore
API。录制视频需要写存储卡权限。
接口说明
int startRecordLocalMp4(String folderPath, Context context, OperationDelegateCallBack callBack);
参数说明
参数 | 说明 |
---|---|
folderPath | 保存视频的文件路径 |
context | 上下文 |
callBack | 操作回调 |
示例代码
private ITuyaSmartCameraP2P 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);
mHandler.sendMessage(MessageUtil.getMessage(MSG_MUTE, ARG1_OPERATE_SUCCESS));
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
mHandler.sendMessage(MessageUtil.getMessage(MSG_MUTE, ARG1_OPERATE_FAIL));
}
});
接口说明
切换扬声器和听筒模式,P2P 1.0 设备不支持此接口。
void setLoudSpeakerStatus(boolean enable);
参数说明
参数 | 说明 |
---|---|
enable |
|
在 P2P 连接成功后,可以开启与设备的实时通话功能,在开始对讲前,请确保 App 已获得手机麦克风的访问权限。
设备具备 扬声器,代表支持单向对讲。设备同时具有扬声器和 拾音器,代表视频有声音,即支持双向对讲。
打开手机声音,传输给摄像机操作。
示例代码
if (Constants.hasRecordPermission()) {
mCameraP2P.startAudioTalk(new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
isSpeaking = true;
mHandler.sendMessage(MessageUtil.getMessage(MSG_TALK_BACK_BEGIN, ARG1_OPERATE_SUCCESS));
ToastUtil.shortToast(CameraPanelActivity.this, "start talk success");
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
isSpeaking = false;
mHandler.sendMessage(MessageUtil.getMessage(MSG_TALK_BACK_BEGIN, ARG1_OPERATE_FAIL));
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;
mHandler.sendMessage(MessageUtil.getMessage(MSG_TALK_BACK_OVER, ARG1_OPERATE_SUCCESS));
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
isSpeaking = false;
mHandler.sendMessage(MessageUtil.getMessage(MSG_TALK_BACK_OVER, ARG1_OPERATE_FAIL));
}
});
对讲和录制是互斥的,而且只有在预览时可以开启对讲。
在实时视频直播时,打开视频声音,此时播放的声音即为摄像机实时采集的人声与环境声音,此时打开 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) {
}
});
预览画面出来后,调取该函数。
设置摄像机播放的影像清晰度。
示例代码
mCameraP2P.setVideoClarity(2, new OperationDelegateCallBack() {
@Override
public void onSuccess(int sessionId, int requestId, String data) {
videoClarity = Integer.valueOf(data);
mHandler.sendMessage(MessageUtil.getMessage(MSG_GET_CLARITY, ARG1_OPERATE_SUCCESS));
}
@Override
public void onFailure(int sessionId, int requestId, int errCode) {
mHandler.sendMessage(MessageUtil.getMessage(MSG_GET_CLARITY, ARG1_OPERATE_FAIL));
}
});
接口说明
double getVideoBitRateKbps();
示例代码
double rate = mCameraP2P.getVideoBitRateKbps();
接口说明
渲染器默认支持双击放大。
public void setCameraViewDoubleClickEnable(boolean enable);
示例代码
TuyaCameraView mVideoView = findViewById(R.id.camera_video_view);
mVideoView.setCameraViewDoubleClickEnable(false);
IPC SDK 提供访问视频裸流数据的回调方法,此方法返回视频帧的 YUV 数据,颜色编码格式为 YUV 420sp。
接口说明
接收视频帧回调需要在 AbsP2pCameraListener
向 ITuyaSmartCameraP2P
注册监听器,您只需要重写自己关心的回调即可。
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 ITuyaSmartCameraP2P 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();
}
}
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 采集音频数据的回调方法,且音频已经过回声消除处理。接收音频回调需要向 ITuyaSmartCameraP2P
注册监听器。
接口说明
注册监听器。
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 SDK 的智能画框功能,SDK 会根据设备发送的移动物体坐标在视频图像上绘制矩形框。
接口说明
智能画框功能开关。
void setEnableIVA(boolean enableIVA);
参数说明
参数 | 说明 |
---|---|
enable | 是否开启智能画框 |
接口说明
ICameraConfigInfo
为设备能力类,它包含了多种设备功能接口。
ICameraConfigInfo getCameraConfig(String devId);
示例代码
ITuyaIPCCore cameraInstance = TuyaIPCSdk.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();
返回值说明
返回值 | 说明 |
---|---|
0 | 0.5 倍速 |
1 | 1 倍速 |
3 | 2 倍速 |
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈