RTSP to RTMP 基于 Live555

1.前期准备:

Live555

rtmpdunp


2.设计思路:

使用Live555接收码流

将码流封装成RTMP格式

使用librtmp将码流推送到直播平台。


3.相关代码:

3.2.rtsp2rtmp

3.2.1 AAC info header

unsigned char body[4];
body[0] = 0xaf;
body[1] = 0x00;

switch (profile){
 case 0:
	body[2]|=(1<<3);//main
	break;
 case 1:
	body[2]|=(1<<4);//LC
	break;
 case 2:
	body[2]|=(1<<3);//SSR
	body[2]|=(1<<4);
	break;
 default:
	;
}
switch(channel){
 case 1:
	body[3]|=(1<<3);//channel1
	break;
 case 2:
	body[3]|=(1<<4);//channel2
	break;
 default:
	;
}
switch(rate){
 case 48000:
	body[2]|=(1);
	body[3]|=(1<<7);
	break;
 case 44100:
	body[2]|=(1<<1);
	break;
 case 32000:
	body[2]|=(1<<1);
	body[3]|=(1<<7);
	break;
 case 24000:
	body[2]|=(1<<1);
	body[2]|=(1);
	break;
 case 22050:
	body[2]|=(1<<1);
	body[2]|=(1);
	body[3]|=(1<<7);
	break;
 case 16000:
	body[2]|=(1<<2);
	break;
 case 8000:
	body[2]|=(1<<2);
	body[2]|=(1);
	body[3]|=(1<<7);
 default:
	;
}

3.2.2.AAC data frame

只需要在数据帧前面加上2个byte的header:

spec_info[0] = 0xAF;
spec_info[1] = 0x01;

3.2.3 H.264 info header

unsigned char *body;

body = (unsigned char *)malloc(16 + sps_len + pps_len);
memset(body, 0, 16 + sps_len + pps_len);

body[i++] = 0x17;	// 1: IFrame, 7: AVC
					// AVC Sequence Header
body[i++] = 0x00;
body[i++] = 0x00;
body[i++] = 0x00;
body[i++] = 0x00;

// AVCDecoderConfigurationRecord
body[i++] = 0x01;
body[i++] = sps[1];
body[i++] = sps[2];
body[i++] = sps[3];
body[i++] = 0xff;
body[i++] = 0xe1;
body[i++] = (sps_len >> 8) & 0xff;
body[i++] = sps_len & 0xff;
for (size_t j = 0; j < sps_len; j++)
{
	body[i++] = sps[j];
}
body[i++] = 0x01;
body[i++] = (pps_len >> 8) & 0xff;
body[i++] = pps_len & 0xff;
for (size_t j = 0; j < pps_len; j++)
{
	body[i++] = pps[j];
}
3.2.4 H.264 data frame
body = data - 9;
memset(body, 0, 9);
i = 0;
if (bIsKeyFrame== 0) {
	body[i++] = 0x17;	// 1: IFrame, 7: AVC
}
else {
	body[i++] = 0x27;	// 2: PFrame, 7: AVC
}
// AVCVIDEOPACKET
body[i++] = 0x01;
body[i++] = 0x00;
body[i++] = 0x00;
body[i++] = 0x00;

// NALUs
body[i++] = size >> 24 & 0xff;
body[i++] = size >> 16 & 0xff;
body[i++] = size >> 8 & 0xff;
body[i++] = size & 0xff;
memcpy(&body[i], data, size);




<最近在做一些直播相关的项目,希望将一些思路记录下来。供自己及大家参考!>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值