H264码合成TS专用API

       为方便264码转换为TS码,针对TSTOOL源码进行分析修改,做成函数接口,供方便调用。目前该接口在VS2013工程环境已经测试通过,不废话,直接上货。

   1.函数API-------  void   taransTs(TNAL* pNal)

     输入参数:TNAL* pNal----264码流帧nalu;TNAL结构见下

     返回:  无

     注:生成的ts码流数据在该函数中,用户可根据自己需要决定是否修改

  2.相关函数结构

    1)API函数taransTs具体内容

     

void taransTs(TNAL* pNal)
{
	NALU_t * nalu=NULL;
	Ts_Adaptation_field  ts_adaptation_field_Head;
	Ts_Adaptation_field  ts_adaptation_field_Tail;
	unsigned long  Timestamp_video = 0;    //一帧视频所用时间
	unsigned long  Timestamp_audio = 0;    //一帧音频所用时间 
	unsigned int framerate = 60;
	unsigned int   videoframetype = 0;    //视频帧类型
     //赋值s
	//分配nal 资源
	nalu = AllocNALU(MAX_VIDEO_TAG_BUF_SIZE);
	nalu->len = pNal->size;       //设置包含nal 头的数据长度	
	memcpy(nalu->buf, pNal->data, pNal->size);//拷贝一个nal 数据到数组中
	nalu->forbidden_bit = nalu->buf[4] & 0x80;                     //1 bit  设置nal 头
	nalu->nal_reference_idc = nalu->buf[4] & 0x60;                 // 2 bit
	nalu->nal_unit_type = (nalu->buf[4]) & 0x1f;                   // 5 bit
	//判断帧类型
	GetFrameType(nalu);	
	FreeNALU(nalu);

	//获得数据值
	Take_Out_Pes(&m_video_tspes, Timestamp_video, 0x00, &videoframetype, pNal->size, pNal->data);
	if (nalu->Frametype == FRAME_I || nalu->Frametype == FRAME_P || nalu->Frametype == FRAME_B)
	{
		//填写自适应段标志
		printf("3PES_VIDEO  :  SIZE = %d\n", m_video_tspes.Pes_Packet_Length_Beyond);
		WriteAdaptive_flags_Head(&ts_adaptation_field_Head, Timestamp_video); //填写自适应段标志帧头
		WriteAdaptive_flags_Tail(&ts_adaptation_field_Tail); //填写自适应段标志帧尾
		//计算一帧视频所用时间
		m_video_tspes.Pes_Packet_Length_Beyond = pNal->size;
		PES2TS(&m_video_tspes, TS_H264_PID, &ts_adaptation_field_Head, &ts_adaptation_field_Tail, Timestamp_video, Timestamp_audio);
		Timestamp_video += 1000 * 90 / framerate;   //90khz
	}
	else
	{
		
		//填写自适应段标志
		printf("3+++PES_VIDEO  :  SIZE = %d\n", m_video_tspes.Pes_Packet_Length_Beyond);
		WriteAdaptive_flags_Tail(&ts_adaptation_field_Head); //填写自适应段标志  ,这里注意 其它帧类型不要算pcr 所以都用帧尾代替就行
		WriteAdaptive_flags_Tail(&ts_adaptation_field_Tail); //填写自适应段标志帧尾
		m_video_tspes.Pes_Packet_Length_Beyond = pNal->size;//lzy
		PES2TS(&m_video_tspes, TS_H264_PID, &ts_adaptation_field_Head, &ts_adaptation_field_Tail, Timestamp_video, Timestamp_audio);//具体内容见下

	}

}
   2)输出参数TNAL结构体    

struct DLL_EXPORT TNAL
{
    int size;  //264码nalu长度
    unsigned char* data;  //内容
    TNAL(): size(0), data(NULL) {}
};
3)合成所用的主角函数--PES2TS函数

int PES2TS(TsPes * ts_pes, unsigned int Video_Audio_PID, Ts_Adaptation_field * ts_adaptation_field_Head, Ts_Adaptation_field * ts_adaptation_field_Tail,
	unsigned long  Videopts, unsi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值