JRTP实时音视频传输(2)-使用TCP通信的案例

环境搭建等参考:JRTP实时音视频传输(1)-必做的环境搭建与demo测试

1.创建自己的demo

先将example1拷贝为myclienttcp.cpp和myservertcp.cpp
cp example1.cpp myclienttcp.cpp
cp example1.cpp myservertcp.cpp

改写jrtplib/JRTPLIB/examples/CMakeLists.txt,添加myclienttcp和myservertcp编译
image.png
重新生成Makefile并编译

sudo cmake CMakeLists.txt
sudo make

可以看到成功编译了myclienttcp和myservertcp源文件
image.png
编译通过,这里就去实现demo就行

2.demo源码-客户端

#include <iostream>
#include <arpa/inet.h>
#include "rtptcpaddress.h"
#include "rtpsession.h"
#include "rtpsessionparams.h"
#include "rtptcptransmitter.h"
#include "rtpipv4address.h"
#include "rtptimeutilities.h"
#include "rtppacket.h"
#include "rtpabortdescriptors.h"using namespace jrtplib;#define SERVER_IP    "127.0.0.1"
#define SERVER_PORT  58008int main()
{RTPSession session;RTPAbortDescriptors m_descriptors;RTPSessionParams sessionparams;sessionparams.SetAcceptOwnPackets(true);sessionparams.SetOwnTimestampUnit(1.0/10.0);m_descriptors.Init();RTPTCPTransmissionParams transparams;transparams.SetCreatedAbortDescriptors(&m_descriptors);int status = session.Create(sessionparams,&transparams,RTPTransmitter::TCPProto);if (status < 0){printf("my client session create failed\n");return -1;}//初始化socketint sock = socket(AF_INET, SOCK_STREAM, 0);sockaddr_in addrSrv;addrSrv.sin_addr.s_addr = inet_addr(SERVER_IP);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(SERVER_PORT);printf("my client prepare to connect\n");//连接服务器connect( sock, (sockaddr*)&addrSrv, sizeof(sockaddr));RTPTCPAddress addr(sock);status = session.AddDestination(addr);if (status < 0){printf("my client session add destination failed\n");return -1;}session.SetDefaultPayloadType(96);session.SetDefaultMark(false);session.SetDefaultTimestampIncrement(160);for (int i = 0; i < 50 ; i++){std::string str("123456");//发送数据session.SendPacket((void *)str.c_str(), str.length(),0,false,10);printf("my client send packet:%s, len:%d, idx:%d\n", str.c_str(), str.length(), i);RTPTime::Wait(RTPTime(10, 0));}RTPTime delay(0.020);session.BYEDestroy(delay,"Client End",9);
}

3.demo源码-服务端

/*Here's a small IPv4 example: it asks for a portbase and a destination and starts sending packets to that destination.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include "rtppacket.h"
#include "rtptcpaddress.h"
#include "rtptcptransmitter.h"
#include "rtpsession.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#include "rtplibraryversion.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>using namespace jrtplib;#define SERVER_PORT  58008void checkerror(int rtperr)
{if (rtperr < 0){std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);}
}int main(void)
{int   nListener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (nListener == -1){return  -1;}sockaddr_in   serverAddr;memset(&serverAddr, 0, sizeof(sockaddr_in));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(SERVER_PORT);int  nRet = bind(nListener, (sockaddr*)&serverAddr, sizeof(serverAddr));if (nRet == -1){return  -1;}if (listen(nListener, 1) == -1){return  -1;}printf("my server is listen ready, wait for connect\n");sockaddr_in   clientAddr;int  nLen = sizeof(sockaddr_in);int   nServer = -1;while (true){nServer = accept(nListener, (sockaddr*)&clientAddr, (socklen_t *)&nLen);if (nServer == -1){continue;}else{break;}}printf("my server connect new client\n");int status = -1;int  nPackSize = 45678;RTPSessionParams   sessparams;RTPSession m_RTPTCPSession;sessparams.SetProbationType(RTPSources::NoProbation);sessparams.SetOwnTimestampUnit(90000.0 / 25.0);sessparams.SetMaximumPacketSize(nPackSize + 64);RTPTCPTransmitter    *pTransparams =  new RTPTCPTransmitter(NULL);status = pTransparams->Init(false);if (status < 0){printf("my server trans param init failed, reason:%s\n", RTPGetErrorString(status).c_str());return -1;		}status = pTransparams->Create(65535, NULL);if (status < 0){printf("my server trans param create failed, reason:%s\n", RTPGetErrorString(status).c_str());return -1;		}status = m_RTPTCPSession.Create(sessparams, pTransparams);if (status < 0){printf("my server trans session create failed, reason:%s\n", RTPGetErrorString(status).c_str());return -1;		}status = m_RTPTCPSession.AddDestination(RTPTCPAddress(nServer));if (status < 0){printf("my server trans session add failed, reason:%s\n", RTPGetErrorString(status).c_str());return -1;		}while (1){	m_RTPTCPSession.BeginDataAccess();// check incoming packetsif (m_RTPTCPSession.GotoFirstSourceWithData()){do{RTPPacket *pack;while ((pack = m_RTPTCPSession.GetNextPacket()) != NULL){// You can examine the data hereprintf("myserver recv packet buf:%s, len:%d\n", pack->GetPayloadData(), pack->GetPayloadLength());// we don't longer need the packet, so// we'll delete itm_RTPTCPSession.DeletePacket(pack);}} while (m_RTPTCPSession.GotoNextSourceWithData());}m_RTPTCPSession.EndDataAccess();#ifndef RTP_SUPPORT_THREADstatus = m_RTPTCPSession.Poll();checkerror(status);
#endif // RTP_SUPPORT_THREADRTPTime::Wait(RTPTime(1,0));}m_RTPTCPSession.BYEDestroy(RTPTime(10,0),0,0);return 0;
}

4.demo运行测试

分别运行client和server ,可以看到数据正常传输到server端
image.png
用netstat查看连接端口信息,也能看到该端口目前的状态,属于TCP连接,实验成功
image.png

对环境搭建不清楚的可以看这篇博客~
JRTP实时音视频传输(1)-必做的环境搭建与demo测试

5.源码下载

哈喽~我是Embedded-Xin,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。
以上代码全部放在我私人的github地址,其中有许多自己辛苦敲的例程源码,供大家参考、批评指正,有兴趣还可以直接提patch修改我的仓库~:
https://github.com/Xuzhangxin/study_linux_project.git
觉得不错的话可以点个收藏和star~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419488.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Axure RP 9制作弹出框

制作流程 1.准备文本框 下拉列表 按钮 动态面板 如图 2.先把下拉列表放好 再放动态面板覆盖 3.点动态面板 进入界面 如图 4.给按钮添加交互 3个按钮一样的 如图 5.提交按钮添加交互 如图

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs

大开眼界&#xff1f;探索多模态模型种视觉编码器的缺陷。 论文中指出&#xff0c;上面这些VQA问题&#xff0c;人类可以瞬间给出正确的答案&#xff0c;但是多模态给出的结果却是错误的。是哪个环节出了问题呢&#xff1f;视觉编码器的问题&#xff1f;大语言模型出现了幻觉&…

【计算机网络】TCP握手与挥手:三步奏和四步曲

这里写目录标题 前言三次握手四次挥手三次握手和四次挥手的作用TCP三次握手的作用建立连接防止已失效的连接请求建立连接防止重复连接 TCP四次挥手的作用&#xff1a;安全关闭连接避免数据丢失避免半开连接 总结&#xff1a; 总结 前言 TCP&#xff08;传输控制协议&#xff09…

大模型理论基础3

模型架构 模型概括 先把语言模型看成黑盒&#xff0c;以便于了解整体功能后拆分成&#xff1a;分词、模型架构 分词 首先要知道&#xff1a;语言模型 p 是建立在词元&#xff08;token&#xff09;序列的上的一个概率分布输出&#xff0c;其中每个词元来自某个词汇表V&#…

NLP论文阅读记录 - 2022 | WOS 04.基于 XAI 的强化学习方法,用于社交物联网内容的文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 XAI-Base…

USB-C接口给显示器带来怎样的变化?

随着科技的不断发展&#xff0c;Type-C接口已经成为现代电子设备中常见的接口标准。它不仅可以提供高速的数据传输&#xff0c;还可以实现快速充电和视频传输等功能。因此&#xff0c;使用Type-C接口的显示器方案也受到了广泛的关注。本文将介绍Type-C接口显示器的优势、应用场…

linux下vsc的自动切换输入法解决方案

前言 个人使用的是Linux开发加上vsc编辑器&#xff0c;这两个东西一加中国开发者大致上就消失不见了&#xff0c;眼馋idea那个Smartinput很久了&#xff0c;赶上放假了&#xff0c;有空搞搞&#xff0c;如果后期有心情会做的通用点 安装 商店搜索SmartInputLinux安装 使用…

SystemC学习笔记(三) - 查看模块的波形

简述 波形在Simulation/Emulation中地位十分重要&#xff0c;尤其是在研发初期&#xff0c;只能通过波形来查看软件hang住的位置。 对于TLM来说&#xff0c;查看波形一般是指查看pvbus上的transaction&#xff0c;而对于SystemC本身来说&#xff0c;查看波形就是使用Gtkwave或…

二、用户管理(上)

目录 1.用户/组基本概念 用户基本信息文件&#xff1a;vim /etc/passwd&#xff08;冒号为分隔&#xff0c;分为7列字段&#xff09; 用户密码信息文件&#xff1a;/etc/shadow 组信息文件&#xff1a;/etc/group。 2.用户/组管理 查看当前用户&#xff1a;whoami 创建用…

2024最新 8 款电脑数据恢复软件推荐分享

数据恢复是一个涉及从设备硬盘驱动器检索已删除文件的过程。这可能需要存储在工作站、笔记本电脑、移动设备、服务器、相机、闪存驱动器上的数据——任何在独立或镜像/阵列驱动器上存储数据的东西&#xff0c;无论是内部还是外部。 在某些情况下&#xff0c;文件可能被意外或故…

再论 如何通过一个项目征服Java

前面说过&#xff0c;我准备用几个月的时间&#xff0c;将Java体系认真的梳理一遍&#xff0c;不一定做的很好&#xff0c;但是每次都努力去做。 为什么我觉得需要加紧做这个呢&#xff1f;Java早已经不是高大上的稀世珍品了&#xff0c;程序员也不再是高科技工作者&#xff0…