当前位置: 首页 > news >正文

从零开始精通RTSP之传输ADPCM等音频流

概述

        在上一篇文章中,我们详细介绍了使用RTP传输AAC音频流的打包方法。除了AAC编码算法外,常用的音频编码算法还有ADPCM、G711A、G711U、G726等。接下来,我们继续介绍RTP传输ADPCM等音频流的打包方法。

封装方法

        RTP封装ADPCM等音频数据时,非常简单,直接将音频数据放入RTP包的Payload中即可。此时,RTP包的结构如下。

+-----------------------------+
| RTP Header (12 Byte)        |
| Audio Data ...              |
+-----------------------------+

        其中,Audio Data为已经编码好的ADPCM、G711A、G711U、G726等音频数据。由于音频帧通常较小,可以直接放入RTP包中,无需分片。RTP包封装好以后,通过UDP或其他适合实时传输的网络协议发送给接收端即可。

ADPCM等的SDP

        在使用ADPCM等编码的音频流时,SDP媒体描述应反映这种封装方式,以便接收端能够正确识别、配置解码器并处理音频流。ADPCM等的SDP与AAC的SDP类似,因此,下面将仅介绍有差异的部分。

        ADPCM的SDP:a=rtpmap行中,ADPCM指定音频编码格式为ADPCM。ADPCM(Adaptive Differential Pulse Code Modulation,自适应差分脉冲编码调制)是一种有损音频压缩技术,主要用于降低数字音频数据的存储空间需求和传输带宽,同时力求保持较高的声音质量。ADPCM通过对原始音频信号进行预测、差分编码、量化和自适应调整等步骤,实现了高效的数据压缩。

m=audio 49250 RTP/AVP 22
a=rtpmap:22 ADPCM/8000/1

        G711A的SDP:G711A的RTP负载类型(Payload Type, PT)通常为8。a=rtpmap行中,PCMA指定音频编码格式为G711 A-law。PCMA是ITU-T G711标准中的一种编码方式,常用于电话系统和其他语音通信应用。8000表示音频采样率为8 kHz,即每秒钟采集并编码8000个音频样本。1表示单声道音频,如果是双声道立体声,这里可能会显示2。

m=audio 49250 RTP/AVP 8
a=rtpmap:8 PCMA/8000/1

        G711U的SDP:G711U的RTP负载类型(Payload Type, PT)通常为0。a=rtpmap行中,PCMU指定音频编码格式为G711 U-law。PCMU是ITU-T G711标准中的另一种编码方式,同样广泛应用于电话系统和语音通信应用。8000表示音频采样率为8 kHz,即每秒钟采集并编码8000个音频样本。1表示单声道音频,如果是双声道立体声,这里可能会显示2。

m=audio 49250 RTP/AVP 0
a=rtpmap:0 PCMU/8000/1

        G726的SDP:G726的RTP负载类型(Payload Type, PT)通常为21。a=rtpmap行中,G726-32指定了音频编码标准为G726,并且使用的是32 kbps的编码速率。G726是ITU-T制定的一种ADPCM语音编码标准,它支持四种不同的比特率:16kbps、24kbps、32kbps、40kbps。这里的“32”,即表明使用的是32 kbps的编码模式。

m=audio 49250 RTP/AVP 21
a=rtpmap:21 G726-32/8000/1

注意事项

        1、在会话建立阶段(通常通过SDP协议),发送端和接收端需协商一致使用哪个PT值(Payload Type)来标识音频数据。比如:G711A通常使用PT值8,但应遵循实际协商结果。

        2、RTP包的时间戳增量应与采样率相匹配。比如:G711A使用8 kHz的采样率,每8个样本代表1毫秒,所以时间戳通常按每个样本的采样时间(125 µs)递增。另外,还需要确保时间戳准确反映音频数据的采样时刻,以便接收端能够正确同步和播放音频流。

        3、ADPCM、G711A等编码的音频帧大小适中,通常一个RTP包可以容纳一个完整的音频帧。如有必要,可以按照RTP的分包机制来处理非常大的音频帧。

        4、考虑到网络条件和接收端处理能力,合理控制RTP包的大小,避免因包过大导致网络拥塞或接收端处理困难。

http://www.lryc.cn/news/344034.html

相关文章:

  • box-decoration-break 使用介绍
  • 技术分享 | 京东商品API接口|京东零售数据可视化平台产品实践与思考
  • OpenHarmony鸿蒙蓝牙BLE调试app
  • HackMyVM-VivifyTech
  • 将unity中相机位置保存为json 文件或者 发送给后端
  • vue2-表单组件封装
  • 智能家居4 -- 添加接收消息的初步处理
  • Python selenium
  • Python内置函数next()详解
  • 初识指针(1)<C语言>
  • uniapp使用vconsole调试 兼容App
  • 论文笔记模版
  • docker-本地私有仓库、harbor私有仓库部署与管理
  • 【Go 语言入门专栏】Go 语言的起源与发展
  • 发电机组远程管理,提升管控力,降低运维成本
  • java将文件压缩打包后进行下载
  • 【4/26-4/30】 Arxiv安全类文章速览
  • 活动图与状态图:UML中流程图的精细化表达——专业解析系统动态性与状态变迁
  • Easy TCP Analysis提供了四大特性,兼顾了TCP数据包分析入门学习到实战问题排查不同阶段用户对工具的需求
  • 【2】STM32·FreeRTOS·任务创建和删除
  • 日志审计系统在提高网络安全方面具有哪些重要的作用
  • 二维泊松方程(Neumann+Direchliet边界条件)有限元Matlab编程求解|程序源码+说明文本
  • 13_Scala面向对象编程_伴生对象
  • RS485空调系统到BACnet江森楼宇系统的高效整合攻略
  • Springboot集成Redis操作缓存-06
  • 【WPF】聊聊WPF中INotifyPropertyChanged [TOC]
  • SpringBoot Actuator未授权访问漏洞的解决方法
  • AI大模型探索之路-训练篇18:大语言模型预训练-微调技术之Prompt Tuning
  • Ollamallama
  • 苹果Mac用户下载VS Code(Universal、Intel Chip、Apple Silicon)哪个版本?