C++ H264至PES包装

C++ H264至PES包装,c++,ffmpeg,h.264,mpeg2-ts,C++,Ffmpeg,H.264,Mpeg2 Ts,我有Ti达芬奇h264编码器,我想将其输出帧打包到PES。该数据流采用附录B格式。 我使用ffmpeg的pes头文件编写器制作了如下内容: void MediaPacket::writePesHeader(std::vector< uint8_t >& buffer) { int header_len, flags, len, val; uint8_t *q = buffer.data(); *q++ = 0x00; *q++ = 0x00;

我有Ti达芬奇h264编码器,我想将其输出帧打包到PES。该数据流采用附录B格式。 我使用ffmpeg的pes头文件编写器制作了如下内容:

void MediaPacket::writePesHeader(std::vector< uint8_t >& buffer)
{
    int header_len, flags, len, val;
    uint8_t *q = buffer.data();

    *q++ = 0x00;
    *q++ = 0x00;
    *q++ = 0x01;
    *q++ = 0xe0;

    header_len = 0;
    flags      = 0;
    if (pts != UNKNOWN) {
        header_len += 5;
        flags      |= 0x80;
    }
    if (dts != UNKNOWN && pts != UNKNOWN && dts != pts) {
        header_len += 5;
        flags      |= 0x40;
    }

    len = 0;
    *q++ = len >> 8;
    *q++ = len;
    val  = 0x80;

    *q++ = val;
    *q++ = flags;
    *q++ = header_len;
    if (pts != UNKNOWN) {
        write_pts(q, flags >> 6, pts);
        q += 5;
    }
    if (dts != UNKNOWN && pts != UNKNOWN && dts != pts) {
        write_pts(q, 1, dts);
        q += 5;
    }
    buffer.resize(q-buffer.data());
}

static void write_pts(uint8_t *q, int fourbits, int64_t pts)
{
    int val;

    val  = fourbits << 4 | (((pts >> 30) & 0x07) << 1) | 1;
    *q++ = val;
    val  = (((pts >> 15) & 0x7fff) << 1) | 1;
    *q++ = val >> 8;
    *q++ = val;
    val  = (((pts) & 0x7fff) << 1) | 1;
    *q++ = val >> 8;
    *q++ = val;
}
void mediappacket::writepeheader(std::vector&buffer)
{
int header_len,flags,len,val;
uint8_t*q=buffer.data();
*q++=0x00;
*q++=0x00;
*q++=0x01;
*q++=0xe0;
标题长度=0;
flags=0;
如果(pts!=未知){
收割台长度+=5;
标志|=0x80;
}
如果(dts!=未知和&pts!=未知和&dts!=pts){
收割台长度+=5;
标志|=0x40;
}
len=0;
*q++=len>>8;
*q++=len;
val=0x80;
*q++=val;
*q++=标志;
*q++=标题;
如果(pts!=未知){
写入点(q,标志>>6,点);
q+=5;
}
如果(dts!=未知和&pts!=未知和&dts!=pts){
写入pts(q、1、dts);
q+=5;
}
resize(q-buffer.data());
}
静态无效写入点(uint8*q、int四位、int 64*t点)
{
int-val;
val=4位>30)&0x07)>15)&0x7fff)>8;
*q++=val;
val=((pts)和0x7fff)>8;
*q++=val;
}
使用Totem player和avplay可以很好地播放没有标题的编码器输出,但在显示标题时出现错误“找不到编解码器参数”。 我做错了什么