vlc的pts是怎么计算的

作者&投稿:钟离士 (若有异议请与网页底部的电邮联系)
用vlc连接rtsp服务器,出现错误。。各位大侠们帮忙看看。。~

该错误的意思是媒体数据的pts慢于系统时间过多,导致播放跟不上进度,不得不重新缓冲。
出现该问题有两种可能原因,一个就是媒体数据接收、解码慢,跟不上render的速度;另一个就是系统时钟突变,比如有的系统会对时,导致媒体播放时失去依据,产生这个错误。楼主不知道是哪一种。

H264的ES原始数据一般是以NAL(Network Abstract Layer)的格式存在。可以直接用于文件存储和网络传输。每一个NALU(Network Abstract Layer Unit)数据,是由数据头+RBSP数据组成。

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

接着获取NALU的nal_type,i_nal_type的值等于0x7表示这个nalu是个sps数据包。找到并解析这个sps数据包,里面包含有非常重要的帧率信息
time_scale/num_units_in_tick=fps

然后根据nal_type判断slice(H264中的slice类似一个视频帧FRAME的概念)。其中nal_type值小于0x1,或大于0x5,表示这个NALU属于一个slice。
// 检查是否是slice if ( i_nal_type 5/*NAL_SLICE_IDR*/ ) // 找到slice!!!!!

在找到slice的NALU后,可以逐字节将NALU的数据与0x80进行与运算,结果为真表示这个slice(视频帧FRAME)的结束位置。
// 判断是否帧结束 for (uint32_t i = 3; i < nal_length; i++) { if (p_nal[i] & 0x80) { // 找到frame_begin!!!!上一帧frame的结束,下一帧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类型。
// 根据slice类型判断帧类型 switch(slice.i_slice_type) { case 2: case 7: case 4: case 9: *p_flags = 0x0002/*BLOCK_FLAG_TYPE_I*/; break; case 0: case 5: case 3: case 8: *p_flags = 0x0004/*BLOCK_FLAG_TYPE_P*/; break; case 1: case 6: *p_flags = 0x0008/*BLOCK_FLAG_TYPE_B*/; break; default: *p_flags = 0; break; }

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

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

I P B B I P B B I P B ... 帧类型
1 2 3 4 5 6 7 8 9 10 11 ... 第几帧
1 4 2 3 5 8 6 7 9 12 10 ... 帧显示顺序

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

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

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

计算公式:

pts=1000*(i_frame_counter + pic_order_cnt_lsb)*(time_scale/num_units_in_tick)

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

I P B B I P B B I P B ... 帧类型
1 2 3 4 5 6 7 8 9 10 11 ... 第几帧
1 4 2 3 5 8 6 7 9 12 10 ... 帧显示顺序
0 6 2 4 0 6 2 4 0 6 2 ... pic_order_cnt_lsb

细心一点可以注意到,在上图,slice里面的pic_order_cnt_lsb是以2进行递增。
通常H264里面的sps中记录的帧率,也是实际帧率的2倍time_scale/num_units_in_tick=fps*2

因此,实际的计算公式应该是这样
pts=1000*(i_frame_counter*2+pic_order_cnt_lsb)* (time_scale/num_units_in_tick)
或者是
pts=1000*(i_frame_counter+pic_order_cnt_lsb/2)* (time_scale/num_units_in_tick/2)

所以,第11帧的pts应该是这么计算
1000*(9*2+2)*(time_scale/num_units_in_tick)

H264的ES原始数据一般是以NAL(Network Abstract Layer)的格式存在。可以直接用于文件存储和网络传输。每一个NALU(Network Abstract Layer Unit)数据,是由数据头+RBSP数据组成。

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

接着获取NALU的nal_type,i_nal_type的值等于0x7表示这个nalu是个sps数据包。找到并解析这个sps数据包,里面包含有非常重要的帧率信息
time_scale/num_units_in_tick=fps

然后根据nal_type判断slice(H264中的slice类似一个帧FRAME的概念)。其中nal_type值小于0x1,或大于0x5,表示这个NALU属于一个slice。
// 检查是否是slice if ( i_nal_type < 1/*NAL_SLICE*/ || i_nal_type > 5/*NAL_SLICE_IDR*/ ) // 找到slice!!!!!

在找到slice的NALU后,可以逐字节将NALU的数据与0x80进行与运算,结果为真表示这个slice(帧FRAME)的结束位置。
// 判断是否帧结束 for (uint32_t i = 3; i < nal_length; i++) { if (p_nal[i] 0x80) { // 找到frame_begin!!!!上一帧frame的结束,下一帧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类型。
// 根据slice类型判断帧类型 switch(slice.i_slice_type) { case 2: case 7: case 4: case 9: *p_flags = 0x0002/*BLOCK_FLAG_TYPE_I*/; break; case 0: case 5: case 3: case 8: *p_flags = 0x0004/*BLOCK_FLAG_TYPE_P*/; break; case 1: case 6: *p_flags = 0x0008/*BLOCK_FLAG_TYPE_B*/; break; default: *p_flags = 0; break; }

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

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

I P B B I P B B I P B 帧类型
1 2 3 4 5 6 7 8 9 10 11 第几帧
1 4 2 3 5 8 6 7 9 12 10 帧显示顺序

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

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

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

计算公式:

pts=1000*(i_frame_counter + pic_order_cnt_lsb)*(time_scale/num_units_in_tick)

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

I P B B I P B B I P B 帧类型
1 2 3 4 5 6 7 8 9 10 11 第几帧
1 4 2 3 5 8 6 7 9 12 10 帧显示顺序
0 6 2 4 0 6 2 4 0 6 2 pic_order_cnt_lsb

细心一点可以注意到,在上图,slice里面的pic_order_cnt_lsb是以2进行递增。
通常H264里面的sps中记录的帧率,也是实际帧率的2倍time_scale/num_units_in_tick=fps*2

因此,实际的计算公式应该是这样
pts=1000*(i_frame_counter*2+pic_order_cnt_lsb)* (time_scale/num_units_in_tick)
或者是
pts=1000*(i_frame_counter+pic_order_cnt_lsb/2)* (time_scale/num_units_in_tick/2)

所以,第11帧的pts应该是这么计算
1000*(9*2+2)*(time_scale/num_units_in_tick)


linuxwas卸载
#Sendlocale-relatedenvironmentvariables SendEnvLANGLC_CTYPELC_NUMERICLC_TIMELC_COLLATELC_MONETARYLC_MESSAGES SendEnvLC_PAPERLC_NAMELC_ADDRESSLC_TELEPHONELC_MEASUREMENT SendEnvLC_IDENTIFICATIONLC_ALLLANGUAGE SendEnvXMODIFIERS 1.5SecureShell示例 \/\/以当前用户身份创建远程交互式shell,然后在结束时使用exit命令返回到...

Linux中find常见用法示例
[root@book class]# who | awk ’{print $1"t"$2}’cnscn pts\/0===awk—grep—sed[root@book class]# df -k | awk ‘{print $1}’ | grep -v ’none’ | sed s"\/\/dev\/\/\/g"文件系统sda2sda1[root@book class]# df -k | awk ‘{print $1}’ | grep -v ’none’文件系统\/dev\/s...

...万兆模块 是什么类型的 光纤接口? 是LC 还是SC SFP-10G-SR LC还 ...
光纤接口为LC,光纤为50.0多模光缆,根据光缆类型传输距离不同,最好使用OM3以上的光缆;设备端需要SFP+口。光纤跳线(又称光纤连接器)是指光缆两端都装上连接器插头,用来实现光路活动连接;一端装有插头则称为尾纤。光纤跳线(Optical Fiber Patch Cord\/Cable)和同轴电缆相似,只是没有网状屏蔽层。中心...

请帮我查询从美国寄往中国的包裹 急急急!!!
Label\/Receipt Number: LC61 0961 675U S Class: First-Class Mail International Service(s): International Letter Status: Acceptance Your item was accepted at 11:18 AM on August 15, 2009 in SEATTLE, WA 98103. Information, if available, is updated periodically throughout the day. Ple...

帮我查一下国际邮包,跟踪号LC166723015US。从美国寄往中国的。
(美国邮政官网,邮件查询功能)来查你的信件。就是把你的邮件号码输入到空白处。参考资料:http:\/\/trkcnfrm1.smi.usps.com\/PTSInternetWeb\/index.jsp

我想要以前姚明NBA比赛的全场录像
http:\/\/115.com\/lb\/5lbcmbpltmil 08-09西部半决赛第一场,姚明第四节王者归来 http:\/\/115.com\/lb\/5lbdyxzw0kan 06-07湖人VS火箭1(科比53PTS姚明39PTS麦迪30PTS)http:\/\/115.com\/lb\/5lbewhbzr513 06-07湖人VS火箭2(科比53PTS,姚明35PTS 15REBS)http:\/\/115.com\/lb\/5lbbsl7lc0jh 不...

求哈利波特与密室的游戏攻略
set statusitemjellybeans ncount *更改比比多味豆数量*表示你要更改的数量 set statusitemgryffindorpts ncount *更改学院分(不知是否能用) AddPotions 7000 得到7000瓶魔药!!! AddBeans 30000 得到30000颗比比多味豆 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...

沈阳市15897517496: 如何在AAC数据中获取PTS? -
咎贴安博: 注意:LATM(Low Overhead Audio Transport Multiplex)是用于传输的封装,并不会见到可以存储的文件形式.表搞混淆.AAC编码后的数据,有个貌似视频FRAME的概念,编码后的数据是按照FRAME进行存放输出的.解码也是一个FRAME一...

沈阳市15897517496: 篮球运动员效率值如何计算 -
咎贴安博: 效率公式 ((PTS + REB + AST + STL + BLK) - ((FGA - FGM) + (FTA - FTM) + TO)) / G pts是得分,reb是篮板,ast是助攻,stl是抢断,blk是盖帽 fga就是投篮次数,fgm就是投篮命中数 fta就是罚球数,ftm就是罚球命中数 to是失误,最后的分母是场次

沈阳市15897517496: PTS法是什么 -
咎贴安博: 什么是PTS法? 既定时间标准设定(Predetermined Time Standards, PTS)法是作业测定中常用的一种方法.这种方法比标准要素法更进了一步,它是将构成工作单元的动作分解成若干个基本动作,对这些基本动作进行详细观测,然后做成基本动作的标准时间表.当要确定实际工作时间时,只要把工作任务分解成这些基本动作,从基本动作的标准时间表上查出各基本动作的标准时间,将其加合就可以得到工作的正常时间,然后再加上宽放时间,将其加合,就可以得到工作的正常时间,然后再加上宽放时间,就可以得到标准工作时间.

沈阳市15897517496: 工业工程之PTS -
咎贴安博: 预定标准系统. 基础工业工程主要是工作研究,包括两个板块,方法研究与时间测定.时间测定中最重要的也是最简单高效的方法pts.pts中用得最广的也是最简单的是模特排时法.pts即是预先规定什么样的动作时间标准是多少,然后就可以根据这个计算出实际作业的时间,经过修正后就可以制订时间标准了(这是我们进行时间研究的一般目的). 纯手写,望采纳

沈阳市15897517496: 关于Pts的计算是怎么算的呀.谁知道 -
咎贴安博: #8205; #define MKWORD(h, l) (((h) 6; index ++; peshdr_datalen = buf[index++]; if (ptsflag 0x2) { uint64 pts; ushort pts29_15, pts14_0; unsigned uint64 pts32_30 = (buf[index] 0x0e) 1; index++; pts29_15 = MKWORD(buf[ind.

沈阳市15897517496: h264封装成PS过程中PTS,SCR等怎么计算 -
咎贴安博: 1:MPEG-2标准文档里有详细解释公式的system_clock_frequency参考值范围,t(i)就是到达时间.时间戳PTS的单位不是ms为单位,而是一个33位数字,单位是90KHz的倍数,因此可以利用这个系数换算成s或ms.具体的PTS解释MPEG-2标准...

沈阳市15897517496: CSS中的pts是什么单位,有人知道么? -
咎贴安博: 没有pts单位,css尺寸单位如下: px(像素),相对长度单位,像素(px)是相对于显示器屏幕分辨率而言的,国内推荐; em(相对长度单位),相对于当前对象内文本的字体尺寸,国外使用比较多; pt(Point:点),绝对长度单位,一般是老版本的table使用长度大小单位,目前基本上没有使用.

沈阳市15897517496: 如何用vlc搭建rtsp服务器 -
咎贴安博: 1. 打开“媒体——流”选项2. 点击“添加”按钮选择流媒体文件,然后点击“串流”按钮3. 点击“下一个”后,在“目标设置”界面选择“RTSP”,然后点击添加 + 按钮4. 填上目标ip地址,并在“转码选项”中选择相应的编码类型(这个视情况而定),目标IP地址就是PC机器本机的IP地址5. 客户端, 点击“媒体——打开网络串流”,在弹出的框中输入“rtsp://192.168.1.2:1234/tcp1”,点击“播放”按钮即可.

沈阳市15897517496: 示波器存储深度pts是什么 是多大的呀? -
咎贴安博: 这是数字示波器的一个基本参数,pts是points的缩写.这个参数的含义是示波器一次采集显示可以处理的波形点数,每个示波器的这个参数不一样,所以你问这个是多大没有意义

沈阳市15897517496: 用VLC播放器的dll写程序怎样实现录像功能 -
咎贴安博: 1、运行vlc,界面很简单.如图: 2、点击菜单中的文件,打开文件. 3、弹出对话框,在自定义里面输入screen://,点击确定.如图: 4、打开文件-向导.如图: 5、在串流/转码向导里选择转码/储存至文件选项,点击下一步.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网