我正在测试一个项目。我需要将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
((0F & 38)>>3)帧类型=1 ==> I帧
禁止帧类型000
帧类型001帧内编码(I) - iframe
帧类型010预测编码(P) -p帧
帧类型011双向预测编码(B) -b帧
但这是针对MPEG-2的。是否有一些类似的模式,以便我识别和获得MPEG-4传输流的按位操作的帧类型(扩展名为".ts")?
我需要获取多少字节或数据包属于该帧?
非常感谢你的帮助
发布于 2013-09-12 02:28:52
我会解析完整的TS数据包。因此,首先确定您的视频流属于哪个PID (通过解析PAT和PMT)。然后通过查找自适应字段中的'Random Access indicator‘比特来查找关键帧。
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
} } }发布于 2014-12-09 14:24:22
如果您使用的是H.264,那么I帧和P帧应该有特定的字节流。如0x0000000165表示I帧,0x00000001XX表示P帧。因此只需解析和查找连续字节流,这样您就可以识别I帧或P帧。同样,以上字节流依赖于编解码器实现..有关更多信息,请查看FFMPEG..
https://stackoverflow.com/questions/18742683
复制相似问题