关于 H264文件中 I帧,B帧,P帧的判断!

朱韦刚
博客专家认证
2012-10-22 09:30:25
一直在用FFMPEG做编码,同时在做rtp打包解包传输的过程中对H264也有一定了解。00 00 00 01 /00 00 01 -> nal(一个字节)->紧跟着数据,这是基本的H264帧。由于现在做项目 TS 的打包 mepeg2 音视频同步的问题,以及后面需要得到H264的I,P,B帧,所以有几个问题想请教:
1:一帧H264数据中哪个字段是判断I,P,B帧的
2:在做ts打包音视频的时候是否可以根据视频的es包(h264数据)判断视频的帧类型
3:pts/dts怎样实现音视频同步。 都需要什么参数,才能解析标准文档给的那个公式。
请高手指教!!
...全文
12536 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmhlb 2014-06-30
  • 打赏
  • 举报
回复
好像是要分析该帧里面所有的slice类型,如果只包含I则该帧为帧,如果只有I和P则为P帧,如果有I,P,B则为B帧
WanderfulltFuture 2013-10-08
  • 打赏
  • 举报
回复
版主:根据 ffmpeg 的源码 ,和官方文档,已经把I,P,B帧取出来了,用到的 哥伦布编码 是否可以分享一下demon?
zoudanye 2013-09-13
  • 打赏
  • 举报
回复
请问楼主,你的音视频同步,做什么播放器?音频数据是PCM?
录事参军 2013-05-08
  • 打赏
  • 举报
回复
引用 12 楼 chanyq_hello 的回复:
楼主,你是怎么提取I帧的,求指教!!!!!
这个你分析一下码流结构nal就可以了,h264的ES码流都是有起始码的,占四个字节,就是0x00 00 00 01,以此为依据可以判断每一帧的起始和结束为止,然后根据slice_head来判断具体的帧类型
chanyq_hello 2013-03-29
  • 打赏
  • 举报
回复
楼主,你是怎么提取I帧的,求指教!!!!!
secina 2013-03-18
  • 打赏
  • 举报
回复
引用 9 楼 zhuweigangzwg 的回复:
根据 ffmpeg 的源码 ,和官方文档,已经把I,P,B帧取出来了,用到的 哥伦布编码,第一个问题,第二个问题解决,现在需要做: 3:pts/dts怎样实现音视频同步。 都需要什么参数,才能解析标准文档给的那个公式。 还要请各位帮忙!
我也想找到怎么取的!楼主解决了自己的问题就不来了么~哭~~
hcking18 2013-03-13
  • 打赏
  • 举报
回复
引用 9 楼 zhuweigangzwg 的回复:
根据 ffmpeg 的源码 ,和官方文档,已经把I,P,B帧取出来了,用到的 哥伦布编码,第一个问题,第二个问题解决,现在需要做: 3:pts/dts怎样实现音视频同步。 都需要什么参数,才能解析标准文档给的那个公式。 还要请各位帮忙!
楼主好人,求取I帧方法!
朱韦刚 2012-11-06
  • 打赏
  • 举报
回复
根据 ffmpeg 的源码 ,和官方文档,已经把I,P,B帧取出来了,用到的 哥伦布编码,第一个问题,第二个问题解决,现在需要做: 3:pts/dts怎样实现音视频同步。 都需要什么参数,才能解析标准文档给的那个公式。 还要请各位帮忙!
朱韦刚 2012-10-31
  • 打赏
  • 举报
回复
现在看标准 当nal_unit_type = 1,2, 5 ,19 的时候 可以有 Slice的定义,现在问题是 slice_type 的字段是边长的,煽编码 这个 真是看不懂了,怎么确定字段长度。
朱韦刚 2012-10-30
  • 打赏
  • 举报
回复
现在我大概能明白 NAL --- SLICE --- macroblock ---- subblock 的h264结构,现在有两个问题
1:哪里有关于这些 头的结构体的字段 的说明文档
2:一个nal数据里 有一个或多个片 (slice),那么 i ,p ,b 帧 为什么要在 片 里面定义?
ArcRain 2012-10-25
  • 打赏
  • 举报
回复
1)I,P,B的信息不在NAL头里,在SLICE HEADER里,只有当NAL负载了SLICE图象时,才能在SLICE HEADER里判断是哪种类型;
2)PTS、DTS算法你可以这么试试,搞个起点时间,然后将起点时间定义为DTS,PTS比这个DTS稍微晚一点,然后每帧的PTS都做为下一帧的DTS,下一帧的PTS就是当前帧的PTS加上帧率折算过来的单位图象播放时间,这样应该就可以了。
朱韦刚 2012-10-25
  • 打赏
  • 举报
回复
怎么没人呢?
朱韦刚 2012-10-24
  • 打赏
  • 举报
回复
请高手指正!!
ArcRain 2012-10-23
  • 打赏
  • 举报
回复
我就说说个人的认识的吧,有误的话还请交流指正。
1)先判断NAL单元负载的数据类型,如果是图象SLICE,那么就看SLICE HEADER里的SLICE TYPE,具体的定义参考H264视频文档;
2)ES包没有标识具体的视频帧类型,只能通过解析NAL单元找出SLICE HEADER来判断。
3)同步的话,PTS/DTS要加在I或IDR帧的TS包里,其他P、B只写PTS就可以了,DTS一般比PTS提前一点.另外那个PCR包,一般1秒左右写一个比较好。
朱韦刚 2012-10-23
  • 打赏
  • 举报
回复
感谢您的回答,原来做 RTP的时候用不到判断 I,P,B帧,可能对H264认识的还不够深。别见笑,
1:I,P,B帧是通过 一个字节的NAL头里面的字段判断的?,NALU 头由一个字节组成, 它的语法如下:

+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
2:有没有具体点的怎么填写PTS,DTS的公式或者算法,再有PCR是个基准始终 需要怎么定义?
朱韦刚 2012-10-22
  • 打赏
  • 举报
回复
关于 流媒体方面,我上传了好多demo,在我的csdn资源中,愿意看的可以了解下!

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧