如何获取 H.264 帧的 DTS 和 PTS?



我使用 v4l2 从罗技 C920 网络摄像头读取 H.264 帧。我怎样才能在我的程序中获取他们的 PTS 和 DTS?例如,我可以使用此函数确定帧类型:

// < 0 = error
// 0 = I-Frame
// 1 = P-Frame
// 2 = B-Frame
// 3 = S-Frame
int VOutVideoStream::getVopType( const std::vector<uint8_t>& image )
{
    if( image.size( ) < 6 )
        return -1;
    unsigned char *b = (unsigned char*)image.data( );
    // Verify NAL marker
    if( b[ 0 ] || b[ 1 ] || 0x01 != b[ 2 ] ) {
        ++b;
        if ( b[ 0 ] || b[ 1 ] || 0x01 != b[ 2 ] )
            return -1;
    }
    b += 3;
    // Verify VOP id
    if( 0xb6 == *b ) {
        ++b;
        return ( *b & 0xc0 ) >> 6;
    }
    switch( *b ) {
    case 0x65: return 0;
    case 0x61: return 1;
    case 0x01: return 2;
    }
    return -1;
}

PTS 和 DTS 不是 H.264 比特流的一部分。

通常,PTS与从相机抓取的帧相关联。如果您的相机没有提供获取帧的 PTS 和 DTS 的 API,则可以使用 gettimeofday() 之类的内容作为帧的 PTS。

如果相机已经输出 H.264 编码帧,您还需要考虑用于编码的 GOP 结构,尽管我猜如果相机已经输出 H.264,则可能有一个 API 来保存该信息。

最新更新