1. driver works 的API设置时间戳
如果使用driver works提供的接口,使用dwImage_setTimestamp设置每一帧的时间戳
dwImage_setTimestamp (dwTime_t timestamp, dwImageHandle_t image)
2. driver OS 的API设置时间戳
Driver OS提供的接口为 NvMediaIEPFeedFrame, 不同版本输入参数有所变化,基本方式是不变的。时间戳的数据通过SEI配置参数和每一帧数据一起送入上述接口。
起始标记 0x000000014e01; 结束标记 0x80 不用设置,NV编码器会自动设置
以H265为例
//定义结构体
typedef struct {
unsigned int payloadSize;
unsigned int payloadType;
unsigned char payload[1024];
} EncodeH265SEIPayload;
EncodeH265SEIPayload m_h265_sei_playload;
//设置frameIndex + 空格 + 时间戳
m_h265_sei_playload.payloadType = 5; //用户数据
std::string frameIndxStr = std::to_string(frame->frameIndex);
std::string timestamp = std::to_string(frame->timestampns/1000); //时间戳
memset(m_h265_sei_playload.payload, 0, ARRAYS_ALOCATION_SIZE);
sprintf((char*)m_h265_sei_playload.payload, "%s %s", frameIndxStr.c_str(), timestamp.c_str());
m_h265_sei_playload.payloadSize = frameIndxStr.size() + 1 + timestamp.size();
//配置参数
NvMediaEncodePicParamsH265 encodePicParams;
//配置初始化
memset(&encodePicParams, 0, sizeof(NvMediaEncodePicParamsH265));
//IPP mode
encodePicParams.pictureType = NVMEDIA_ENCODE_PIC_TYPE_AUTOSELECT;
encodePicParams.encodePicFlags = NVMEDIA_ENCODE_PIC_FLAG_OUTPUT_SPSPPS;
encodePicParams.nextBFrames = 0;
encodePicParams.seiPayloadArrayCnt = 1;
m_payloadArrH265.payloadSize = m_h265_sei_playload.payloadSize;
m_payloadArrH265.payloadType = m_h265_sei_playload.payloadType;
m_payloadArrH265.payload = m_h265_sei_playload.payload;
encodePicParams.seiPayloadArray = &m_payloadArrH265;
//数据和时间戳配置一起送入NV编码器
NvMediaStatus nvmStatus = NvMediaIEPFeedFrame(m_pNvMIEP.get(), // *encoder
pSciBufObj, // *frame
&encodePicParams, // encoder parameter
NVMEDIA_ENCODER_INSTANCE_0); // encoder instance