vlc设置帧缓存大小
⑴ vlc的pts是怎么计算的
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)
⑵ 手机上的vlc怎么使用
必须输入视频详细网络ip地址才可以使用。说到ios版本的VLC播放器,就不能不提到其本身其PC端的软件,号称全平台兼容的万能播放器,支持大部分的主流视频格式。ios版本的VLC播放器视频来源:网络流媒体:对于普通用户来说,不适用且相当繁琐,必须输入视频详细网络ip地址才可以被识别出来。
拓展资料
VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或 multicast的流式服务器在IPv4或 IPv6的高速网络连接下使用。
VLC Media Player 是一款可播放大多数格式,而无需安装编解码器包的媒体播放器。可以播放 MPEG-1、MPEG-2、MPEG-4、DivX、DVD/VCD、数字卫星频道、数字地球电视频道(digital terrestrial television channels)、在许多作业平台底下透过宽频 IPv4、IPv6 网络播放线上影片。
⑶ VLC media player无法删除播放过的直播源地址吗
首先将一个性能好的电脑作为转发服务器,运行VLC Media Player软件,在菜单栏里,通过[文件]→[打开文件],选择[网络],选“HTTP/HTTPS/FTP/MMS”传输协议,在网址填写框内填写需要播放卫星节目的网址,网上的教程均介绍应该填写“ xxx/video.m3u”,但发现不能成功,正确的方式应该填写卫星节目的详细网址,这就和在WEB页面调用VLC Media Player软件时,必须先下载后方能播放成功是一样的道理。
如何知道卫星节目的详细网址呢?以我们转发70.5°E的“Trace TV”音乐频道为例,具体方法如下:
首先进入DM500S接收机的WEB管理控制界面,选择“Trace TV”频道,点击“VLC”,待下载完成后点击播放,此时出现VLC Media Player软件播放该频道的界面。在菜单栏里,通过[查看]→[串流及媒体信息],选择[一般]。
复制“URI”栏目内的网址(注:“URI”应该为“URL”,汉化错误),粘贴到[文件] →[打开文件] →[网络] →[网址]框内,再将[串流/保护]前选项框内打“√”,即可点击“设置”按钮。
进入[串流输出]设置界面。
首先选择[输出]方式,这里选用MMSH协议,地址栏填写转发服务端的IP地址“192.168.1.2”。然后选择[封装方法],一般选用ASF,也可采用MP4、WAV封装方法,不过只能采用MMSH协议输出,如果采用HTTP协议输出,则客户端播放没有画面。
通过VLC串流转码。实际上就是VLC Media Player解码DM500S的TS流,然后VLC Media Player又重新封装打包并且传回网络的过程,这个封装方式可以在[转码选项]中自行变更。在[转码选项]中,选择视频编码器、音频编码器的编码格式时,应考虑客户端有无相应的解码包。一般视频编码器可选择常用的WMV1、WMV2格式,音频编码器选用MP3格式。比特率的选择应考虑网络带宽及转发服务器的性能,在条件允许的情况下,选择较大的比特率有利于画质和音质的提高。选择时注意,视频编码器中的“尺寸”是指播放画面的大小;音频编码器中的“频道”为汉化错误,应该为“声道”,通常选择“2”,表示双声道。
以上的设置完成后,按两次“确定”后退出设置界面,此时VLC Media Player播放器底端会有计时器出现,说明软件已开始进行串流发送。至于成功不成功,我们可以通过菜单栏[查看]→[串流及媒体信息]→[Statistics]来查看。
在下面的[串流]区域内,已有各项发送数据统计数字,表示转发功能正常。注意:在转发时,VLC Media Player软件是没有画面显示和声音输出的,因此其视频和音频区域的“已显示的帧”和“已播放的缓冲器”的统计数字均为“0”。
2、客户端播放
由于转发服务端采用MMSH协议输出,因此只要打开Windows Media Player播放软件,通过[文件]→[打开URL],输入mms://192.168.1.2:1234或,播放软件经过片刻的连接和缓冲后,就可观看节目了,界面的最下方为播放速率。注意:如果转发服务端采用HTTP协议输出,则客户端只能输入地址。
3、使用注意事项
采用该方案关键是转发服务端设置,如果客户端无法播放,首先应该检查转发服务器有无串流输出。对于客户端只有伴音输出而没有画面播出的,则应该检查所选用的输出协议是否正确,其次是所选的视频编码器在客户端有无相应的解码包。
对于广播来讲,它是一种同时向大量客户传输数据的方法。在广播时,是通过使用广播发布点来实现的。在我们上面所介绍的两种方案中,广播发布点就是客户端要输入网址和端口号。使用广播方案时,接收广播的客户端是不能切换频道的,只能是播什么看什么。当服务端(DM500S)或转发服务端(台式机)换机时,客户端(笔记本电脑)软件需要重新启动播放功能。