使用jrtplib传输H.264视频文件(3)

介绍如何发送h264,下面我们介绍下如何接收h264文件。

其中主要关注的就是被拆分的数据包的重组,下面的代码中有详尽的注释。

class CRTPReceiver : public RTPSession
{
protected:
	void OnPollThreadStep();
	void ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack);
	void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress);

public:
	CThreadSafeArray m_ReceiveArray;
	void InitBufferSize();

private:
	CVideoData* m_pVideoData;
	unsigned char m_buffer[BUFFER_SIZE];
	int m_current_size;
};

void CRTPReceiver::InitBufferSize()
{
	m_ReceiveArray.SetMemberSize(BUFFER_SIZE);
	m_pVideoData = new CVideoData();
	memset(m_buffer,0,BUFFER_SIZE);
	m_current_size = 0;
}

void CRTPReceiver::OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress)
{
	//std::cout<<"Got RTCP packet from: "<<senderaddress<<std::endl;
}

void CRTPReceiver::OnPollThreadStep()
{
	BeginDataAccess();

	// check incoming packets
	if (GotoFirstSourceWithData())
	{
		do
		{
			RTPPacket *pack;
			RTPSourceData *srcdat;

			srcdat = GetCurrentSourceInfo();

			while ((pack = GetNextPacket()) != NULL)
			{
				ProcessRTPPacket(*srcdat,*pack);
				DeletePacket(pack);
			}
		} while (GotoNextSourceWithData());
	}

	EndDataAccess();
}

void CRTPReceiver::ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack)
{
	// You can inspect the packet and the source‘s info here
	//std::cout<<"Packet type: "<<rtppack.GetPayloadType()<<std::endl;
	//std::cout<<"Packet says: "<<(char *)rtppack.GetPayloadData()<<std::endl;
	//test RTCP packet
	/*int status = this->SendRTCPAPPPacket(0,(uint8_t*)&("123"),(void*)&("hel"),4);
	checkerror(status);*/

	if(rtppack.GetPayloadType() == H264)
	{
		//std::cout<<"Got H264 packet:êo " << rtppack.GetExtendedSequenceNumber() << " from SSRC " << srcdat.GetSSRC() <<std::endl;
		if(rtppack.HasMarker())//如果是最后一包则进行组包
		{
			m_pVideoData->m_lLength = m_current_size + rtppack.GetPayloadLength();//得到数据包总的长度
			memcpy(m_pVideoData->m_pBuffer,m_buffer,m_current_size);
			memcpy(m_pVideoData->m_pBuffer + m_current_size ,rtppack.GetPayloadData(),rtppack.GetPayloadLength());

			m_ReceiveArray.Add(m_pVideoData);//添加到接收队列

			memset(m_buffer,0,m_current_size);//清空缓存,为下次做准备
			m_current_size = 0;
		}
		else//放入缓冲区,在此必须确保有序
		{
			unsigned char* p = rtppack.GetPayloadData();

			memcpy(m_buffer + m_current_size,rtppack.GetPayloadData(),rtppack.GetPayloadLength());
			m_current_size += rtppack.GetPayloadLength();
		}
	}

}

void StartReceive()
{
	/*CRTPReceiver sess;*/
	sess.InitBufferSize();
	std::string ipstr;
	int status;

	// Now, we‘ll create a RTP session, set the destination
	// and poll for incoming data.
	RTPUDPv4TransmissionParams transparams;
	RTPSessionParams sessparams;

	// IMPORTANT: The local timestamp unit MUST be set, otherwise
	//            RTCP Sender Report info will be calculated wrong
	// In this case, we‘ll be just use 9000 samples per second.
	sessparams.SetOwnTimestampUnit(1.0/9000.0);		

	transparams.SetPortbase(PORT_BASE);
	status = sess.Create(sessparams,&transparams);
	checkerror(status);

	uint32_t dst_ip = inet_addr(DST_IP);
	dst_ip = ntohl(dst_ip);
	RTPIPv4Address addr(dst_ip,DST_PORT);
	status = sess.AddDestination(addr);

	checkerror(status);
}

int main(int argc, char* argv[])
{
	WSADATA dat;
	WSAStartup(MAKEWORD(2,2),&dat);
	StartReceive();
	RTPTime::Wait(RTPTime(3,0));
	return 0;
}
class CVideoData{
public:
	unsigned char * m_pBuffer;
	long m_lLength;
	long m_lMaxLength;
	uint64_t m_pts;

	CVideoData(){m_pBuffer = new unsigned char[BUFFER_SIZE];m_lLength = 0; m_pts = 0;m_lMaxLength = BUFFER_SIZE;}
	CVideoData(long lLength){m_lLength = lLength;m_pts = 0;m_pBuffer = new unsigned char[BUFFER_SIZE];m_lMaxLength = BUFFER_SIZE;}
	~CVideoData(){
		if(m_pBuffer != NULL)
		{
			delete []m_pBuffer;
			m_pBuffer = NULL;
		}
		m_lLength = 0;
	}

};

至此,使用jrtplib传输h264全部完成。

时间: 2024-10-28 19:53:59

使用jrtplib传输H.264视频文件(3)的相关文章

使用jrtplib(RTP)传输H.264视频文件(2)

上一篇我们介绍了RTP协议的一些基本知识,下面我们介绍如何使用jrtplib这个库传输H264编码. JRTP传输: 好了,下面是我写的使用JRTP进行发送H264数据包的例子,具体解释可以看注释.发送端也可以接收接收端发送过来的RTCP数据包. #define MAX_RTP_PKT_LENGTH 1360 #define H264               96 bool CheckError(int rtperr); class CRTPSender : public RTPSessio

【转】实现RTP协议的H.264视频传输系统

1.  引言       随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动清晰的媒体演示的同时,不得不为等待传输文件而花费大量时间.为了解决这个矛盾,一种新的媒体技术应运而生,这就是流媒体技术.流媒体由于具有启动时延小.节省客户端存储空间等优势,逐渐成为人们的首选,流媒体网络应用也在全球范围内得到不断的发展.其中实时流传输协议 RTP 详细说明了在互联网上传递音频和视频的

基于RTP的h.264视频传输系统设计(一)

一.H.264 的层次介绍 H.264 定义三个层次,每个层次支持一组特定的编码功能,并且依照各个层次指定所指定的功能.基础层次(baselineprofile)支持I 帧和 P 帧[1]的帧内和帧间编码,支持自适应的可变长度的熵编码(CAVLC).主要层次(main profile)支持隔行扫描视频,B帧[2]的帧内编码,使用加权预测的帧内编码和使用上下文的算术编码(CABAV).扩展层次(extendedprofile)不支持隔行扫描视频和CABAC,但增加了码流之间高效的转化模式(SP 和

H.264视频在android手机端的解码与播放(转)

随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其中,多媒体由于其直观性和实时性,应用范围越来越广,视频的解码与播放也就成为研究的热点. H.264标准技术日渐成熟,采用了统一的VLC符号编码,高精度.多模式的位移估计,基于4×4块的整数变换.分层的编码语法等.这些措施使得H.264算法具有很高的编码效率,在相同的重建图像质量下,能够比H.263节

H.264视频的RTP荷载格式

Status of This Memo This document specifies an Internet standards track protocol for the   Internet community, and requests discussion and suggestions for   improvements.  Please refer to the current edition of the "Internet   Official Protocol Stand

.264视频文件封装成.MP4方法

.264视频文件封装成.MP4方法 需求: 海康威视输出的视频格式为.264格式,而html5端对其不支持,所以需要将其封装成. mp4格式. Tips:我们常常提到的. mp4格式视频,其实指的是一种容器(或者说集合体),包括视频.音频,甚至是字幕等.而.264是指一种视频的编码方式,起压缩作用.所以将.264文件转换成.mp4文件,其实就是一个解码的过程. 思路: 网上已经提供解决方案,采用ffmpeg库,先将.264文件解码,再编码生成.mp4文件,但这种方式效率较低,10M的视频可能需要

H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式(包含AAC部分解析)

H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+-+      |F|NRI|  Type   |      +---------------+ F: 1 个比特(禁止位).  forbidden_zero_bit. 在 H.264 规范中规定了这一位

H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式

H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+      |0|1|2|3|4|5|6|7|      +-+-+-+-+-+-+-+-+      |F|NRI|  Type   |      +---------------+ F: 1 个比特(禁止位).  forbidden_zero_bit. 在 H.264 规范中规定了这一位

H.264视频编解码器——参考软件JM的下载与编解码

H.264视频编解码器--参考软件JM的下载与编解码 一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6版本,此版本为经典版本: http://iphome.hhi.de/suehring/tml/download/old_jm/ 二.配置编码环境: 下载后打开工程目录中tml.sln文件,VS中会有三个工程,其中rtpdump没用,删掉.另外两个