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

这篇具有很好参考价值的文章主要介绍了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编译
JRTP实时音视频传输(2)-使用TCP通信的案例,jrtp,音视频学习,实时音视频,tcp/ip,网络,linux
重新生成Makefile并编译

sudo cmake CMakeLists.txt
sudo make

可以看到成功编译了myclienttcp和myservertcp源文件
JRTP实时音视频传输(2)-使用TCP通信的案例,jrtp,音视频学习,实时音视频,tcp/ip,网络,linux
编译通过,这里就去实现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  58008

int 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;
    }

    //初始化socket
    int 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  58008

void 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 packets
		if (m_RTPTCPSession.GotoFirstSourceWithData())
		{
			do
			{
				RTPPacket *pack;
				
				while ((pack = m_RTPTCPSession.GetNextPacket()) != NULL)
				{
					// You can examine the data here
					printf("myserver recv packet buf:%s, len:%d\n", pack->GetPayloadData(), pack->GetPayloadLength());
					
					// we don't longer need the packet, so
					// we'll delete it
					m_RTPTCPSession.DeletePacket(pack);
				}
			} while (m_RTPTCPSession.GotoNextSourceWithData());
		}
		
		m_RTPTCPSession.EndDataAccess();

#ifndef RTP_SUPPORT_THREAD
		status = m_RTPTCPSession.Poll();
		checkerror(status);
#endif // RTP_SUPPORT_THREAD
		
		RTPTime::Wait(RTPTime(1,0));
	}
	
	m_RTPTCPSession.BYEDestroy(RTPTime(10,0),0,0);

	return 0;
}


4.demo运行测试

分别运行client和server ,可以看到数据正常传输到server端
JRTP实时音视频传输(2)-使用TCP通信的案例,jrtp,音视频学习,实时音视频,tcp/ip,网络,linux
用netstat查看连接端口信息,也能看到该端口目前的状态,属于TCP连接,实验成功
JRTP实时音视频传输(2)-使用TCP通信的案例,jrtp,音视频学习,实时音视频,tcp/ip,网络,linux

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

5.源码下载

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

到了这里,关于JRTP实时音视频传输(2)-使用TCP通信的案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频--视频数据传输

    H264码流RTP封装方式详解:https://blog.csdn.net/water1209/article/details/126019272 H264视频传输、编解码----RTP协议对H264数据帧拆包、打包、解包过程: https://blog.csdn.net/wujian946110509/article/details/79129338 H264之NALU解析: https://zhuanlan.zhihu.com/p/409527359 注意:H264帧数据打包进入RTP packet时会把s

    2024年02月13日
    浏览(29)
  • 音视频实时通话解决方案

    想要实现音视频通话,对于大部分人可能会觉得很难,但是实际上,有些事情并没有大家想的那样困难,只要功夫深,铁杵磨成针。 机缘巧合下,在业务中,我也遇到了一个业务场景需要实现音视频通话,我们不可能自己从零开始干,我本次用到的核心是WebRTC。 WebRTC (Web R

    2024年02月12日
    浏览(34)
  • ffmpeg点对点音视频udp协议传输

    参考:https://zhuanlan.zhihu.com/p/636152437?utm_id=0 ffmpeg查看可用设备: 局域网内两台设备间 局域网内两台设备间

    2024年04月10日
    浏览(34)
  • 【WebRTC】音视频通信

    WebRTC对等体还需要查找并交换本地和远程音频和视频媒体信息,例如分辨率和编解码器功能。 交换媒体配置信息的信令通过使用被称为SDP的会话描述协议格式来交换,被称为提议和应答的元数据块 一方发起调用 getUserMedia 打开本地摄像头 媒体协商(信令交换,媒体协商主要

    2024年02月07日
    浏览(42)
  • iOS 端实现1对1音视频实时通话

    首先,我们来看一下 iOS 端是如何获取访问音视频设备权限的。相比 Android 端而言,iOS端获取相关权限要容易很多。其步骤如下: 打开项目,点击左侧目录中的项目。 在左侧目录找到 info.plist ,并将其打开。 点击 右侧 看到 “+” 号的地方。 添加 Camera 和 Microphone 访问权限。

    2024年02月15日
    浏览(40)
  • 【新知实验室】——腾讯云TRTC实时音视频体验

    【新知实验室】——腾讯云TRTC实时音视频体验 前言 一、腾讯实时音视频TRTC是什么? 二、DEMO体验 1.注册腾讯云账号 2.使用实时音视频(需先开通) 3.查看项目(查看密钥和快速上手操作) 4.运行快速上手项目(静态页面) 随着短视频行业的不断发展,人们对实时音视频的需

    2024年02月11日
    浏览(30)
  • 【新知实验室】TRTC腾讯实时音视频动手实验

    https://cloud.tencent.com/document/product/647/16788 应用 TRTC 通过应用的形式来管理不同的业务或项目。您可以在 TRTC 控制台 给不同的业务或项目分别创建不同的应用,从而实现业务或项目数据的隔离。每个腾讯云账号最多可以创建100个 TRTC 应用。 SDKAppID SDKAppID(应用标识/应用 ID)是腾

    2024年02月01日
    浏览(36)
  • 【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议

            AVDTP即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协议),主要负责 A/V stream的协商、建立及传输程序,还指定了设备之前传输A/V stream的消息格式.         AVDTP的传输机制和消息格式是以 RTP为基础的。RTP由 RTP Data Transfer Protocol (RTP)和 RTP Control Protocol(

    2024年03月09日
    浏览(31)
  • Golang 流媒体音视频网络传输开源项目-LAL

    lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器。类似于 nginx-rtmp-module 等服务,但支持更多的协议,提供更丰富的功能。 demo:一些小应用,比如推、拉流客户端,压测工具,流分析工具,调度示例程序等。类似于ffmpeg、ffprobe等应用。

    2023年04月16日
    浏览(52)
  • [开源]企业级在线办公系统,基于实时音视频完成在线视频会议功能

    本项目使用了SpringBoot+Mybatis+SpringMVC框架,技术功能点应用了WebSocket、Redis、Activiti7工作流引擎, 基于TRTC腾讯实时音视频完成在线视频会议功能。 使用GPL-3.0开源协议                   办公系统应用了工作流引擎,基于RBAC的权限管理系统,工作流审批有请假流程审批、会议

    2024年02月05日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包