小工具知识网

当前位置: 首页 > 行业知识 > C++ webrtc开发(非原生开发,linux上使用libdatachannel库)

行业知识

C++ webrtc开发(非原生开发,linux上使用libdatachannel库)

2026-11-11 21:27:43 来源:互联网转载

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、libdatachannel库的下载和build
  • 二、开始使用
    • 1.
    • 2.引入库
    • 3.开始使用
    • 总结

      前言

      使用c++开发webrtc在互联网上留下的资料甚少,经过我一段时间的探索,有大概这几种可以用于c++进行webrtc开发的方法。

      1.c++ webrtc native 开发,这个开发方法很麻烦,编译这个库十分麻烦,索性网上还留有部分资料可供参考,但是因为我是想在嵌入式上部署webrtc,所以没有考虑这个方法。

      2.kvs webrtc c sdk 库二次开发,利用amazon给出的用于aws的sdk,我们编译生成静态库后可以抛弃掉其中信令服务器等内容,利用里面ice部分媒体传输部分完成自己的功能的开发。优点是这个库的对外api的介绍写的挺清楚,缺点是kvs的github社区里面的问题基本都是使用它的整套服务过程中提出的问题,对于单独提取它的一些库来完成自己功能过程中遇到的问题很少,可能你在自己魔改的过程中遇到奇奇怪怪的问题里面一点线索都找不到。其次,这是一个c库,对外的api写的挺清楚,但是遇到bug后你阅读源码的过程中,大量的c代码会让你很难受。并且该库依赖大量的第三方库,编译过程比webrtc native舒适不少,但还是会遇到各种问题,尤其是你想要交叉编译到嵌入式板子上时,可能这个过程更会让你难受。关于使用这个库开发自己的webrtc的中文资料也挺少,推荐这篇博客

      嵌入式中实现webrtc的方式

      这条路我是跟着这篇文章做过一阵,但是最后还是失败了,如果有人这个方法做出来可以告诉我

      3.libdatachannel库,这个库很轻量级,简单make就可以,虽然看名字这个库似乎只能用于datachannel,但实际他是支持媒体传输的,代码质量很高,缺点是要c++17,但是我的嵌入式板子刚好支持c++17,于是就这样使用下来了,体验很不错,基本上使用库遇到的问题你都能在github的issue中找到解决的方法。

      一、libdatachannel库的下载和build

      没什么好说的,因为这个库真的很轻量级,我甚至没有交叉编译,我直接在嵌入式板子上编译最终都通过了。

      make就完事了,中间可能会遇到openssl库的一个问题,google一下就能解决问题。

      build教学

      二、开始使用

      1.

      如果直接使用的话,你在make之后再make install一下,大概就会把相关需要的文件放在系统的某个目录下了,你可以把include和lib自己拿出来放到项目文件夹中,或者你再cmake中指明库在系统哪个地方也行,不懂的可以问chatgpt,适当的提示词可以让gpt很快地解决你的问题。除此之外你还需要自己include一个json库,你喜欢的任意一种c++json库都行。

      2.引入库

      就像这样引入这些库吧。最重要的是rtc.hpp,别把它忘了就好

      3.开始使用

      大家可以照看github中examples的代码自己读,自己改出一版自己的webrtc,接下来我来用我自己的代码来做一个简单的教学,内容在代码中的注释展现

      #include "../include/rtc/rtc.hpp"#include #include "json.hpp"#include #include #include #include typedef int SOCKET;static std::string from;static std::string to;static std::string sessionid;using std::string;using std::shared_ptr;using std::weak_ptr;using std::cout ;using std::endl;const int BUFFER_SIZE = 2048;template  weak_ptr make_weak_ptr(shared_ptr ptr) { return ptr; }shared_ptr pc;rtc::WebSocket ws;using nlohmann::json;int main(){    // std::cout     std::cout };addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port = htons(6000);if (bind(sock, reinterpret_cast// data holds either std::string or rtc::binaryif (!std::holds_alternativestd::cout std::cout auto candidate = message["data"]["candidate"]["candidate"].get;}//stun服务器和turn服务器的设置,如果你要设置turn,其实直接写一个turn地址就够了,这个turn也会用作stun//并且你不用在ip中指明是turn还是stun,当你设置有密码和账号后,就会认为是turn了rtc::Configuration config;// config.iceServers.emplace_back("stun.l.google.com:19302");config.iceServers.emplace_back("url");// const rtc::IceServer turnServer("ip", "port", "name", "password");// config.iceServers.emplace_back(turnServer);//简单的媒体trackrtc::Description::Video media("video", rtc::Description::Direction::SendOnly);media.addH264Codec(96);media.addSSRC( rtc::SSRC(45), "video-send" );pc = std::make_sharedstd::cout std::cout auto description = pc-localDescription();                json message;                message["type"] = description-typeString();                message["data"]["to"] = "1453";                message["data"]["from"] = "1433";                message["data"]["description"]["sdp"] = string(description.value());                message["data"]["description"]["type"] = description-typeString();                message["data"]["session_id"] = "1453-1433";                message["data"]["media"] = "video";                std::cout         cout             std::cout  // // std::cout // // data holds either std::string or rtc::binary// if (std::holds_alternativeif (len 

上一篇:办公系统云服务器怎么用?

下一篇:COSS下载指南,轻松获取,一键操作,省时省力!