資源簡介
基于CS結(jié)構(gòu),發(fā)送端對H264編碼的視屏文件進(jìn)行rtp打包發(fā)送至接收端,接收端在進(jìn)行逆向rtp組包,并保存為本地文件。
代碼片段和文件信息
#include?“h264.h“
FILE?*?poutfile?=??NULL;
char?*?outputfilename?=?“..\\H264_STREAM\\receive.264“;
int?InitiateWinsock()
{
int?Error;
WORD?Version=MAKEWORD(22);
WSADATA?WsaData;
Error=WSAStartup(Version&WsaData); ??????//Start?up?WSA ??
if(Error!=0)
return?0;
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return?0;
}
}
return?1;
}
int??OpenBitstreamFile?(char?*fn)
{
if?(NULL?==?(poutfile?=?fopen(fn?“wb“)))
{
printf(“Error:?Open?input?file?error\n“);
getchar();
}
return?1;
}
NALU_t?*AllocNALU(int?buffersize)
{
NALU_t?*n;
if?((n?=?(NALU_t*)calloc?(1?sizeof(NALU_t)))?==?NULL)
{
printf(“AllocNALU?Error:?Allocate?Meory?To?NALU_t?Failed?“);
exit(0);
}
return?n;
}
void?FreeNALU(NALU_t?*n)
{
if?(n)
{
free?(n);
}
}
unsigned?char?*?rtp_unpackage(char?*bufInint?len)
{
????unsigned?char?recvbuf[1500];
RTPpacket_t?*p?=?NULL;?
RTP_HEADER?*?rtp_hdr?=?NULL;
NALU_HEADER?*?nalu_hdr?=?NULL;
NALU_t?*?n??=?NULL;
FU_INDICATOR *fu_ind?=?NULL;
FU_HEADER *fu_hdr=?NULL;
int?total_bytes?=?0;?????????????????//當(dāng)前包傳出的數(shù)據(jù)
static?int?total_recved?=?0;?????????//一共傳輸?shù)臄?shù)據(jù)
int?fwrite_number?=?0;???????????????//存入文件的數(shù)據(jù)長度
memcpy(recvbufbufIn?len);??????????//復(fù)制rtp包?
printf(“包長度+?rtp頭:???=?%d\n“l(fā)en);
//////////////////////////////////////////////////////////////////////////
//begin?rtp_payload?and?rtp_header
p?=?(RTPpacket_t*)&recvbuf[0];
if?((p?=?malloc?(sizeof?(RTPpacket_t)))==?NULL)
{
printf?(“RTPpacket_t?MMEMORY?ERROR\n“);
}
if?((p->payload?=?malloc?(MAXDATASIZE))==?NULL)
{
printf?(“RTPpacket_t?payload?MMEMORY?ERROR\n“);
}
if?((rtp_hdr?=?malloc(sizeof(RTP_HEADER)))?==?NULL)
{
printf(“RTP_HEADER?MEMORY?ERROR\n“);
}
????
rtp_hdr?=(RTP_HEADER*)&recvbuf[0];?
printf(“版本號?:?%d\n“rtp_hdr->version);
p->v??=?rtp_hdr->version;
p->p??=?rtp_hdr->padding;
p->x??=?rtp_hdr->extension;
p->cc?=?rtp_hdr->csrc_len;
printf(“標(biāo)志位?:?%d\n“rtp_hdr->marker);
p->m?=?rtp_hdr->marker;
printf(“負(fù)載類型:%d\n“rtp_hdr->payloadtype);
p->pt?=?rtp_hdr->payloadtype;
printf(“包號???:?%d?\n“rtp_hdr->seq_no);
p->seq?=?rtp_hdr->seq_no;
printf(“時間戳?:?%d\n“rtp_hdr->timestamp);
p->timestamp?=?rtp_hdr->timestamp;
printf(“幀號???:?%d\n“rtp_hdr->ssrc);
p->ssrc?=?rtp_hdr->ssrc;
//end?rtp_payload?and?rtp_header
//////////////////////////////////////////////////////////////////////////
//begin?nal_hdr
if?(!(n?=?AllocNALU(800000)))??????????//為結(jié)構(gòu)體nalu_t及其成員buf分配空間。返回值為指向nalu_t存儲空間的指針
{
printf(“NALU_t?MMEMORY?ERROR\n“);
}
if?((nalu_hdr?=?malloc(sizeof(NALU_HEADER)))?==?NULL)
{
printf(“NALU_HEADER?MEMORY?ERROR\n“);
}
nalu_hdr?=(NALU_HEADER*)&recvbuf[12];????????????????????????//網(wǎng)絡(luò)傳輸過來的字節(jié)序?,當(dāng)存入內(nèi)存還是和文檔描述的相反,只要匹配網(wǎng)絡(luò)字節(jié)序和文檔描述即可傳輸正確。
printf(“forbidden_zero_bit:?%d\n“nalu_hdr->F);??????????????//網(wǎng)絡(luò)傳輸中的方式為:F->NRI->TYPE..?內(nèi)存中存儲方式為?TYPE->NRI->F?(和nal頭匹配)。
n->fo
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5366??2012-05-08?15:58??sender\h264.h
?????文件??????10794??2012-05-08?15:58??sender\main.c
?????文件??????10240??2012-09-05?11:05??sender\sender\debug\sender.exe
?????文件????3082081??2012-03-28?15:22??sender\sender\H264_STREAM\sender.264
?????文件???????6862??2012-07-29?18:54??sender\sender\sender\Debug\BuildLog.htm
?????文件????????486??2012-09-05?11:05??sender\sender\sender\Debug\cl.command.1.tlog
?????文件??????13560??2012-09-05?11:05??sender\sender\sender\Debug\CL.read.1.tlog
?????文件????????334??2012-09-05?11:05??sender\sender\sender\Debug\CL.write.1.tlog
?????文件???????1202??2012-09-05?11:05??sender\sender\sender\Debug\li
?????文件???????2146??2012-09-05?11:05??sender\sender\sender\Debug\li
?????文件????????414??2012-09-05?11:05??sender\sender\sender\Debug\li
?????文件??????34277??2012-09-05?11:05??sender\sender\sender\Debug\main.obj
?????文件????????464??2012-09-05?11:05??sender\sender\sender\Debug\mt.command.1.tlog
?????文件?????????67??2012-07-29?18:54??sender\sender\sender\Debug\mt.dep
?????文件????????804??2012-09-05?11:05??sender\sender\sender\Debug\mt.read.1.tlog
?????文件????????290??2012-09-05?11:05??sender\sender\sender\Debug\mt.write.1.tlog
?????文件????????381??2012-09-05?11:05??sender\sender\sender\Debug\sender.exe.intermediate.manifest
?????文件?????????66??2012-09-05?11:05??sender\sender\sender\Debug\sender.lastbuildstate
?????文件???????1850??2012-09-05?11:05??sender\sender\sender\Debug\sender.log
?????文件??????69632??2012-09-05?11:05??sender\sender\sender\Debug\vc100.pdb
?????文件?????125952??2012-07-29?18:54??sender\sender\sender\Debug\vc80.idb
?????文件???????3101??2012-07-29?18:55??sender\sender\sender\sender.vcproj
?????文件???????1427??2012-07-29?22:41??sender\sender\sender\sender.vcproj.PC-200909201114.Administrator.user
?????文件???????2580??2012-09-05?11:04??sender\sender\sender\sender.vcxproj
?????文件???????1056??2012-09-05?11:04??sender\sender\sender\sender.vcxproj.filters
?????文件????????143??2012-09-05?11:04??sender\sender\sender\sender.vcxproj.user
?????文件????6753280??2012-07-29?22:41??sender\sender\sender.ncb
?????文件????????885??2012-09-05?11:04??sender\sender\sender.sln
????..A..H.??????7168??2012-07-29?22:41??sender\sender\sender.suo
?????文件???????2054??2012-09-05?11:04??sender\sender\UpgradeLog.xm
............此處省略58個文件信息
評論
共有 條評論