RTSP服务器:RTP传输AAC流

article/2025/9/23 12:23:12

工作流程:

1)读取ADTS头(7字节),解析得到aac帧的信息(频率,声道,帧长度)

2)读取aac原始数据块,使用RTP打包aac原始数据

  RTP打包h264码流时,由于h264数据长度不稳定,少则几字节,多则几千字节,所以RTP打包形式较多,需要根据大小决定是否进行分片。

  而AAC数据块长度不会像h264那样变化,一般稳定在几百字节,所以它的打包方式比较单一。

打包方式如下

RTP包 = rtpheader(12字节) + 载荷标识(4字节)+ AAC数据块

载荷标识(4字节):

// 前两个字节值固定,第三个字节和第四个字节保存AAC Data的大小
// frameSize = adts.length - 7
rtpPacket->payload[0] = 0x00;	
rtpPacket->payload[1] = 0x10;
rtpPacket->payload[2] = (frameSize & 0x1FE0) >> 5; 
rtpPacket->payload[3] = (frameSize & 0x1F) << 3; 

3)传输一个rtp包,并对序列号和时间戳操作

对于rtpheader有一个要注意的点: 传输h264时marker位为0,传输aac时marker位置1

4)回到步骤1,传输下一帧AAC

代码表达:

0)protocol.h

#ifndef __PROTOCOL_H
#define __PROTOCOL_H// 相关协议的约定
typedef struct {char *ip;int tcp_port;int rtp_port;int rtcp_port;
} client_t;
// 在rtsp+rtp传输时,客户端的RTP端口不能指定,需要从SETUP请求中获取// 单独用于RTP_H264/AAC测试
#define RTP_CLIENT_IP       "192.168.102.215"
#define RTP_CLIENT_PORT     2018// 测试文件的路径 
#define AAC_FILE "/home/zhou/ffmpeg/testvideo/001.aac"#endif

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

1)rtp_aac.h

#ifndef __RTP_AAC_H
#define __RTP_AAC_H#include "protocol.h"
/* * @func : RTP打包传输AAC码流* @param: *      sockfd --- UDP socket*      client --- client->ip, client->rtp_port*      path   --- AAC_FILE*/
int rtp_play_aac(int sockfd, client_t *client, const char *path);/* * 例程模块测试:* Linux下直接调用rtp_aac_test(AAC_FILE);* Windows下创建rtp_test.sdp文件,用VLC打开。*//* rtp_test.sdp文件:** m=audio 2018 RTP/AVP 97* a=rtpmap:97 mpeg4-generic/44100/2* a=fmtp:97 SizeLength=13;* c=IN IP4 127.0.0.1*/
int rtp_aac_test(const char *file);#endif

 2)rtp_aac.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "sock.h"
#include "rtp.h"
#include "rtp_aac.h"struct adts_header {     char profile[8];    int channel; int freq;       int length; // 一帧aac长度,包括adts头和原始流 
};static int parser_adts(struct adts_header *adts, uint8_t header[]) {if ((header[0] != 0xFF) && ((header[1] & 0xF0) != 0xF0)) {return -1;  // syncword(12bits)不是0XFFF}memset(adts, 0, sizeof(struct adts_header));// profile 17:18位, 取第3字节高2位int pro = ((unsigned int)header[2] & 0xC0) >> 6; switch (pro) {case 0: strcpy(adts->profile, "Main");break;case 1: strcpy(adts->profile, "LC");break;case 2: strcpy(adts->profile, "SSR");break;default: strcpy(adts->profile, "Unknown");break;};// frequency_idx 19:23位,取第3字节中间4位int freq_index = ((unsigned int)header[2] & 0x3C) >> 2;switch (freq_index) {//...case 3: adts->freq = 48000; break;case 4: adts->freq = 44100; break;default: adts->freq = 0; break;}adts->channel = ((unsigned int)header[2] & 0x01) << 2;adts->channel += ((unsigned int)header[3] & 0xC0) >> 6;// aac_frame_length 30:42(13位) header[3]后2位+header[4]+header[5]前3位int size = ((unsigned int)header[5] & 0XE0) >> 5; // low  3bitssize += header[4] << 3;             // mid  8bitssize += (header[3] & 0x03) << 11;   // high 2bits adts->length = size;return 0;
}static int rtp_send_acc_frame(int sockfd, client_t *client, uint8_t *data, int datalen, struct rtp_packet *packet) {packet->payload[0] = 0x00;packet->payload[1] = 0x10;packet->payload[2] = (datalen & 0x1fe0) >> 5;packet->payload[3] = (datalen & 0x1f) << 3; memcpy(packet->payload+4, data, datalen);int ret = rtp_send_packet(sockfd, client->ip, client->rtp_port, \packet, RTP_HEADER_SIZE+4+datalen);if (ret < 0) return -1;packet->header.seq++;packet->header.timestamp += 1024;return 0;
}int rtp_play_aac(int sockfd, client_t *client, const char *path) {struct rtp_packet *packet = (struct rtp_packet *)malloc(RTP_PACKET_SIZE);rtp_header_init(&packet->header, RTP_PAYLOAD_TYPE_AAC, 1, 0, 0, 0x32411);FILE *fp = fopen(path, "r");if (fp == NULL) {return -1;}uint8_t header[7];struct adts_header adts;uint8_t *data = malloc(8*1024);int ret = 0;while (1) {ret = fread(header, 1, 7, fp);if (ret <= 0) {break;}if (parser_adts(&adts, header) < 0) {printf("failed parser_adts\n");break;}fread(data, 1, adts.length-7, fp);rtp_send_acc_frame(sockfd, client, data, adts.length-7, packet);    //printf("packet seq:%d adts freq:%d length: %d\n",\packet->header.seq, adts.freq, adts.length);float fps = adts.freq / 1024.0;usleep(1000*1000 / (int)fps);}free(packet);free(data);fclose(fp);return 0;
}int rtp_aac_test(const char *file)
{int sockfd = create_udp_socket();if (sockfd < 0) {printf("failed to init socket\n");return -1;}client_t client;client.ip = strdup(RTP_CLIENT_IP);client.rtp_port = RTP_CLIENT_PORT;rtp_play_aac(sockfd, &client, file);close_socket(sockfd);return 0;
}

 如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓


http://chatgpt.dhexx.cn/article/ri5jbvhH.shtml

相关文章

webrtc会话建立

WebRTC SDP 解析 还我漂漂拳哒哒哒关注 0.5032019.03.06 13:01:21字数 1,954阅读 3,150 sdp&#xff08;Session Description Protocol&#xff09;是一种会话描述协议&#xff0c;属于文本协议&#xff0c;即WebRTC中常说的信令&#xff08;Signalling&#xff09;&#xff…

H.264视频的RTP有效负载格式 (RFC-3984)

RFC文档链接 本备忘录的状态 略 摘要 本备忘录描述了ITU-T建议的H.264视频编解码器和技术上相同的ISO/IEC国际标准14496-10视频编解码器的RTP有效载荷格式。RTP有效载荷格式允许在每个RTP有效载荷中对H.264视频编码器产生的一个或多个网络抽象层单元&#xff08;NALU&#…

音视频协议-RTP协议打包

目录 H264打包RTP的方法 RTP打包AAC 1. H264打包RTP的方法 RTP的特点不仅仅支持承载在UDP上&#xff0c;这样利于低延迟音视频数据的传输&#xff0c;另外一个特点是它允许通过其它协议接收端和发送端协商音视频数据的封装和编解码格式&#xff0c;这样固定头的playload typ…

webRTC原理及信令简介

WebRtc基本概念及协议介绍 术语 Signaling channel(信令通道) a) 一种资源&#xff0c;使应用程序可以通过交换信令消息来发现&#xff0c;建立&#xff0c;控制和终止对等连接 b) 信令消息是两个应用程序相互交换以建立对等连接的元数据。该元数据包括本地媒体信息&#xff0…

国网B接口调阅实时视频(INVITE)接口描述和消息示例

前面三篇blog分别介绍国网B接口注册、资源上报和资源信息获取&#xff0c;今天过一下国网B接口调阅实时视频相关的接口描述和消息示例&#xff0c;做过GB28181设备接入的都知道&#xff0c;国网B接口调阅实时视频流程和GB28181的基本一致的&#xff0c;区别在于SDP的一些参数描…

SIP协议之PRACK机制

SIP PRACK&#xff08;Provisional Response ACKnowledgement&#xff09;是由SIP的扩展协议RFC3262定义的&#xff0c;旨在为SIP的临时应答提供传输的可靠性。扩展机制使用选项100rel和临时应答方法PRACK实现。该机制同SIP协议中的2xx对INVITE应答的可靠机制类似。 流程图&am…

HackTheBox: Arctic靶场

废话不多说直接开始&#xff1a; 第一步是在计算机上运行NMAP&#xff1a; # Nmap 7.80 scan initiated Sat Sep 19 14:54:46 2020 as: nmap -sV -O -sC -p- -oN scan 10.10.10.11 Nmap scan report for 10.10.10.11 Host is up (0.021s latency). Not shown: 65532 filtered…

webrtc sdp详解

SDP&#xff08;Session Description Protocol&#xff09;是一种通用的会话描述协议&#xff0c;主要用来描述多媒体会话&#xff0c;用途包括会话声明、会话邀请、会话初始化等。 WebRTC主要在连接建立阶段用到SDP&#xff0c;连接双方通过信令服务交换会话信息&#xff0c;…

SIP协议之呼叫流程

SIP呼呼叫是SIP协议最基本的功能。一个用户呼叫另外一个用户最终完成多媒体通话。此处以常见的B2BUA的服务器模式进行介绍。 环境说明&#xff1a; 主叫&#xff1a;1006 192.168.1.131 被叫&#xff1a;1012 192.168.0.24 SIP服务器&#xff08;以下简称服务器&#xff09;…

GB/T 28181-2011、2016、2022变更对比

一、GB/T 28181-2016与GB/T 28181-2011变更对比 GB/T 28181-2016与GB/T 28181-2011相比&#xff0c; 除编辑性修改外主要技术变化如下&#xff1a; ----(1) 修改了标准名称&#xff1b; ----(2) 增加了媒体流TCP传输要求(见4.3.1&#xff0c; 5.2&#xff0c;附录F&#xff…

会话描述协议-SDP

目录 一. 前言 二. 标准SDP规范说明 会话级描述 媒体级描述 三. WebRTC的SDP 会话描述 媒体信息描述 网络描述 安全描述 服务质量描述 四. 其他 一. 前言 SDP&#xff08;Session Description Protocol&#xff09; 是一种通用的会话描述协议&#xff0c;例如在音视…

h264和h265视频流SDP描述详解

文章目录 1 SDP概述 2.SDP媒体描述极其扩展属性 2.1 m属性介绍 2.2 acontrol附加属性介绍 2.3 artpmap附加属性介绍 2.4 afmtp附加属性介绍 SDP&#xff08;Session Description Protocol&#xff09;会话描述协议&#xff0c;是一种用来描述信息格式的标准&#xff0c;它…

表格标签

表格标签 规则表格 不规则表格–跨行和跨列 表格的高级标签–标题标签和逻辑分区标签

Android实现Excel表格样式

原理描述&#xff1a; 想写来着&#xff0c;但是似乎描述不太清楚。效果图来着&#xff0c;没找到好的视频录制软件&#xff0c;直接上代码吧。 代码&#xff1a; 1、xml布局文件 自定义控件的包名删除了部分&#xff0c;需要重新导入自定义控件&#xff01;&#xff01;&a…

Apache POI 操作Excel表格使用详解 最全

1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。 (2)POI结构说明 包名称 说明 HSSF 提供…

022_Table表格

1. Table表格例子 1.1. Table表格用于展示多条结构类似的数据, 可对数据进行排序、筛选、对比或其他自定义操作。 1.2. Table Attributes 参数 说明 类型 可选值 默认值 data 显示的数据 array 无 无 height Table的高度, 默认为自动高度。如果height为number类型…

java 导入导出excel表格

java 导入导出excel表格 业务上有需求上传excel表格并读取内容&#xff0c;本文记录一下该方法 表格导入 引入相应的工具包 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0&l…

python逻辑回归

出现函数重名问题 异常抛出 异常抛出 #逻辑回归测试 import pandas as pd from sklearn.linear_model import LogisticRegression as LR filename C:/Users/29463/OneDrive/桌面/bankloan.xls data pd.read_excel(filename) #print(data) x data.iloc[:,:8].values y data…

实现带标题的ListView

在一些项目中&#xff0c;往往有要求为ListView里的内容分类&#xff0c;比如按日期分类&#xff0c;就要把相同日期的项目放在一起。可以看一些示例图&#xff0c;会清楚一些&#xff1a; 以上根据标题来进行分类&#xff0c;实现代码如下&#xff1a; 首先是数据项的模型…

java操作excel表格详解

在日常工作中&#xff0c;对Excel工作表格的操作处理可是多的数不清楚&#xff0c;下面是java语言对其的操作&#xff0c;有需要的小伙伴可以参考下 使用场景 1、将用户信息导出为excel表格&#xff08;导出数据…) 2、将Excel表中的信息录入到网站数据库(习题上传…&#xf…