首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测MPEG-4传输流中的I帧数据

检测MPEG-4传输流中的I帧数据
EN

Stack Overflow用户
提问于 2013-09-11 21:32:59
回答 2查看 9.1K关注 0票数 4

我正在测试一个项目。我需要将MPEG-4TS分组的有效载荷数据(使一些字节为零)打破来自用户的百分比。我是通过一个包一个包地读取".ts“文件(188字节)来实现的。但这段视频在一次又一次的过程中变得非常混乱。(顺便说一句,我是用C语言编写程序的)

因此,我决定找到属于I-frames的数据/数据包,然后不接触它们,而是按百分比扰乱其他数据。我可以在下面找到

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

例如,数据是这样的;

00 00 01 00 00 0F FF F8 00 00 01 B5.诸若此类。

这里的前四个字节00 00 01 00是图片起始码。第五个字节和第六个字节的前两个比特是时间基准。所以我们关注的是第六个字节--> 0F

代码语言:javascript
复制
((0F & 38)>>3)

帧类型=1 ==> I帧

禁止帧类型000

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

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

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

但这是针对MPEG-2的。是否有一些类似的模式,以便我识别和获得MPEG-4传输流的按位操作的帧类型(扩展名为".ts")?

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

非常感谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2013-09-12 02:28:52

我会解析完整的TS数据包。因此,首先确定您的视频流属于哪个PID (通过解析PAT和PMT)。然后通过查找自适应字段中的'Random Access indicator‘比特来查找关键帧。

代码语言:javascript
复制
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
} } }
票数 7
EN

Stack Overflow用户

发布于 2014-12-09 14:24:22

如果您使用的是H.264,那么I帧和P帧应该有特定的字节流。如0x0000000165表示I帧,0x00000001XX表示P帧。因此只需解析和查找连续字节流,这样您就可以识别I帧或P帧。同样,以上字节流依赖于编解码器实现..有关更多信息,请查看FFMPEG..

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18742683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档