前面博客讲过G711编码,有两种G711A/G711U,主要在安防中应用,是一帧波形编码的音频数据,只是将PCM压缩一半数据量。一般G711,采样率8000,通道数1。所以G711中1B就是一个样本数据。G711打包RTP非常简单,只要在G711数据前加上RTP头即可。G711没有想AAC那样,按照帧一帧一帧发送,而是设定一个打包频率,打包频率有10ms,20ms,30ms,40ms 等。如40ms的打包频率,1S打包25帧,1S需要发送8000个样本,所以一帧需要8000/25=320个样本,RTP时间戳增量绝对值是320/8000S,协议要求以采样率作为时钟频率,所以RTP时间戳为 (320/8000)*8000。

负载类型定义如下:

enum RTP_PAYLOAD_TYPE
{RTP_PAYLOAD_TYPE_PCMU    = 0,RTP_PAYLOAD_TYPE_PCMA    = 8,RTP_PAYLOAD_TYPE_JPEG    = 26,RTP_PAYLOAD_TYPE_H264    = 96,RTP_PAYLOAD_TYPE_H265    = 97,RTP_PAYLOAD_TYPE_OPUS    = 98,RTP_PAYLOAD_TYPE_AAC     = 99,RTP_PAYLOAD_TYPE_G726    = 100,RTP_PAYLOAD_TYPE_G726_16 = 101,RTP_PAYLOAD_TYPE_G726_24 = 102,RTP_PAYLOAD_TYPE_G726_32 = 103,RTP_PAYLOAD_TYPE_G726_40 = 104,RTP_PAYLOAD_TYPE_SPEEX   = 105,
};

RTP打包格式

12BRTP头

G711 负载

DEMO程序采用JRTPLIB实现 ,把G711音频数据打包成RTP发送到指定端口。


#include <rtpsession.h>
#include <rtpudpv4transmitter.h>
#include <rtpipv4address.h>
#include <rtpsessionparams.h>
#include <rtperrors.h>
#include <rtplibraryversion.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>using namespace jrtplib;uint16_t iLocalPort = 6666;
uint16_t iDestPort  = 12000;
uint8_t  szDestAddr[]={192, 168, 1, 108};FILE *pG711File = NULL;void checkerror(int rtperr)
{if (rtperr < 0){std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;exit(-1);}
}void rtpPrintf(uint8_t *buf, uint16_t len)
{uint16_t i=0;printf("RTP len=%d : \n", len);for(i=0; i<len; i++){printf(" %02X", buf[i]);if(i%32 == 31)printf("\n");}printf("\n");
}int main(void)
{int status;RTPSession sess;RTPUDPv4TransmissionParams transparams;RTPSessionParams sessparams;/* set g711a param */sessparams.SetUsePredefinedSSRC(true);sessparams.SetOwnTimestampUnit(1.0/8000.0);sessparams.SetAcceptOwnPackets(true);transparams.SetPortbase(iLocalPort);status = sess.Create(sessparams,&transparams);checkerror(status);RTPIPv4Address addr(szDestAddr,iDestPort);status = sess.AddDestination(addr);checkerror(status);//时间戳sess.SetDefaultTimestampIncrement(320);//PCMAsess.SetDefaultPayloadType(8);sess.SetDefaultMark(true);pG711File = fopen("./test.g711", "rb");if(!pG711File){printf("error: can not open file !\n");return 0;}uint16_t iReadLen = 0;uint8_t  szBuf[1024] = {0};while( !feof(pG711File) ){iReadLen = fread(szBuf, 1, 320, pG711File);//rtpPrintf(buf, read_len);status = sess.SendPacket(szBuf, iReadLen, 8, true, 320);checkerror(status);RTPTime::Wait(0.03);}fclose(pG711File);return 0;
}

编译环境 CentOs6.5,Debug目录运行“make clean;make”重新编译,”./run.sh“运行即可。

测试运行 RTP发送的目标机器上运行VLC,打开test.sdp即可播放G711音频数据。

播放器播放首先播放器要知道采用的接受协议,从哪个端口接受,是什么编码的数据,这些数据信息是通过SDP文件传递给VLC的。如果采用其他协议RTSP/SIP等,在播放之前会进行信令交互,这种情况是通过信令传递SDP信息的。SDP说明如下:

G711文件打开

G711文件不知道怎么播放,可以用audacity.exe打开,打开方式如下图即可播放。

CSDN下载地址:https://download.csdn.net/download/hiwubihe/10811502

RTP打包G711音频数据发送相关推荐

  1. ffmpeg + gstreamer实现rtp传输g711音频验证

    参考了如下链接 https://www.kurento.org/blog/rtp-ii-streaming-ffmpeg 在发送端通过ffmpeg进行rtp推流,并产生sdp文件供接收端使用: ffm ...

  2. RTP打包音频g711

    目录 音频资源 如何计算打包发送间隔.打包字节数 C++ RTP打包代码 JAVA RTP打包代码 RFC3550 RTP:http://www.networksorcery.com/enp/rfc/ ...

  3. Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: 在前面介绍了如何将一个AvPack ...

  4. 海思3536解码G711音频

    海思3536解码G711音频 最近的一个项目,需要增加对G711的解码功能.而HI3536这款芯片是支持对G711进行CPU软件编解码的,所有的解码功能都基于独立封装的海思音频解码库,核心解码器工作在 ...

  5. 安防视频监控系统视频上云解决方案EasyCVR语音转发功能音频数据打包发送流程介绍

    目前我们的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍.Ehome协议调用流程介绍. ...

  6. live555学习笔记7-RTP打包与发送

    七 RTP打包与发送 rtp传送开始于函数:MediaSink::startPlaying().想想也有道理,应是sink跟source要数据,所以从sink上调用startplaying(嘿嘿,相当 ...

  7. live555学习笔记-RTP打包与发送

    RTP打包与发送 rtp传送开始于函数:MediaSink::startPlaying().想想也有道理,应是sink跟source要数据,所以从sink上调用startplaying(嘿嘿,相当于d ...

  8. linux下h.264码流实时rtp打包与发送,Linux下H.264码流实时RTP打包与发送

    由于项目要求在DM6467T平台上添加实时RTP打包发送模块,这才找了找有没有人分享 这方面的经验.这里需要感谢网友:yanyuan9527,他写的文章对我帮助很大,可以说让一个完全小白的人了解了RT ...

  9. QuteCom手记:phapi发送和接收音频数据的流程(ortp portaudio)

    phapi发送和接收音频数据的流程简介. 通过ortp库(完整的源代码在ortp工程中)实现. oRTP协议将在另外一篇中介绍,这里只要知道它是用来发送和接收媒体流(音频和视频)的协议. 本篇只记录使 ...

最新文章

  1. R语言merge函数全连接dataframe数据(Full (outer) join)、merge函数进行全连接必须将参数all设置为true(all=TRUE)、默认merge函数通过公共列名合并数
  2. Rabbitmq 消息对列 生产者与消费者的具体实现 springboot
  3. c++ 常见问题之string
  4. 2020 我的C++的学习之路 第八章函数
  5. iphone桌面上的圆圈怎么设置_苹果手机桌面上找不到便签记事本怎么办?有办法添加吗...
  6. 工作168:代码中的删除逻辑处理
  7. Swift面向对象基础(中)——Swift中的存储属性和计算属性
  8. java color类 蓝色_java color类简介
  9. python解非线性方程_python解非线性方程的问题
  10. find linux 目录深度_15种方法找出Linux系统中最大的N个文件,你懂几种?
  11. 没解决:RuntimeWarning: tp_compare didn't return -1 or -2 for exception
  12. maya多边形建模怎样做曲面_maya中的曲面模型怎么转换成多边形?
  13. ShowModalDialog数据缓存的清除方法
  14. 计算机在微表情的应用,基于深度卷积神经网络的微表情识别
  15. Python运用Xpath爬取故宫壁纸
  16. equal和==的区别
  17. 人工智能的应用无人驾驶技术
  18. 判断入射满射c语言编码,数学上可以分三类函数包括() 答案:单射双射满射...
  19. xamarin其实也是一个鸡肋
  20. “遛狗不牵绳-违法”--遛狗不牵绳识别检测 助力智慧城市犬类管理

热门文章

  1. SDK对接遇到的问题与解决
  2. 杨森翔书法:立马越王台
  3. 【面试复习系列】常用机器学习算法知识点及其解析,面试官会考的几乎都有,欢迎补充
  4. 扫码签到突破100000用户
  5. 淘宝轮播图片制作技巧
  6. 映像文件工具srec
  7. 2021-08-06随记(vertical-align, 顶线、底线、中线、基线,vue原理理解)
  8. 三极管发射极偏置原理应用于LED驱动电路的分析
  9. 【IoT】物联网NB-IoT之电信物联网开放平台对接流程浅析
  10. 微信内网页链接被多人投诉导致拦截的解决方案