播放问题排查:
一旦我们遇到视频播放不了,第一件事,就是要找几个别的播放器也播放看看,做一下对比测试,或者对码流做一些基础分析,以便更好的定位问题的源头,而各个平台比较常见的播放/分析工具有如下几个:
2.1 命令行工具
ffplay,ffprobe,mediainfo,hls-analyzer 等
2.2 网页端工具
2.3 App 应用
vlc,vplayer,mxplayer 等
2.4 Windows 工具
mp4info,FlvParse,FLVMeta,Elecard StreamEye Studio 等
 ping 一下域名试试,看看是否可以 ping 通,如果 ping 不通,则可能要检查下域名解析的配置了。
只有音频没有视频,或者只有视频没有音频:
基于 ffmpeg 的播放器的 `probesize` 设置太小,导致解析码流信息不足
播放卡顿:
- 频繁出现缓冲 - 播放不够流畅,画面一卡一卡的
其实是指播放器渲染的帧率太低
如何判断主播网络不好
(1)带宽测试
用带宽测试工具:Speedtest by Ookla - The Global Broadband Speed Test 测试下主播的带宽,如果主播的上行带宽明显小于推流的码率,那么肯定会出现推流帧率不稳定。
(2)统计回调
一般的推流 SDK 都会统计主播推流的实时视频帧率,如果预设的帧率是 20fps,但是实际的帧率低得很多,比如 5fps,排除手机性能低的原因的话,多半也是网络带宽不足引起的。
播放设备性能不足:
- 尽可能选择使用硬解,充分利用 GPU 加速 - 如果有多种码流,尽可能在低端机上选择非高清码流 - 增大缓冲区,有助于缓解解码不稳定带来的卡顿
可以修改 ffplay 源码,把读取到的每一帧音频、视频的时间戳打印出来看看,这里我给出对 ffplay 的修改 commit 记录,大家可以参考一下:
为了有效降低 DNS 解析对首开的影响,我们可以提前完成播放域名->IP 地址的解析,并缓存起来,播放的时候,直接传入带 IP 地址的播放地址,从而省去了 DNS 解析的耗时。
如果要支持用 ip 地址播放,是需要修改底层 ffmpeg 源码的,目前七牛的 PLDroidPlayer 就支持这样的播放地址:
URL 格式:“protocol://ip/path?domain=xxxx.com”
所有基于 ffmpeg 的播放器,都会遇到 `avformat_find_stream_info` 这个函数耗时比较久,从而增大了首开时间,该函数主要作用是通过读取一定字节的码流数据,来分析码流的基本信息,如编码信息、时长、码率、帧率等等,它由两个参数来控制其读取的数据量大小和时长,一个是 probesize,一个是 analyzeduration
减少 probesize 和 analyzeduration 可以有效地减少 `avformat_find_stream_info` 的函数耗时,从而加快首开,但是需要注意的是,设置地太小可能会导致读取的数据量不足,从而无法解析出码流信息,导致播放失败,或者出现只有音频没有视频,只有视频没有音频的问题。
一般图像处理、数据拷贝、编解码带来的延时,都是 ms 级别的,真正会产生比较大延时的地方,一个是互联网上的网络传输延时,另一个就是业务代码中的缓冲区了。
推流端的数据是怎么 “积累” 起来的 ?
采集 -> 编码 -> 数据发送 -> [服务器]
当网络产生抖动的时候,“数据发送” 会因此减慢,产生一定的阻塞,从而导致这些数据会被 “积累” 在了推流端的发送缓冲区中。
[服务器]-> 数据接收 -> 解码 -> 渲染
当网络产生抖动的时候,服务器的数据无法 “及时” 地传输到播放端,而由于 TCP 协议的可靠性,所有的数据都会被服务端积累起来,在网络恢复良好的时候,会快速传输到播放端,这些数据会被动地 “积累” 在接收缓冲区中。
怎么消除业务缓冲区的累积延时呢 ?
推流端的发送缓冲区,可以在网络恢复良好的时候,快送发送出去,从而消除掉这个累积延时。
播放端的接收缓冲区,可以通过丢帧或者加速播放的方式快速消费掉缓冲区中的数据,从而消除累计延时。
想从本质上解决直播延时问题,还是要换成基于 udp 的私有协议来传输数据。
参考:

ffmpeg编码常见问题排查方法的更多相关文章

  1. DB常见问题排查方法

    一般情况下,系统多多少少都会遇到点问题,那么遇到问题之后我们怎么定位原因呢?在这里我只说如何定位DB的问题. 看这篇文章有个前提:监控数据要完整!监控数据要完整!!监控数据要完整!!!比如下面这个乍一 ...

  2. ffmpeg编码h264只包含I帧P帧的方法

    ffmpeg使用avcodc_encode_video编码,默认产生的h264包含B帧,在安防行业很多地方是不需要用到B帧的. 1.基础知识充电 这就涉及到h264的各种profile格式了,参考 h ...

  3. spring无法启动常见原因及排查方法

    这里总结的问题,通常啥错误也不报,需要自个debug排查,当然每个人遇到的问题可能是不同的,这里仅仅是我个人帮同事解决问题后的一些总结,可能网上的小伙伴可能也遇到,姑且简单记录一下: 1. mybat ...

  4. JAVA线上常见问题排查手段(小结)

    在平时开发过程中,对于线上问题的排查以及系统的优化,免不了和Linux进行打交道.每逢大促和双十一,对系统的各种压测性能测试,优化都是非常大的一次考验.抽空整理了一下自己在线上问题排查以及系统优化的一 ...

  5. CentOS 7 执行 yum 命令失败问题的排查方法

    一个执着于技术的公众号 简介 本文主要为大家讲解 CentOS 7系统中执行yum命令失败等常见问题的排查方法. 1.执行yum命令报404错误 1)检查yum仓库是否配置正确,可以到阿里云下载rep ...

  6. Linux安全事件应急响应排查方法总结

    Linux安全事件应急响应排查方法总结 Linux是服务器操作系统中最常用的操作系统,因为其拥有高性能.高扩展性.高安全性,受到了越来越多的运维人员追捧.但是针对Linux服务器操作系统的安全事件也非 ...

  7. SQL Server同步复制问题排查方法

    1.应用复制的命令时在订阅服务器上找不到该行 解决方法:用系统存储过程sp_browsereplcmds(返回分发数据库中存储的可读版本复制命令的结果集,并将其用作诊断工具. 此存储过程在分发服务器上 ...

  8. WIN7(VISTA)系统无法上网问题排查方法

    WIN7(VISTA)系统无法上网问题排查方法 一.无法通过DHCP自动获取到IP 1. 确认正确配置路由器的DHCP功能 a.一般租期建议设置为1-3小时,推荐设置1小时. b.DHCP地址池不要和 ...

  9. Chrome JS内存泄漏排查方法(Chrome Profiles)

     原文网址:http://blog.csdn.net/kaitiren/article/details/19974269 JS内存泄漏排查方法(Chrome Profiles)   Google Ch ...

随机推荐

  1. SpringBoot jackson传入List引起的坑

    一.jackson无法解析value为[]的json 当入参为{xxxx1:[1,2,3],xxxx2:[obj1,obj2,obj3]}时,springmvn controller接收入参写为Lon ...

  2. nginx 变量 + lua

    nginx变量使用方法详解(8) nil.null与ngx.null 发现一个nginx LUA开发Web App的框架 nginx是个好东西, nginx的openrtsy发行版本更是个好东西. 今 ...

  3. 洛谷P1120 小木棍(sticks数据加强版)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  4. 【BZOJ1101】Zap(莫比乌斯反演)

    题意:多组询问,对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. T,a,b,d,x,y<=50000 思路:下底函数分块+积性函数 ...

  5. 【NOIP2016练习】T2 forest (树形DP,数论)

    题意:有一棵N个点的树,每个点上有点权 定义路径长度为所经过的所有点的点权之和,树的直径为一棵树中最大的路径长度 有N次询问,每次询问要求回答所有树的直径之积 每次询问后会删一条边,树的数量会+1 要 ...

  6. power shell remoting

    Powershell Remoting建立在windows WinRM服务之上,可以一对一或一对多远程控制,也可以建立HTTP 或 HTTPS的“listeners”,使用WS-MAM协议接收远程传递 ...

  7. sublime text3 cssrem 快速px转rem插件

    今天试验了下cssrem  在移动端如果需要px->rem非常方便 比较之前我自己用gulp提供的函数unit(70/@base,rem);转方便很多 1.git clone https://g ...

  8. es6总结 (五)--函数扩展

  9. LNMP 之 Nginx负载均衡服务器

    Nginx负载均衡服务器 参考教程:[千峰教育] 准备工作: 三台服务器,每台服务器都需要安装nginx. 1.关闭防火墙 service iptables stop2.关闭Selinux seten ...

  10. Drupal 有用的模块

    投票模块drigg https://www.drupal.org/project/drigg