加什么264()46=8

只大概说明要点更具体的方法恕不祥叙。
我的开源工程和很多开源项目都有详细完整的实现代码
这些要点都是我自己学习的总结,无责任保证正确性仅做参考。
如發现有问题请丢砖头跪求各方高人指正错误。Orz

首先需要将数据流分割成一个一个独立的NALU数据。

在找到slice的NALU后可以逐字节将NALU的数据与0x80进荇与运算,结果为真表示这个slice(视频帧FRAME)的结束位置

上面的这个代码是摘抄自FFMPEG。他实际作用是判断slice里面的first_mb_in_slice即第1个宏块在slice中的位置,如果是一帧开始这个字段的值肯定是标识第1个宏块。因此也可以完整解析slice的头部信息,解析出first_mb_in_slice如果是0(注意:这是1个哥伦布数值),即这个NALU是一帧的开始

为什么这里的代码是逐字节判断0x80?我额外写点某大神的名言:程序猿不是十万个为什么不是维基猿,程序猿是需求猿如果某程序猿已经着手开始研究如何解析slice头部格式,他很自然的不会有这个疑问

另外通过nal_type以及silice_type也可以判断出帧结束位置,VLC里面的玳码就是这么干

解析到位于帧结束位置的NALU,就可以判断出每一帧(slice)的开始和结尾解析slice的slice_type,根据slice_type可以判断出这个slice的IPB类型。

从现在开始就有两种办法来计算PTS了。

方法一、根据前后帧的IPB类型可以得知帧的实际显示顺序,使用前面获取的sps信息中的帧率以及帧计数frame_count即可計算出PTS。此方法需要做几帧缓存(一般缓存一个group的长度)

一个I帧与下一个I帧之间,是一个group
从上图可见,P类型的帧的显示顺序是排在後面最后一个B帧之后。
所以要获取第7帧的pts起码要知道他下一帧的类型,才能得知他的显示顺序

第8帧的pts=1000(毫秒)*7(帧显示顺序)*帧率

方法二、每一个slice的信息里面,都记录有pic_order_cnt_lsb当前帧在这个group中的显示顺序。通过这个pic_order_cnt_lsb可以直接计算出当前帧的PTS。此方法不需要做帧缓存

i_frame_counter是最菦一次I帧位置的帧序,通过I帧计数+当前group中的帧序得到帧实际显示序列位置,乘上帧率再乘上1000(毫秒)的base_clock(基本时钟频率),得到PTS

因此,实际的计算公式应该是这样

题外话:关于H264中sps里面记录的帧率是实际帧率的2倍包括slice里面的pic_order_cnt_lsb也是2倍递增,我推测可能是编码按照分场(頂场、底场)编码所致另外我注意到sps信息中的offset_for_top_to_bottom_field字段,从命名上貌似是可以用来标记是否逐场,还是分奇偶场编码以上都属猜测,有請高人解惑 Orz

本文出自 “” 博客,请务必保留此出处

13D吨驱动桥9.5吨空气悬挂,配平衡杆

13.0吨驱动桥带差速锁每桥配2空气气囊、配平衡杆

13.0吨驱动桥带差速锁,每桥配4空气气囊、配平衡杆

13.0t驱动桥带差速锁每桥四个气囊,配平衡杆

前悬架少片簧、后悬架气囊

前悬架少片簧、后悬架气囊

注:不符合中华人民共和国法规的例如国三/国四车型,国内已经不能上牌僅供出口,或国内非公路内部转运等不上牌地区使用此参数仅供参考,实际车型配置以店内实车为准

我要回帖

更多关于 多少加多少等于46 的文章

 

随机推荐