文档章节

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

__August__
 __August__
发布于 2015/04/30 08:15
字数 482
阅读 413
收藏 7

介绍如何发送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全部完成。

本文转载自:http://blog.csdn.net/liushu1231/article/details/9203643

__August__
粉丝 13
博文 25
码字总数 27477
作品 0
广州
程序员
私信 提问
使用jrtplib(RTP)传输H.264视频文件(1)

继续上一篇博客,在使用x264对视频进行编码之后,我们需要将编码好的视频进行网络传输,发送给其他的客户端,之后再进行解码。那么,这篇博客我将介绍下如何使用jrtplib这个库对编码后的文件...

__August__
2015/04/30
2.3K
0
使用jrtplib(RTP)传输H.264视频文件(2)

上一篇我们介绍了RTP协议的一些基本知识,下面我们介绍如何使用jrtplib这个库传输H264编码。 JRTP传输:好了,下面是我写的使用JRTP进行发送H264数据包的例子,具体解释可以看注释。发送端也...

__August__
2015/04/30
1K
1
ffmpeg spydroid -> jrtplib

手机上采用Spydroid程序。 https://github.com/fyhertz/spydroid-ipcamera 先用 libcurl上实现的rtsp客户端。 https://github.com/Akagi201/curl-rtsp 此项目简单,只有一个.c文件。rtsp本质...

shengjuntu
2016/07/12
95
0
[总结]视音频编解码技术零基础学习方法

一直想把视音频编解码技术做一个简单的总结,可是苦于时间不充裕,一直没能完成。今天有着很大的空闲,终于可以总结一个有关视音频技术的入门教程,可以方便更多的人学习从零开始学习视音频技...

leixiaohua1020
2014/06/16
0
0
深入解析 H.265 编码模式,带你了解Apple全面推进H.265的原因

今天我们聊聊视频编码。视频文件亘古以来存在一个矛盾:高清画质和视频体积的冲突,相同编码标准下,视频更高清,视频体积更大。因此,应用更先进的视频编码标准,降低视频体积,可以大幅降低...

又拍云
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
44分钟前
69
5
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部