我使用 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 来保存该信息。