在嵌入式端想要调用WebRTC还是很复杂的一个事情,主要有两个原因:
1、嵌入式端的资源有限,大部分的嵌入式因为成本敏感的原因,flash总的空间大小控制在16M左右,这就导致每一块的资源用量都是严格要求的,所以,RTC通信这一小块的用量要尽可能的低,这也就是我们为什么要将EasyRTC压缩到500K-800K的原因了!
2、另外,WebRTC的调用本就是一个很复杂的过程,很难捋清楚脉络,所以,一套行之有效的RTC调用流程封装就至关重要了。

EasyRTC在设计之初就秉承着Easy优先的原则,每一块都能做到尽可能的精炼,所以设计方案也是经过了精心打磨的:

EasyRTC
那么,为了让用户在调用上写起代码来更加简便,我们在Github(https://github.com/EasyDarwin/EasyRTC)提交了示例代码,这样,在嵌入式侧调用起来就方便很多了:

#include "EasyRtcDevice_C.h"
#include <stdarg.h>
#ifndef _WIN32
#include <unistd.h>
#endif

// DataChannel 数据回调
int __EasyRTC_DataChannel_Callback(void* userptr, WEBRTC_PEER_T* webrtcPeer, BOOL isBinary, PBYTE msgData, UINT32 msgLen)
{
    // isBinary: 是否为bin类型数据, FALSE表示为文本

    if (!isBinary)
    {
        printf("recv msg[%u]: %s\n", msgLen, msgData);
    }

    return 0;
}

int main()
{
    // 初始化
    EasyRTC_Device_Init();


    unsigned int videoCodecID = 0x1C;           // H264(0x1C)       H265(0xAE)
    unsigned int audioCodecID = 0x10007;        // ALAW(0x10007)    MULAW(0x10006)      OPUS(3)

    const char* uuid = "1d1c0297-5cf3-4142-a9e5-255707b83b83";      // 设备自身唯一标识,每个设备都需不同

    // WEBRTC_DEVICE_T 结构体
    WEBRTC_DEVICE_T webRTCDevice;
    memset(&webRTCDevice, 0x00, sizeof(WEBRTC_DEVICE_T));

    BOOL enableLocalService = FALSE;        // 不启用本地服务
    // 连接服务器 && 上报设备信息
    EasyRTC_Device_Start(&webRTCDevice, videoCodecID, audioCodecID, uuid, enableLocalService, __EasyRTC_DataChannel_Callback, NULL);

    // 仅作示例:
    // 创建视频发送线程, 在线程中调用EasyRTC_Device_SendVideoFrame发送视频帧
    // 创建音频发送线程, 在线程中调用EasyRTC_Device_SendAudioFrame发送音频帧


    // 可调用EasyRTC_Device_SendData发送自定义数据给对端, 如自定义文本信息,如下
    // 发送文本消息给所有对端
    int num = webRTCDevice.webRTCPeerNum;
    for (int i = 0; i < num; i++)
    {
        if (NULL == webRTCDevice.webrtcPeer[i])     continue;

        WEBRTC_PEER_T* peer = webRTCDevice.webrtcPeer[i];
        if ((peer->connected == 0) || (peer->disconnected == 1))    continue;       // 如果不在线则跳过

        const char* msg = "Hello";
        EasyRTC_Device_SendData(peer, FALSE, (PBYTE)msg, (UINT32)strlen(msg));      // 发送文本消息
    }

    // 按回车键退出
    getchar();

    // 断开与服务器的连接
    EasyRTC_Device_Stop(&webRTCDevice);

    // 反初始化
    EasyRTC_Device_Deinit();


    return 0;
}

C和C++的调用我们都做了例子,接入开发的过程大大缩短:

EasyRTC

Logo

海思 HiSpark 开发者社区是上海海思为开发者搭建的内容和交流平台,依托完备芯片解决方案、专业开发环境、开源/开放的软件资源与社区技术内容,构建完整服务生态开发者的闭环体系。

更多推荐