音视频功能

更新时间:2024-09-14 03:01:15下载pdf

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

本地录制

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

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

示例代码

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

设置变声

接口说明

设置变声类型。

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 清晰度模式
  • 2:标清
  • 4:高清
  • 8:超清
  • 0xFFFF:纯音频模式

获取清晰度

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

示例代码

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

​    }

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

​    }

});

请在影像预览(startPreview)画面出来后,再调取该函数。

设置清晰度

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

示例代码

mCameraP2P.setVideoClarity(2, new OperationDelegateCallBack() {

​    @Overridepublic void onSuccess(int sessionId, int requestId, String data) {
​        videoClarity = Integer.valueOf(data);
​    }

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

});

裸流数据

IPC SDK 提供访问视频裸流数据的回调方法,此方法返回视频帧的 YUV 数据,颜色编码格式为 YUV 420sp。

注册接收视频帧回调

接口说明

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

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 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 198ipc_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 画框类型
  • 0:智能画框(默认)
  • 1:越线告警框
index Int 框的索引,对应 SEI 信息里面的 od 的每个 ID 值
shape Int 矩形框形状
  • 0:闭合矩形框
  • 1:只画 4 个角
rgb Int 矩形框颜色,由 RGB 格式转化,默认为 0xFC4747,取值范围 0x000000~0xFFFFFF
brushWidth Int 矩形框画笔粗细
  • 0:细
  • 1:中
  • 2:粗
flashFps String 矩形框闪烁频率
  • drawKeepFrames:表示绘制的帧数
  • stopKeepFrames:表示暂停绘制的帧数

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 画框类型:
  • 0:闭合矩形框
  • 1:只画 4 个角
twinkle 闪动设置:
  • 0:表示关闭(框一直在)
  • 1:表示开启(SDK 按传入频率闪烁)
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 视频分辨率,数组,支持多组分辨率设置:
  • restype 为清晰度类型
  • oldres 为设备上报原始视频的大小
  • newres 期望拉伸或缩放后视频大小
mirror 镜像设置
  • 0:不变化
  • 1:左右镜像
  • 2:上下镜像
rotation 旋转角度
  • 0:不旋转
  • 1:旋转 90 度
  • 2:旋转 180 度
  • 3:旋转 270 度

本地视频

使用手机本地摄像头功能,包括打开/停止采集,发送/停止发送/暂停发送/恢复发送设备数据,切换前后置镜头等能力。

打开摄像头

初始化本地摄像头,并开启摄像头采集数据。

需要在主线程调用,并赋予 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 配置的原始数据

接口说明

获取 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 倍速