由于项目要求在DM6467T平台上添加实时RTP打包发送模块,这才找了找有没有人分享 这方面的经验。这里需要感谢网友:yanyuan9527,他写的文章对我帮助很大,可以说让一个完全小白的人了解了RTP打包,链接在此:http://www.chinavideo.org/forum.php?mod=viewthread&tid=7575
一、请大家阅读上面提到的文章,我这里就不详细写了,读了之后应该对RTP打包有一定了解了。不过那篇文章是在windows下实现的,我要说的是linux。首先说linux与windows下socket的几点区别:1.linux下的socket不用初始换。2.linux下定义socketfd直接是Int型,而windows下是SOCKET结构体。下图是linux和windows下socket的区别
二、在linux系统下移植好那篇文章提供的源代码,应该就可以跑通发包了,可以用抓包工具Wireshark抓下包试试。下面上代码:
1.rtp.h
// MPEG2RTP.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
//#include "mem.h"
//
#define PACKET_BUFFER_END (unsigned int)0x00000000
#define MAX_RTP_PKT_LENGTH 1400
#define DEST_IP "192.168.0.30"
#define DEST_PORT 1234
#define H264 96
typedef int SOCKET;
typedef struct
{
/**//* byte 0 */
unsigned char csrc_len:4; /**//* expect 0 */
unsigned char extension:1; /**//* expect 1, see RTP_OP below */
unsigned char padding:1; /**//* expect 0 */
unsigned char version:2; /**//* expect 2 */
/**//* byte 1 */
unsigned char payload:7; /**//* RTP_PAYLOAD_RTSP */
unsigned char marker:1; /**//* expect 1 */
/**//* bytes 2, 3 */
unsigned short seq_no;
/**//* bytes 4-7 */
unsigned long timestamp;
/**//* bytes 8-11 */
unsigned long ssrc; /**//* stream number is used here. */
} RTP_FIXED_HEADER;
typedef struct {
//byte 0
unsigned char TYPE:5;
unsigned char NRI:2;
unsigned char F:1;
} NALU_HEADER; /**//* 1 BYTES */
typedef struct {
//byte 0
unsigned char TYPE:5;
unsigned char NRI:2;
unsigned char F:1;
} FU_INDICATOR; /**//* 1 BYTES */
typedef struct {
//byte 0
unsigned char TYPE:5;
unsigned char R:1;
unsigned char E:1;
unsigned char S:1;
} FU_HEADER; /**//* 1 BYTES */
//BOOL InitWinsock();
2. rtp.c
// NALDecoder.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include "rtp.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
typedef struct
{
int startcodeprefix_len; //! 4 for parameter sets and first slice in picture, 3 for everything else (suggested)
unsigned len;