webrtc入门系列(二)easy_webrtc_server 入门example测试

news/2024/11/29 23:40:25/

《webrtc入门系列(一)easy_webrtc_server 入门环境搭建》
《webrtc入门系列(二)easy_webrtc_server 入门example测试》
《webrtc入门系列(三)云服务器coturn环境搭建》
《webrtc入门系列(四) zlmediakit webrtc sdp交互详细解读》


rtp_src_example

这个样例,非常的典型,对我们做设备端的同学来说,就需要一样这样的例子,模拟IPC发送视频到web播放。

环境

demo运行系统:Ubuntu20.04
播放环境:win10,chrom浏览器、edge浏览器
系统这里特别说下,我用Ubuntu18.04测试失败,打开文件错误,应该是Ubuntu18.04apt默认安装的ffmpeg的版本编译选项的问题。
解决办法,要么升级系统,要么自己源码安装ffmpeg。

测试过程

  1. 拷贝测试文件到build目录

rtp_src_example.cc里面是读了一个test.flv文件发送,作者工程里又只有一个test.h264,看代码是用ffmpeg接口打开的文件,所以格式没关系,ffmpge能自己解析,我们只要输入一个视频文件即可。拷贝test.h264到build目录,改名test.flv或者代码打开test.h264即可
cd easy_webrtc_server/build;cp ../test.h264 test.flv
2. 启动测试程序
记得sudo启动

./rtp_src_example 192.168.1.16 8000

将IP替换成你运行demo系统的IP
3. 打开网页播放视频
将easy_web_rtc目录下面index.html文件直接拖到浏览器打开,IP改成Ubuntu的ip地址,点call即可以看到视频。
在这里插入图片描述

chrom浏览器和Edge浏览器测试OK。
Firefox浏览器不允许跨源请求。

至此,就可以完整的抓包和分析代码学习了。

源码简读

muduo不支持udp,本项目基于muduo的Channel类简单封装一个udp通信的类;
基于muduo_http建立一个http信令服务器,交换webrtc所需要的sdp信息。
网页上打开一个http连接,服务器建立一个WebRtcTransport,传输层是一个UdpSocket。
WebRtcTransport生成sdp信息,通过http协议传到前端。
sdp信息包括媒体信息如编码格式、ssrc等,stun协议需要的ice-ufrag、ice-pwd、candidate,dtls需要的fingerprint。
前端通过candidate获取ip地址和端口号,通过udp协议连接到服务器的。
服务器收到udp报文,先后通过类UdpSocket接收报文;StunPacket和IceServer解析stun协议,此处的Stun协议解析,只要收到stun request,验证账户密码成功,就认为连接成功。
stun协议交互成功后,通过DtlsTransport进行dtls握手;交换密钥后就可以初始化SrtpChannel。此处没有通过签名验证客户端的证书,所以省略了前端返回sdp的步骤。
读取h264码流文件,通过ffmpeg生成rtp流,通过SrtpChannel加密,通过UdpSocket发送,前端就可以看到视频。

//起一个线程读取发送文件,WriteRtpCallback函数回调将数据通过webrtc的端口发送
std::thread flv_2_rtp_thread([&webrtc_session_factory]() { H2642Rtp("./test.h264", &webrtc_session_factory); });//udp通道UdpServer rtc_server(&loop, muduo::net::InetAddress("0.0.0.0", port), "rtc_server", 2);//http信令服务器,交换sdpHttpServer http_server(&loop, muduo::net::InetAddress("0.0.0.0", 8000), "http_server",TcpServer::kReusePort);//信令响应rtc_server.SetPacketCallback([&webrtc_session_factory](UdpServer* server, const uint8_t* buf,size_t len,const muduo::net::InetAddress& peer_addr,muduo::Timestamp timestamp) {WebRTCSessionFactory::HandlePacket(&webrtc_session_factory, server, buf, len, peer_addr,timestamp);});http_server.setHttpCallback([&loop, &webrtc_session_factory, port, ip](const HttpRequest& req, HttpResponse* resp) {if (req.path() == "/webrtc") {resp->setStatusCode(HttpResponse::k200Ok);resp->setStatusMessage("OK");resp->setContentType("text/plain");//跨域resp->addHeader("Access-Control-Allow-Origin", "*");auto rtc_session = webrtc_session_factory.CreateWebRTCSession(ip, port);//回复本地sdpresp->setBody(rtc_session->webrtc_transport()->GetLocalSdp());std::cout << rtc_session->webrtc_transport()->GetLocalSdp() << std::endl;}});loop.runInLoop([&]() {rtc_server.Start();http_server.start();});loop.loop();

http://www.ppmy.cn/news/45483.html

相关文章

Zabbix监控系统——附详细步骤和图解

文章目录 一、Zabbix概述1、使用zabbix的原因2、zabbix的概念和构成3、zabbix 监控原理&#xff1a;4、zabbix的程序组件 二、安装 zabbix 5.01、部署 zabbix 服务端的操作步骤2、实例操作&#xff1a;部署 zabbix 服务端3、部署 zabbix 客户端4、实例操作&#xff1a;部署 zab…

软件测试分为什么?具体是干什么的呢?

宝子们让我们一起探索软件测试的奥秘吧&#xff0c;首先软件测试是一个通用的概念名称&#xff0c;根据测试的目的和手段不同而自定义的选择。下面好好解释一下吧&#xff01; 功能测试 功能测试&#xff1a;又称手工测试&#xff0c;需要根据需求文档&#xff0c;执行测试用…

校验身份证号码并输出个人信息

描述 中国目前采用的是18位身份证号&#xff0c;其第7-10位数字是出生年&#xff0c;11-12位是出生月份&#xff0c;13-14是出生日期&#xff0c;第17位是性别&#xff0c;奇数为男性&#xff0c;偶数为女性&#xff0c;第18位是校验位。 如果身份证号码的其中一位填错了&#…

nginx线程池源码剖析

文章目录 nginx线程池1. 问题2. 解决办法 nginx线程池3. 线程池实现模型4. 线程池实现核心组件5.源码实现测试代码main.c封装互斥锁&条件变量线程池实现 nginx线程池 1. 问题 处理事件过程“阻塞”怎么办&#xff1f; 忙于漫长的 CPU 密集型处理 读取文件&#xff0c;但…

计算机网络复习记录(总结 —— 快速入门和快速复习)

一、计算机网络的定义和分类 定义&#xff1a; 简单定义&#xff1a;一些互连、自治、的计算机集合。 较好定义&#xff1a;计算机网络主要是由一些通用的、可编程的硬件互连而成&#xff0c;而这些硬件并非专门用来实现某一特定目的。 分类 按交换技术分类 按使用者分类 …

设计模式-行为型模式之观察者模式

3. 观察者模式 3.1. 模式动机 建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c;其他对象将相应做出反应。在此&#xff0c;发生改变的对象称为观察目标&#xff0c;而被通知的对象称为观察者&#xff0c;一个观察目标可以对应多…

代码随想录刷题-栈与队列-有效的括号

文章目录 有效的括号习题我的解法代码随想录解法 有效的括号 本节对应代码随想录中&#xff1a;代码随想录&#xff0c;对应视频链接为&#xff1a;栈的拿手好戏&#xff01;| LeetCode&#xff1a;20. 有效的括号_哔哩哔哩_bilibili 习题 题目链接&#xff1a;20. 有效的括…

SpringCloud网关——GateWay

GateWay 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 概述 SpringCloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;基于 Spring 5.0Spring Boot 2.0 和 Project Reactor 等技术开发的网关&#xff0c;它旨在为微服务架构提供一种简…