RTP打包G711音频数据发送

前面博客讲过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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


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

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

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

RTP打包G711音频数据发送_第1张图片

RTP打包G711音频数据发送_第2张图片

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

RTP打包G711音频数据发送_第3张图片

G711文件打开

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

RTP打包G711音频数据发送_第4张图片

RTP打包G711音频数据发送_第5张图片

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

 

你可能感兴趣的:(RTP协议,音频处理)