1. 概述

Peergine中间件在常用的操作系统平台上,都支持了视频采集和压缩功能。视频采集通常调用操作系统的标准API,压缩使用软件编码。

       但在一些专用的设备上,视频采集API专有,不标准。而且,设备上可能支持硬件压缩,编解码器的API也是专有。这使得Peergine不能应用在更多专用的设备上,因而,Peergine中间件开放一套视频I/O接口,让应用程序可以在中间件外部采集视频并且进行压缩编码,然后再输入到Peergine中间件里面来。这样一来,Peergine中间件的系统环境适应性就有了很大的增强。本文所述的扩展输入输出接口在系统中的位置如下图所示:

扩展接口层次结构图

       扩展输入输出接口分为5套接口,分别是:

1)视频输入接口,在头文件pgLibDevVideoIn.h中声明。

2)视频输出接口,在头文件pgLibDevVideoOut.h中声明。

3)音频输入接口,在头文件pgLibDevAudioIn.h中声明。

4)音频输出接口,在头文件pgLibDevAudioOut.h中声明。

5)音频转换接口,在头文件pgLibDevAudioConvert.h中声明。

调用API流程的样例:

2. 视频输入API接口(pgLibDevVideoIn.h)

1)说明

       从Peergine中间件的1.42.0版本开始,增加了内置的H.264和H.265输入组帧功能,应用程序可以在pfnVideoInOpen()回调函数里面,调用pgDevVideoInSetParam()函数设置

PG_DEV_VIDEO_IN_PARAM_ASSEM_FRAME参数项,启用或关闭内置输入组帧功能。

2)常量:

PG_DEV_VIDEO_IN_FMT_E:视频输入格式

PG_DEV_VIDEO_IN_FLAG_E:视频输入标志位

PG_DEV_VIDEO_IN_CTRL_E:视频输入控制命令

typedef enum tagPG_DEV_VIDEO_IN_CTRL_E {
PG_DEV_VIDEO_IN_CTRL_PULL_KEY_FRAME, // 立即输入一个关键帧
PG_DEV_VIDEO_IN_CTRL_BUTT
} PG_DEV_VIDEO_IN_CTRL_E;

PG_DEV_VIDEO_IN_PARAM_E:视频输入参数的条目

参数条目的说明:

PG_DEV_VIDEO_IN_PARAM_NO:摄像头编号参数

    调用pgDevVideoInSetParam()设置最后选用的摄像头的编号。从uValue参数传入摄像头的编号,uValue的有效范围为0~65534(摄像头编号的具体数值依赖各个操作系统上的摄像头接口定义)。

PG_DEV_VIDEO_IN_PARAM_FACING:摄像头方向(前置/后置)

    调用pgDevVideoInSetParam()设置摄像头方向(前置还是后置)。从uValue参数传入方向值:1为前置,0为后置。

PG_DEV_VIDEO_IN_PARAM_ROTATE:摄像头采集的视频角度

    调用pgDevVideoInGetParam()获取摄像头的采集视频角度,然后按照这个角度打开摄像头。pgDevVideoInGetParam()的返回值为摄像头的采集角度,有效值为0、90、180、270,默认值为0。

PG_DEV_VIDEO_IN_PARAM_IMG_ROTATE:摄像头采集得到的视频图像数据的存储角度

    调用pgDevVideoInSetParam()设置摄像头采集端的数据的旋转角度。从uValue参数传入角度值,有效值为有效值为0、90、180、270,默认值为0。

PG_DEV_VIDEO_IN_PARAM_ASSEM_FRAME:启用/禁用中间件内部的视频组帧功能

    调用pgDevVideoInSetParam()设置是否启用Peergine中间件内置的H264、H265组帧功能。uValue的值,1为启用内置组帧、0为禁用(默认值)。

3)结构体:

PG_DEV_VIDEO_IN_CALLBACK_S:视频输入回调接口结构

3)API函数:

pgDevVideoInSetCallback:设置视频输入回调接口

pgDevVideoInCaptureProc:视频帧数据输入

pgDevVideoInSetParam:设置视频输入参数

pgDevVideoInGetParam:获取视频输入参数

5)回调函数:

pfnVideoInOpen:打开视频采集设备进行采集

pfnVideoInClose:关闭视频采集设备停止采集

pfnVideoInCtrl:接收到字符串数据

3. 视频输出API接口(pgLibDevVideoOut.h)

1)说明

       从Peergine中间件的1.42.0版本开始,增加了获取视频流的帧率的功能,应用程序可以在pfnVideoOutOpen()回调函数里面,调用pgDevVideoOutGetParam()函数获取

PG_DEV_VIDEO_OUT_PARAM_FRAME_RATE参数项的值,就是当前视频流的帧率。

2)常量:

PG_DEV_VIDEO_OUT_FMT_E:视频输入格式

PG_DEV_VIDEO_OUT_FLAG_E:视频输出标志位

PG_DEV_VIDEO_OUT_EVENT_E:视频输出事件

PG_DEV_VIDEO_OUT_FILL_MODE_E:视频输出图像填充模式

PG_DEV_VIDEO_OUT_ROTATE_E:视频输出图像旋转角度

PG_DEV_VIDEO_OUT_PARAM_E:视频输出参数的条目

参数条目的说明:

PG_DEV_VIDEO_OUT_PARAM_PIXEL_FORMAT:输出的视频像素数据的格式: I402或RGB24

    调用pgDevVideoOutGetParam()获取当前Peergine中间件输出的视频图像的像素数据的格式,有效值为’PG_DEV_VIDEO_OUT_FMT_RGB24’和’PG_DEV_VIDEO_OUT_FMT_I420’。

    调用pgDevVideoOutSetParam()修改Peergine中间件输出视频图像的像素数据的格式,从uValue参数传入像素的格式类型,有效值为’PG_DEV_VIDEO_OUT_FMT_RGB24’和’PG_DEV_VIDEO_OUT_FMT_I420’。

PG_DEV_VIDEO_OUT_PARAM_FRAME_RATE:视频输出的帧率

    调用pgDevVideoOutGetParam()获取视频流的帧率。

3)结构体:

PG_DEV_VIDEO_OUT_CALLBACK_S:视频输出回调接口结构

3)API函数:

pgDevVideoOutSetCallback:设置视频输出回调接口

pgDevVideoOutEventProc:视频输出事件处理

pgDevVideoOutSetPixFormat:设置视频输出的像素数据格式

pgDevVideoOutSetParam:设置视频输出的参数

pgDevVideoOutGetParam:获取视频输出的参数

5)回调函数:

pfnVideoOutOpen:打开视频输出设备

pfnVideoOutClose:关闭视频输出设备

pfnVideoOutImage:播放显示视频帧图像

pfnVideoOutClean:清除视频播放窗口

4. 音频输入API接口(pgLibDevAudioIn.h)

1)说明

       从Peergine中间件的1.42.0版本开始,增加了内置的音频输入数据转换的功能,应用程序可以在pfnAudioInOpen()回调函数里面,调用pgDevAudioInSetParam()函数设置输入的音频流数据的参数的值,就可以启用Peergine中间件内置的音频输入数据转换的功能。

2)常量:

PG_DEV_ AUDIO _IN_FMT_E:音频输入格式

其他规格说明

一般默认使用PCM16格式进行传输,PCM16也是只支持特定规格的音频数据,具体规格是

格式PCM16
尾端默认
采样率11025
帧率25
每帧采样441
每帧数据大小882

3)结构体:

PG_DEV_AUDIO_IN_CALLBACK_S:音频输入回调接口结构

4)API函数:

pgDevAudioInSetCallback:设置音频输入回调接口

pgDevAudioInRecordProc把采集到的音频数据输入到中间件

5)回调函数:

pfnAudioInOpen:打开音频采集设备进行采集

pfnAudioInClose:关闭音频采集设备停止采集

5. 音频输出API接口(pgLibDevAudioOut.h)

1)说明

从Peergine中间件的1.42.0版本开始,增加了内置的音频输出数据转换的功能,应用程序可以在pfnAudioOutOpen()回调函数里面,调用pgDevAudioOutSetParam()函数设置输出的音频流数据的参数的值,就可以启用Peergine中间件内置的音频输出数据转换的功能。

2)常量:

PG_DEV_AUDIO_OUT_FMT_E:音频输出格式

3)结构体:

PG_DEV_AUDIO_OUT_CALLBACK_S:音频输出回调接口结构

4)API函数:

pgDevAudioOutSetCallback:设置音频输出回调接口

pgDevAudioOutPlayedProc:反馈实际已经播放的音频数据长度

pgDevAudioOutPlaySilent:开启SDK输出静音数据的机制

5)回调函数:

pfnAudioOutOpen:打开音频播放设备

pfnAudioOutClose:关闭音频播放设备

pfnAudioOutPlay:播放音频数据

6. 音频转换API接口(pgLibDevAudioConvert.h)

1)说明:

在Peergine系统以及由Peergine经过裁剪和封装衍生出来的系列SDK中,音频通话的数据都是以统一的采样率和帧长度进行通信传输的。Peergine使用的统一音频采样率为11025,音频的帧长度为441个采样点。但是,当Peergine和SDK应用在各种设备上时,有些设备上的音频采集和播放就不一定支持11025的采样率和441个采样点的帧长度。所以, Peergine和SDK提供了一套音频转换的API来进行音频采样率、帧长度,以及格式的转换。以便在Peergine和SDK与设备之间进行音频采集和播放对接时,有更强的适应性。

音频转换以“转换队列”的方式实现,使用步骤为:

  • (1)创建转换队列(传入转换参数)
  • (2)把待转换的音频数据压入队列(每次压入一帧数据)
  • (3)从队列弹出转换后的音频数据(每次弹出一帧数据)
  • (4)重复(2)和(3)步,直到完成所有数据转换
  • (5)销毁转换队列

以下“API函数”章节详细叙述的音频转换API的说明。

2)常量:

PG_DEV_AUDIO_CVT_FMT_E:音频转换格式

3)API函数:

pgDevAudioConvertAlloc:创建转换队列

pgDevAudioConvertFree:销毁转换队列

pgDevAudioConvertPush:把待转换的音频数据压入到队列中

pgDevAudioConvertPop:把转换后的数据从队列弹出(只弹出数据缓冲区的地址)

pgDevAudioConvertPopS:把转换后的数据从队列弹出(把数据从队列复制出来)

7. 代码样例:

1)音频/视频采集播放样例伪码:

2)音频录音转换样例伪码:

3)音频放音转换样例伪码:

8. 附录

1)修改记录

版本号

修改内容

备注

1.0

初始版本

 

1.1

修改伪码的VideoInCtrl()函数,增加强制产生关键帧的说明。

 

1.2

在概述中添加结构层次图,以及注意事项。

添加关于Audio输入输出接口的说明。

升级代码样例,添加Audio的代码,优化代码结构。

 

1.3

1)增加视频输出回调接口说明

2)增加H265编解码格式

3)修改以前版本的描述错误

 

1.5

增加音频转换API接口和样例伪码

 

1.6

1)增加pgDevAudioOutPlaySilent()函数

2)增加pgDevAudioConvertAlloc()函数的uDevSampleRate参数的有效值说明。

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

77 + = 84