VLC版本2.0.1

最近研究IP-STB音视频同步问题,发现方案自带的自动STC在网络延时过大时,不能成功同步音视频。在参考了VLC的串流播放机制后,以为适当缓冲可以解决此问题,可惜最终结果是稍有缓解,并不能从根本上解决。但这种缓冲时间的计算,对于基于网络这种音视频数据的注入有一定的参考意义。

1、最初的线索:

使用-vvv参数启动VLC时,提示:

[0xb73005f0] main input debug: Buffering 0%
[0xb73005f0] main input debug: Buffering 3%
[0xb73005f0] main input debug: Buffering 6%
[0xb73005f0] main input debug: Buffering 9%
[0xb73005f0] main input debug: Buffering 12%
[0xb73005f0] main input debug: Buffering 15%
[0xb73005f0] main input debug: Buffering 18%
[0xb73005f0] main input debug: Buffering 21%
[0xb73005f0] main input debug: Buffering 24%
[0xb73005f0] main input debug: Buffering 27%

可以查找到这个缓冲过程的打印是从src/input/es_out.c:658行输出的。函数EsOutDecodersStopBuffering的作用是判断当前缓冲流的长度i_stream_duration是否达到预置的i_buffering_duation长度,是则停止缓冲,否则返回等待。

接下来是查i_stream_duration和i_buffering_duation如何计算。

2、i_stream_duration的计算:

在EsOutDecodersStopBuffering中,i_stream_duration是通过input_clock_GetState来获取。而input_clock_GetState是取一个类型为input_clock_t对象的俩个clock_point_t对象成员last和ref的i_stream的差值作为已缓冲数据的长度。

继续查找i_stream值的计算,可以发现i_stream只有在clock_point_Create中进行的设置,而last和ref对象的i_stream值是在input_clock_Update中做了更新,而用于更新i_stream的数据由i_ck_stream传入。input_clock_Update函数的调用位于es_out.c:2324行,该段代码用于设置input_clock_t对象的pcr值,上层传入的命令是ES_OUT_SET_GROUP_PCR,传入此命令的函数只有一个ts.c:2173行的PCRHandle。

查PCRHandle的代码可知,pcr的计算是直接从ts包中获取adaption字段的pcr数据,按照90kHz的时钟转换为秒,并乘以1000000换算成微秒,传递给input_clock_Update,到此完成了i_stream_duration的计算。

3、i_buffering_duration的计算:

在EsOutDecodersStopBuffering中,i_buffering_duration是一个es_out_sys_t对象的i_pts_delay属性再加上另外几个参数来确定。这里我只研究了i_pts_delay的获取,在我的测试中,其余几个值均为0。

es_out_sys_t对象是EsOutDecodersStopBuffering的es_out_t型参数out传入的,回溯代码的调用过程,EsOutDecodersStopBuffering <-EsOutControlLocked <-EsOutControl <-es_out_vaControl <-es_out_control <-CmdExecuteControl,在这里out换成了另一个es_out_t型参数p_out,继续回溯,CmdExecutedControl <-ControlLocked <-Control <-es_out_vaControl <-es_out_Control <-PCRHandle,这里的p_out是demux_t型参数p_demux的成员,PCRHandle <-GatherPES <-Demux <-demux_Demux <-MainLoopDemux,这里的p_demux是input_thread_t型对象p_input成员,再回溯,MainLoopDemux <-MainLoop <-Run,p_input在input.c:550行通过Init函数初始化。

再读Init部分代码,可以发现在input.c:1258行InitSourceInit函数后,i_pts_delay的值发生变化,往下深入,会发现在input.c:2644行,有一个ACCESS_GET_PTS_DELAY操作,最终对应到我的测试中是udp.c:173行,VLC获取了一个叫做:network-caching参数的值,这个值配置的是1000,我猜测应该是ms,返回时又乘以了1000,转换为微秒,准备与i_stream_duration值进行比较。

总结:

这次测试只做了基于udp的组播播放,其它协议可能还有许多细节与udp不同,等到遇到时再进行分析。

读了许久的TS协议,在实际应用中才发现许多东西跟想像的都不同,脱离实际的空想终究是不能成事的。

VLC这个基于PCR的缓冲长度的机制对于我解决不同步的问题,虽没有大的帮助,但应用到播放不同码率的网络串流方面,我想会有一些作用。假设我们开固定大小的缓冲,由于数据传输效率上的问题,经常会遇到解码器缓冲区上溢或下溢的问题,但如果我采用基于时间的缓冲,应该会有一定的改善,只是不知这种分析实时PCR值的方法是否引入了又一个瓶颈。

VLC接收网络串流缓冲时间的计算相关推荐

  1. 网络串流_串流NBA篮球的最便宜方式(无需电缆)

    网络串流 I love NBA basketball. Every year, I get really excited around the beginning of September becau ...

  2. 网络串流_串流NFL足球的最便宜方式(无需电缆)

    网络串流 Football season is almost upon us. That means one thing: expensive cable or satellite TV packag ...

  3. 网络串流_串流免费音乐的最佳网站

    网络串流 The internet has spoiled us with choices. The question is not where to find great content, but ...

  4. python写一个app接收摄像头传输的视频_如何使用Python中的tcp套接字发送和接收网络摄像头流?...

    我正在尝试重新创建this project.我有一台服务器(我的电脑)和一台客户机(我的树莓皮).我所做的与最初的项目不同的是,我尝试使用一个简单的网络摄像头而不是一个覆盆子pi相机将图像从我的rpi ...

  5. html支持网络串流flv视频播放

    1:直接上代码,把url替换成flv访问路径就可以 我这项目是时时拉取nms(Node-Media-Server)的视频 <!DOCTYPE html> <html> < ...

  6. VLC -- 使用VLC串流播放视频

    VLC -- VLC串流播放视频方式 打开VLC后,在"媒体"菜单选择"流"选项,并添加一个即将要串流的视频文件: 然后点击串流按钮,进入如下页面: 该页面显示 ...

  7. VLC电脑串流视频到手机播放

    目标 用电脑把电脑本地的视频文件串流出去,手机上接收播放. 缺点是手机上不能拖动进度条. 条件 手机和电脑处在同一局域网 知道电脑和手机的IP地址 电脑上安装VLC播放器,手机安装支持串流的APP,例 ...

  8. 使用vlc串流http视频链接

    使用vlc串流http视频链接 使用windowsGUI 使用windows命令行 使用linux命令行 使用windowsGUI 媒体---->打开网络串流 填入链接 下拉播放按钮,点击串流 ...

  9. VLC模拟TS直播流

    在项目过程中,使用到显示视频的功能,分为直播和录播.录播就播放本地电脑里的垫片,直播即从直播流中抓取数据,缓冲,再进行解码播放.但很多情况下,无法保证很多情况下有完善的直播流环境,所以需要模拟直播流. ...

最新文章

  1. 使用Gearman做分布式计算
  2. [实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2
  3. 使用Java EE和OIDC构建Java REST API
  4. skywalking(4)
  5. python学习笔记之property
  6. Spring 核心控制器DispatcherServlet(二)
  7. 如何实现一根网线连接路由器,即能上网又可以使用ITV?
  8. linux 配置路由时via,详解Linux系统中配置静态路由的方法
  9. DE16 Continuation: More General Periods
  10. 《和平精英》:新军需山经魅狐、滑板小狐今日正式上线,很帅气!
  11. 现代控制理论 之 LQR控制
  12. 马云单挑“叶问”吊打“战狼”,网友:原来天下武功,唯富不破~是贫穷限制了我的想象力
  13. map和object对象互转
  14. php制作入库单,教你如何利用vba制作自动登记数据的仓库入库单
  15. 艾森豪威尔法则(四象限法则)
  16. JavaScript制作网页动画
  17. Bootstrap登录页面带验证码
  18. Unity开发win10软件系列问题6: unity调用 win10 虚拟键盘tabtip.exe
  19. Python数据分析第八课:初识Matplotlib
  20. 移动宽带GM220-S光猫桥接

热门文章

  1. 韩睿(Henry Han)的VB.NET之旅
  2. 精灵图(sprite)CSS动画实现
  3. 环境科学与生态学SCI期刊 高录用推荐
  4. 专访何海涛:“不正经”程序员的进阶之路
  5. 系统工程师应具备的技能
  6. Flood---ZJFC Weekly - 5
  7. 用DIV+CSS技术设计我的家乡网站(web前端网页制作课作业)南宁绿城之都
  8. 课堂笔记| 第七章:多态
  9. 空气温湿度远程监控手机APP远程监控
  10. 逆袭之旅DAY20.XIA.程序调试