为方便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