音视频功能

更新时间:2023-03-29 02:40:46下载pdf

除了 实时视频直播存储卡视频回放 以外,IPC SDK 还提供了一些额外的音视频功能,例如本地录制、视频截图、实时对讲、切换清晰度等。

本地录制

当视频成功开始播放以后(可以是视频直播或者存储卡视频回放),可以将当前正在播放的视频录制到手机中。

  • 在视频录制的过程中,请不要再切换视频清晰度,开关声音及对讲。否则,可能会出现录制失败。建议在录制视频时,将切换视频清晰度、开关声音、对讲等设置为不可操作状态 。
  • 如果需要将录制的视频保存至系统相册,需要您自己实现。注意,从 Android 10 开始,采用 分区存储 机制(可禁用,但 Android11 强制使用),保存媒体文件至系统相册需使用 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 音频模式
  • 1:开启静音
  • 0:关闭静音

示例代码

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
  • true:切换成扬声器播放
  • false:切换成听筒播放

实时对讲

在 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 清晰度模式
  • 2:标清
  • 4:高清

获取清晰度

获取摄像机传过来的影像清晰度。

示例代码

mCameraP2P.getVideoClarity(new OperationDelegateCallBack() {
​    @Overridepublic void onSuccess(int sessionId, int requestId, String data) {

​    }

​    @Overridepublic void onFailure(int sessionId, int requestId, int errCode) {

​    }

});

预览画面出来后,调取该函数。

设置清晰度

设置摄像机播放的影像清晰度。

示例代码

mCameraP2P.setVideoClarity(2, new OperationDelegateCallBack() {

​    @Overridepublic void onSuccess(int sessionId, int requestId, String data) {
​        videoClarity = Integer.valueOf(data);
​        mHandler.sendMessage(MessageUtil.getMessage(MSG_GET_CLARITY, ARG1_OPERATE_SUCCESS));
​    }

​    @Overridepublic 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。

接口说明

接收视频帧回调需要在 AbsP2pCameraListenerITuyaSmartCameraP2P 注册监听器,您只需要重写自己关心的回调即可。

void registerP2PCameraListener(AbsP2pCameraListener listener);

回调视频 YUV 数据

接口说明

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 视频时长,消息中心视频播放时长

P2P 链接状态回调

接口说明

public void onSessionStatusChanged(Object camera, int sessionId, int sessionStatus)

参数说明

参数 说明
sessionId P2P 链接通道 ID
sessionStatus P2P 链接通道状态:
  • 0:连接成功
  • -3:连接超时
  • -12:连接被设备关闭
  • -13:连接无响应超时关闭

示例代码

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 配置的原始数据

接口说明

获取 P2P 配置的原始数据。

String getRawDataJsonStr();

查询设备支持的播放倍速

接口说明

List<Integer> getSupportPlaySpeedList();

返回值说明

返回值 说明
0 0.5 倍速
1 1 倍速
3 2 倍速