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

news/2024/7/10 20:56:33 标签: webrtc, ffmpeg, webrtc入门, 教程, easy_webrtc

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信令服务器,交换sdp
  HttpServer 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);
          //回复本地sdp
          resp->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.niftyadmin.cn/n/216910.html

相关文章

2023年MathorCup数模A题赛题

A 题 量子计算机在信用评分卡组合优化中的应用 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需要先通过 各种审核规则对客户的信用等级进行评定&#xff0c;通过评定后的客户才能获得信 用或贷款资格。规则审核过程实际是经过一重或者多重组合规则…

unity,如何获取鼠标移动

介绍 脚本获取鼠标移动信息的方法 方法 void Update() {float mouseX Input.GetAxis("Mouse X");float mouseY Input.GetAxis("Mouse Y");// 在这里可以使用鼠标移动的值来进行相应的操作 }unity&#xff0c;鼠标获取屏幕移动&#xff0c;用于fps游戏视…

Excel技能之数据安全,老板让我加个锁

金融、管理、财务各个领域和行业&#xff0c;重要的数据&#xff0c;没有保护手段&#xff0c;像在大街上裸奔一样。数据安全的重要性&#xff0c;必须刻在骨子里。 机密文件、商业文件、财务报表、销售业绩、工资&#xff0c;以及不想让别人修改的只读文件&#xff0c;都可以…

楚慧杯初赛—RE

楚慧杯初赛——RE复现 Level_One 这里发现还是jeb好用 package com.example.mobile1;import android.os.Bundle; import android.view.View.OnClickListener; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.wid…

C语言之十大经典排序算法

嗨喽&#xff0c;大家好&#xff0c;我是程序猿老王&#xff0c;程序猿老王就是我。 今天给大家讲一讲C语言十大经典排序算法原理与实现。 目录 一、排序算法背景 二、十大经典排序算法的由来 三、十大经典排序算法的复杂度 四、十大经典排序算法讲解 1.冒泡排序&#xf…

arm内核中的总线是什么?

ARM架构是现代嵌入式系统中广泛使用的一种处理器架构。它采用了一种称为“总线”的技术来连接处理器和其他系统组件&#xff0c;以实现数据和控制信号的传输。在ARM内核中&#xff0c;总线作为连接系统各组件的桥梁&#xff0c;起着至关重要的作用。本文将介绍ARM内核中的总线技…

【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vtk加载rgb点云ply文件和灰白ply文件

vkt官方的例子是加载灰白的ply文件&#xff0c;但是当项目中用到rgb的ply文件就是显示不出来图像&#xff0c;具体的加载方法如下&#xff1a; vtk加载RGB点云文件 #include “vtkAutoInit.h” VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType)…