4

我正在测试一个项目。我需要按来自用户的百分比来分解 MPEG-4 ts 数据包的有效负载数据(使某些字节为零)。我通过一个包(188字节)读取“.ts”文件包来做到这一点。但是视频在处理后变得非常泥泞。(顺便说一句,我正在用 C 编写程序)

所以我决定找到属于 I 帧的数据/数据包,然后不接触它们,而是按百分比对其他数据进行加扰。我可以在下面找到

(十六进制) 00 00 00 01 E0 视频 PES 数据包的开始 .. .. .. 00 00 01 B8 组图片头的开始 .. .. .. 00 00 01 00 图片起始码。这是 32 位。紧随其后的 10 位称为时间参考。因此,时间参考将包括图片起始码之后的字节和图片起始码之后第二个字节的前两位,即一个字节(8 位)+ 2 位。这些我们需要跳过。现在存在的三位(来自图片起始码的第二个字节的第 3、4 和第 5 位)将指示帧类型,即 I、B 或 P。因此,要获得这个简单的逻辑与和来自图片起始码的第二个字节使用 0x38 和右移 >> 使用 3。

例如数据是这样的;

00 00 01 00 00 0F FF F8 00 00 01 B5............

这里前四个字节 00 00 01 00 是图片起始码。第五个字节和第六个字节的前两位是时间参考。所以我们关心的是第六个字节 --> 0F

((0F & 38)>>3)

框架类型 = 1 ==> I 框架

帧类型 000 禁止

帧类型 001 内编码 (I) - iframe

帧类型 010 预测编码 (P) - p 帧

帧类型 011 双向预测编码 (B) - b 帧

但这是针对 MPEG-2 的。是否有一些这样的模式,所以我可以识别并获取具有 MPEG-4 传输流的按位运算的帧类型(扩展名为“.ts”)?

我需要得到多少字节或数据包属于该帧?

非常感谢你的帮助

4

2 回答 2

7

我会解析完整的 TS 数据包。所以首先确定你的视频流属于哪个PID(通过解析PAT和PMT)。然后通过在 Adaptation Field 中查找“随机访问指示符”位来查找关键帧。

uint8_t *pkt = <your 188 byte TS packet>;
assert( 0x47 == pkt[0] );
int16_t pid = ( ( pkt[1] & 0x1F) << 8 ) | pkt[2];
if ( pid == video_pid ) {
    // found video stream
    if( ( pkt[3] & 0x20 ) && ( pkt[4] > 0 ) ) {
        // have AF
        if ( pkt[5] & 0x40 ) {
          // found keyframe
} } }
于 2013-09-11T18:28:51.723 回答
-1

如果您使用 H.264,则 I 和 P 帧应该有特定的字节流 .. 就像 I 帧的 0x0000000165 和 P 帧的 0x00000001XX 一样 .. 所以只需解析并寻找连续的这样的字节流,这样你就可以识别 I或P帧..以上字节流再次取决于编解码器实现..有关更多信息,您可以查看FFMPEG ..

于 2014-12-09T06:24:21.507 回答