最简单的 UDP-RTP 协议解析程序

流媒体-RTP/RTCP 一、简介       1) RTP(Realtime TransportProtocol):是针对Internet上多媒体数据流的一个传输协议,工作在一对一或一对多的传输情况下,其目的是提供时间信息和实现流同步。RTP本身只保证实时数据的传输,并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。     2)RTCP(Realtime T 阅读详情

最简单的 UDP-RTP 协议解析程序

本文介绍网络协议数据的处理程序。网络协议数据在视频播放器中的位置如下所示。

在这里插入图片描述

本文中的程序是一个 UDP/RTP 协议流媒体数据解析器。该程序可以分析 UDP 协议中的 RTP 包头中的内容,以及 RTP 负载中 MPEG-TS 封装格式的信息。通过修改该程序可以实现不同的 UDP/RTP 协议数据处理功能。

原理

MPEG-TS封装格式数据打包为RTP/UDP协议然后发送出去的流程如下图所示。图中首先每7个MPEG-TS Packet打包为一个RTP,然后每个RTP再打包为一个UDP。其中打包RTP的方法就是在MPEG-TS数据前面加上RTP Header,而打包RTP的方法就是在RTP数据前面加上UDP Header。

在这里插入图片描述

有关 MPEG-TS、RTP、UDP 的知识不再详细介绍,可以参考相关的文档了解其中的细节信息。本文记录的程序是一个收取流媒体的程序,因此本文程序的流程和上述发送 MPEG-TS 的流程正好是相反的。该程序可以通过 Socket 编程收取 UDP 包,解析其中的 RTP 包的信息,然后再解析 RTP 包中 MPEG-TS Packet 的信息。

源程序

// Simplest RTP Parser.cpp : 定义控制台应用程序的入口点。
//

/**
* 最简单的 UDP-RTP 协议解析程序
* Simplest RTP Parser
*
* 原程序:
* 雷霄骅 Lei Xiaohua
* leixiaohua1020@126.com
* 中国传媒大学/数字电视技术
* Communication University of China / Digital TV Technology
* http://blog.youkuaiyun.com/leixiaohua1020
*
* 修改:
* 刘文晨 Liu Wenchen
* 812288728@qq.com
* 电子科技大学/电子信息
* University of Electronic Science and Technology of China / Electronic and Information Science
* https://blog.youkuaiyun.com/ProgramNovice
*
* 本项目是一个 FLV 封装格式解析程序,可以分析 UDP/RTP/MPEG-TS 数据包。
*
* This project is the simplest UDP-RTP protocol parser,
* can analyze UDP/RTP/MPEG-TS packets.
*
*/

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996) // 解决 fopen 不安全报错
#pragma pack(1)

/*
* [memo] FFmpeg stream Command:
* ffmpeg -re -i sintel.ts -f mpegts udp://127.0.0.1:8880
* ffmpeg -re -i sintel.ts -f rtp_mpegts udp://127.0.0.1:8880
*/

typedef struct RTP_FIXED_HEADER
{
	/* byte 0 */
	unsigned char csrc_count : 4; // CSRC 计数器,指示 CSRC 标识符的个数
	unsigned char extension : 1; // 如果 X=1,拓展头部会放在 CSRC 之后,携带一些附加信息
	unsigned char padding : 1; // 如果 P=1,则该 RTP 包的尾部就附加一个或多个额外的八位组,它们不是有效载荷的一部分
	unsigned char version : 2; // 版本号,现在使用的都是第 2 个版本,所以该字段固定为 2
	/* byte 1 */
	unsigned char payload_type : 7; // 标识了 RTP 载荷的类型
	unsigned char marker : 1; // 该位的解释由配置文档决定,一般情况下用于标识边界(对于视频,标记一帧的结束;对于音频,标记会话的开始)。

	/* bytes 2, 3 */
	unsigned short sequence_number; // RTP 包序列号

	/* bytes 4-7 */
	unsigned  long timestamp; // 时间戳,反映了该 RTP 报文数据的第一个八位组的采样时刻

	/* bytes 8-11 */
	unsigned long ssrc; // 同步源标识符,标识 RTP 包流的来源,不同源的数据流之间用 SSRC 字段区分

} RTP_FIXED_HEADER; // RTP Header 占 12 字节


typedef struct MPEGTS_FIXED_HEADER
{
	/* byte 0 */
	unsigned sync_byte : 8; // 同步字节,值为 0x47

	/* byte 1, 2 */
	unsigned transport_error_indicator : 1; // 传输错误指示位,置 1 时,表示传送包中至少有一个不可纠正的错误位
	unsigned payload_unit_start_indicator : 1; // 负载单元起始指标位,表示该 TS 包是 PES 包的第一个负载单元
	unsigned transport_priority : 1; // 传输优先级,表明该包比同个 PID 的但未置位的 TS 包有更高的优先级
	unsigned PID : 13; // 该 TS 包的 ID 号,如果净荷是 PAT 包,则 PID 固定为 0x00

	/* byte 3 */
	unsigned transport_scrambling_control : 2; // 传输加扰控制位
	unsigned adaptation_field_control : 2; // 自适应调整域控制位,置位则表明该 TS 包存在自适应调整字段
	unsigned continuity_counter : 4;// 连续计数器,随着具有相同 PID 的 TS 包的增加而增加,达到最大时恢复为 0
	/* 如果两个连续相同 PID 的 TS 包具有相同的计数,则表明这两个包是一样的,只取一个解析即可。 */
} MPEGTS_FIXED_HEADER; // MPEG-TS 包头占 4 字节


int simplest_udp_parser(int port)
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);
	int cnt = 0;

	// FILE *myout = fopen("output_log.txt", "wb+");
	FILE *myout = stdout;
	FILE *fp1 = fopen("output_dump.ts", "wb+");

	// 首先调用 WSAStartup 函数完成对 Winsock 服务的初始化
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		return INVALID_SOCKET;
	}
	/* 调用 socket 函数,它有三个参数:
	1. af:程序使用的通信协议族,对于 TCP/IP,值为 AF_INET
	2. type:要创建的套接字类型,流套接字类型为 SOCK_STREAM(TCP),数据报套接字类型为 SOCK_DGRAM(UDP),还有 SOCK_RAW(原始 socket)
	3. protocol:程序使用的通信协议,若置 0,系统会自动决定传输层协议
	*/
	SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (serSocket == INVALID_SOCKET)
	{
		printf("socket error!");
		return 0;
	}

	sockaddr_in serAddr;
	// sin_family 指明了协议族/域,通常 AF_INET、AF_INET6、AF_LOCAL 等
	serAddr.sin_family = AF_INET;
	// sin_port 即端口号,使用网络字节序,即大端模式
	serAddr.sin_port = htons(port); // htons(port) 将 16 位数从主机字节序(小端字节序)转换成网络字节序(大端字节序)
	// sin_addr 存储 IP 地址,使用 in_addr 这个数据结构,也使用网络字节序
	// 这里的 INADDR_ANY 就是指定地址为 0.0.0.0 的地址,这个地址事实上表示不确定地址,一般在各个系统中均定义为全 0
	serAddr.sin_addr.S_un.S_addr = INADDR_ANY;

	// bind 函数可以将一组固定的地址绑定到 sockfd 上
	if (bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
	{
		printf("bind error!");
		closesocket(serSocket);
		return 0;
	}

	sockaddr_in remoteAddr;
	int nAddrLen = sizeof(remoteAddr);

	// How to parse?
	int parse_rtp = 1;
	int parse_mpegts = 1;

	printf("Listening on port %d.\n", port);

	char recvData[10000];
	while (1)
	{
		// 从 socket 接收缓冲区拷贝数据到 recvData
		int pktsize = recvfrom(serSocket, recvData, 10000, 0, (sockaddr *)&remoteAddr, &nAddrLen);
		if (pktsize > 0)
		{
			// printf("Addr:%s\r\n", inet_ntoa(remoteAddr.sin_addr));
			// printf("packet size:%d\r\n", pktsize);

			// Parse RTP
			if (parse_rtp != 0)
			{
				char payload_str[10] = { 0 };
				RTP_FIXED_HEADER rtp_header;
				int rtp_header_size = sizeof(RTP_FIXED_HEADER);
				// RTP Header
				memcpy((void *)&rtp_header, recvData, rtp_header_size);

				// RFC3551
				char payloadType = rtp_header.payload_type;
				switch (payloadType)
				{
				case 0: sprintf(payload_str, "PCMU"); break;
				case 1:
				case 2: sprintf(payload_str, "reserved"); break;
				case 3: sprintf(payload_str, "GSM"); break;
				case 4: sprintf(payload_str, "G723"); break;
				case 5:
				case 6: sprintf(payload_str, "DVI4"); break;
				case 7: sprintf(payload_str, "LPC"); break;
				case 8: sprintf(payload_str, "PCMA"); break;
				case 9: sprintf(payload_str, "G722"); break;
				case 10:
				case 11: sprintf(payload_str, "L16"); break;
				case 12: sprintf(payload_str, "QCELP"); break;
				case 13: sprintf(payload_str, "CN"); break;
				case 14: sprintf(payload_str, "MPA"); break;
				case 15: sprintf(payload_str, "G728"); break;
				case 16:
				case 17: sprintf(payload_str, "DVI4"); break;
				case 18: sprintf(payload_str, "G729"); break;
				case 19: sprintf(payload_str, "reserved"); break;
				case 25: sprintf(payload_str, "CelB"); break;
				case 26: sprintf(payload_str, "JPEG"); break;
				case 28: sprintf(payload_str, "nv"); break;
				case 31: sprintf(payload_str, "H.261"); break;
				case 32: sprintf(payload_str, "MPV"); break;
				case 33: sprintf(payload_str, "MP2T"); break;
				case 34: sprintf(payload_str, "H.263"); break;
				case 72:
				case 73:
				case 74:
				case 75:
				case 76: sprintf(payload_str, "reserved"); break;
				case 96: sprintf(payload_str, "H.264"); break;
				default: sprintf(payload_str, "other"); break;
				}

				unsigned int timestamp = ntohl(rtp_header.timestamp);
				unsigned int seq_no = ntohs(rtp_header.sequence_number);

				fprintf(myout, "[RTP Pkt] %5d| %5s| %10u| %5d| %5d|\n", cnt, payload_str, timestamp, seq_no, pktsize);

				// RTP Data
				char *rtp_data = recvData + rtp_header_size;
				int rtp_data_size = pktsize - rtp_header_size;
				fwrite(rtp_data, rtp_data_size, 1, fp1);

				// Parse MPEGTS
				if (parse_mpegts != 0 && payloadType == 33)
				{
					MPEGTS_FIXED_HEADER mpegts_header;
					// 一个 TS 包长度固定 188 字节
					for (int i = 0; i < rtp_data_size; i = i + 188)
					{
						if (rtp_data[i] != 0x47) // 判断同步字节,固定为 0x47
							break;
						// MPEGTS Header
						// memcpy((void *)&mpegts_header, rtp_data + i, sizeof(MPEGTS_FIXED_HEADER));
						fprintf(myout, "   [MPEGTS Pkt]\n");
					}
				}
			}
			else
			{
				fprintf(myout, "[UDP Pkt] %5d| %5d|\n", cnt, pktsize);
				fwrite(recvData, pktsize, 1, fp1);
			}

			cnt++;
		}
	}

	closesocket(serSocket);
	WSACleanup();
	fclose(fp1);

	return 0;
}

int main()
{
	simplest_udp_parser(8880);

	system("pause");
	return 0;
}

结果

本程序输入为本机的一个端口号,输出为UDP/RTP/MPEG-TS的解析结果。程序开始运行后,可以使用推流软件向本机的udp://127.0.0.1:8880地址进行推流。例如可以使用VLC Media Player的“打开媒体”对话框中的“串流”功能(位于“播放”按钮旁边的小三角按钮的菜单中)。在该功能的对话框中添加一个“RTP / MPEG Transport Stream”的新目标。

在这里插入图片描述

在这里插入图片描述

也可以使用 FFmpeg 命令推流首先经过RTP封装,然后经过UDP封装的MPEG-TS,端口为 8880:

ffmpeg -re -i sintel.ts -f rtp_mpegts udp://127.0.0.1:8880

程序输出:

在这里插入图片描述

下载链接

优快云:Simplest RTP Parser.zip

GitHub:UestcXiye/Simplest-RTP-Parser

参考

  1. https://blog.youkuaiyun.com/Kayson12345/article/details/81266587
  2. https://blog.youkuaiyun.com/leixiaohua1020/article/details/50535230
  3. https://blog.youkuaiyun.com/weixin_39766005/article/details/132301075
  4. https://blog.youkuaiyun.com/qingkongyeyue/article/details/52920104
  5. https://blog.youkuaiyun.com/qingkongyeyue/article/details/52921559
音视频技术先驱雷霄骅:算法探索与行业传承的永恒之光 本文回顾了音视频技术先驱雷霄骅在FFmpeg、音视频算法革新及开源教育领域的卓越贡献。通过深入分析其技术博客与代码示例,展现了他在WebRTC、H.264等领域的超前洞察与教学智慧,同时探讨了其开源精神在AI时代的延续价值及对开发者健康的深刻反思。 阅读详情

相关推荐

UDP-RTP协议解析

一、RTP协议 数据传输协议RTP,用于实时传输数据。RTP报文由两部分组成:报头和有效载荷 二、RTP的会话过程 当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。RTP的发送过程如下,接收过程则相反...

HAKUNA 3482

雷霄骅系列博客汇总

这两天快速浏览了一下雷霄骅的博客,相信看过他博客的人内心都是无比钦佩,说句天妒英才确不为过,可能雷神说过最多的话大概就是,...没有我想要的,打开源代码... 真的是厉害。雷神不仅分享了自己的学习经历,里面还有一些文章,推理故事等等,都在杂谈里面,当然还有当年那个送别的女生,吃了一瓜。愿雷神在另一个世界安好,继续发光发热。总结了一下雷神博客的主要内容,可能有些杂乱,大部分是按照他分享的时间线总结的。 [总结]FFMPEG视音频编解码零基础学习方法 链接:[总结]FFMPEG视音频编解...

mytzs123的博客 1万+

rtp协议分析

OSI七层模型: 应用层:文件传输,电邮,文件服务等。HTTP,Telnet,DNS, FTP等协议 表示层:数据格式化,代码转换,数据加密等 会话层:解除或建立与别的接点的联系 传输层:提供端到端的接口   TCP UDP  RTP 网络层:为数据包选择路由    IP ICMP RIP 数据链路层:传输有地址的帧以及错误检测功能      物理层:以二进制数据形式在物理媒体上传输

BIGBurning 2万+

纪念音视频界前辈-雷霄骅

这是一篇记录文,纪念一位在音视频领域研究的博士雷霄骅。雷霄骅生前是中国传媒大学通信与信息系统博士在读生,于2016年7月17日凌晨猝死在学校主楼五层,10月就将迎来自己26岁的生日。雷霄骅...

嵌入式Linux 7985

RTP/RTCP协议解析

RTP协议实时传输协议RTP(Real-time Transport Protocol)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的,后在RFC3550中进行更新。 国际电信联盟ITU-T也发布了自己的RTP文档,作为H.225.0,但是后来当IETF发布了关于它的稳定的标准RFC后就被取消了。它作为因特网标准在 [...

machh的专栏 2万+

雷霄骅博士1020篇博客文档

雷神博客合集,从csdn上面花了40个积分下载下来的, 太坑了免费分享给大家

视音频数据处理入门:UDP-RTP协议解析

本文介绍网络协议数据的处理程序。网络协议数据在视频播放器中的位置如下所示。本文中的程序是一个UDP/RTP协议流媒体数据解析器。该程序可以分析UDP协议中的RTP 包头中的内容,以及RTP负载中MPEG-TS封装格式的信息。通过修改该程序可以实现不同的UDP/RTP协议数据处理功能。原理MPEG-TS封装格式数据打包为RTP/UDP协议然后发送出去的流程如下图所示。图中首先每7个MPEG-TS P

雷霄骅(leixiaohua1020)的专栏 20万+

奥比中光Dabai深度相机SDK在Ubuntu22.04的兼容性安装指南

本文详细指导如何在Ubuntu22.04系统上安装奥比中光Dabai深度相机的SDK。针对新旧版本不兼容的核心问题,重点推荐使用经过验证的v1.10.18版本SDK,并提供了从系统依赖检查、SDK下载安装、Python环境配置到编译测试的完整步骤,帮助用户成功解决安装难题并实现相机驱动。

j2k3l4的博客 1000

网络协议---UDP/RTP协议----接受一个UDP包并解析

本文中的程序是一个UDP/RTP协议流媒体数据解析器。该程序可以分析UDP协议中的RTP 包头中的内容,以及RTP负载中MPEG-TS封装格式的信息。通过修改该程序可以实现不同的UDP/RTP协议数据处理功能。 原理 MPEG-TS封装格式数据打包为RTP/UDP协议然后发送出去的流程如下图所示。图中首先每7个MPEG-TS Packet打包为一个RTP,然后每个RTP再打包为一个UDP。其中打包...

qq_42024067的博客 747

MIPI信号的分析--结合示波器实际测试波形

如果排查的思路对你有帮助,请记住 消雨匆匆 or 大吊工。码字和排查很累,仅此而已 ,硬件不是抄电路,拿烙铁,懂点软件,细致分析,找问题和破案搜集线索是一样的。 部分内容来自于此博客的大神总结: http://www.elecfans.com/news/wangluo/20170323499614.html http://www.elecfans.com/yuanqijian/jieko...

消雨匆匆 4万+

新手必看:用FileZilla从武大IGS中心下载GNSS数据,再到crx2rnx转换的完整流程

本文详细介绍了新手如何通过FileZilla从武汉大学IGS中心下载GNSS数据,并使用crx2rnx工具将数据转换为RINEX格式的完整流程。涵盖工具准备、FTP连接、文件解压、格式转换及常见问题排查,帮助测绘和地信专业人员高效处理GNSS观测值数据。

weixin_29292431的博客 425

RTP协议分析

一、简介 1.RTP和RTCP RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。RFC3550不仅定义了RTP,而且定义了配套的相关协议RTCP(Real-time Transport Control Protocol,即实时传输控制协议)。RTP被...

草上爬的博客 1万+

华为云Stack交付实战:从工勘到上线的全流程拆解

本文详细拆解华为云Stack交付全流程,从项目启动、工勘、LLD设计到硬件部署和软件安装,提供实战技巧与避坑指南。重点解析华为云Stack交付流程中的关键环节,如标准化工具使用、规范化文档管理和流程化协作,帮助团队高效完成从工勘到上线的复杂项目交付。

weixin_29243063的博客 156

基于Python的Socket UDP协议RTP数据包通信传输示例

本文主要基于Python语言实现了基于Socket UDP协议的RTP数据包通信与传输,其中,示例RTP数据包为PCMA编码的音频包,其他类型RTP同理,通过socket长连接将示例用户A与B连通并通信

带鱼工作室的博客 1437

手把手拆解UCIe协议层:从Raw Mode到Flit Mode,数据包到底经历了什么?

本文深入解析UCIe协议层的数据包处理机制,从Raw Mode到Flit Mode的三大变体(Standard 256B、68B-Enhanced、Latency-Optimized),详细揭示数据包在不同模式下的封装与转换过程。通过工程师视角,展示协议层如何实现多模式动态切换、错误恢复及与D2D Adapter的协同设计,为芯片级互连技术提供实践指导。

weixin_28728495的博客 239

HITECH海泰克触摸屏如何使用串口进行程序的下载和上传(拨码设置)以及离散量报警相关设定?

HITECH海泰克触摸屏如何使用串口进行程序的下载和上传(拨码设置)以及离散量报警相关设定? 首先,我们进行触摸屏一侧的设置,如下图所示: 触摸屏背后有拨码开关,当我们需要上传或下载程序时,需要将7#开关拨到上面; 左侧是DC24V电源接口; 下方是COM1、COM2和COM3通信端口,选择我们需要的端口后,插上通信电缆,拔掉24V电源,然后重新上电; 然后,屏幕会进入如下图所示界面,此时显示当前选择的端口为COM2,我们点击F2“config”,进入设置界面, 可以看到COM2端口是“Enabled”

Robot_PLC_HMI_Automation 3万+

RTP 基于UDP和TCP协议传输数据的详解以及RTSP协议请求流程详解

1、RTP over RTSP(TCP)优势 对于RTP包为什么用TCP来传输: ①UDP协议上的RTSP/RTP需要打开许多UDP端口,一个端口用于RTSP通信,n个端口用于RTP,n个端口用于RTCP ②中间网络路由器很容易就过滤或者忽略掉UDP数据包 ③UDP是不可靠传输协议,媒体包在因特网上传输时会面临着丢包 2、RTP over RTSP(TCP) 与 RTP over RTSP(...

qq_23552895的博客 6686

Stable Diffusion WebUI 安装前准备

大家好,我是水滴~~在安装 stable-diffusion-webui 前需要做一些准备工作,本篇文章主要介绍需要的电脑配置、魔法、安装 Python、安装 Git 等。

水滴的博客 2100

rtp协议

RTP基本头部信息详解,负载在TCP之上封装以及RTSP中应用差异,Wireshark分析RTP包

一步一脚印 1488

OpenClaw使用ClawHub安装skill网络不稳定?Rate limit exceeded报错?试试这个国内高速镜像工具!

使用 ClawHub 安装 Skill 时遇到 🌐 网络不稳、❌ Rate limit 或命令不可用?使用这个镜像工具,轻松解决skill安装问题,⚡

XiaoqiangClub的博客 1260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

UDP、TCP、RTP三种协议的总结

OSI七层模型 OSI 中的层            功能                                                        TCP/IP协议族  应 用层                 文件传输,电子邮件,文件服务,虚拟终 端         TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet  表示层            

小白的成长笔记 1877

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ffmpeg 怎么处理udp音频_视音频数据处理入门:UDP-RTP协议解析

=====================================================视音频数据处理入门系列文章:=====================================================本文介绍网络协议数据的处理程序。网络协议数据在视频播放器中的位置如下所示。本文中的程序是一个UDP/RTP协议流媒体数据解析器。该程序可以分析UDP协议中的RT...

weixin_39988164的博客 415

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RTP协议浅析

平时看的视频流是靠什么做支撑的?是实时传输协议,英文是Real time transport protocol,简写为RTP协议。 RTP协议的定义:RTP为实时应用提供端到端的运输,但不提供任何服务质量的保障。服务质量由专门的协议提供,比如在IP层面上的QOS提供该服务。需要发送的多媒体数据块(包括视频流数据块、音频流数据块)经过压缩编码处理后,先送到RTP封装成RTP分组(RTP数据报),RT...

weixin_36049506的博客 2884
上一篇: WebRTC | 网络传输协议 RTP 和 RTCP
下一篇: VTK 数据处理:特征边提取
UestcXiye
博客等级 码龄8年 9029粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值