播放问题排查:
一旦我们遇到视频播放不了,第一件事,就是要找几个别的播放器也播放看看,做一下对比测试,或者对码流做一些基础分析,以便更好的定位问题的源头,而各个平台比较常见的播放/分析工具有如下几个:
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. 第一个 XMLHttpRequest 例子(API)

    [API] https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest [替代方案] 如果不想自己敲代码,可以直接访问以下URL测试 ...

  2. 挑战程序设计2 KD树

    Range Query - Range Search (kD Tree) Time Limit : 1 sec, Memory Limit : 262144 KB Japanese version i ...

  3. JavaWeb学习总结(十七)——JSP中的九个内置对象(转)

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  4. Linux 之 xunsearch

    Linux 之 xunsearch 参考教程:[千峰教育] 一.xunsearch简介: 开源免费.高性能.多功能.简单易用的专业全文检索技术方案. 官网(http://xunsearch.com). ...

  5. 模块化开发(seajs)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. PHP实现自定义中奖和概率算法

    最近玩<QQ飞车手游>,出了一款点券A车,需要消耗抽奖券抽奖,甚是激动,于是抽了几次,没想到中的都是垃圾道具,可恨可叹~~ 这几天项目中也涉及到了类似的概率操作,于是思考了一下,简单分装了 ...

  7. React项目的打包与部署到腾讯云

    腾讯云送了30天的免费试用,于是有了把react项目部署到上面的想法.项目是默认生成的,只是一个页面,但是这个过程中也遇到了不少麻烦与问题.下面来具体梳理下: create-react-app 来自F ...

  8. 总结下常用js中的小语法和技巧

    1,数组对象遍历 对一个级数对象进行遍历,取出每个值 var arr={ "result":[ {"time":"2018-10-24 12:12:1 ...

  9. 找小于N 的所有质数

    笔试题目当中,找素数出现的几率有点大.昨天就做了一个,感觉不是很难,但可以考查程序员的数学和编码功底. 用嵌套循环来实现是很理想的,怎样减少循环的次数?怎样求出小于N的所有质数? 不可能将一个数除与所 ...

  10. [原创][FPGA]时钟分频之奇分频(5分频)

    0. 简介 有时在基本模块的设计中常常会使用到时钟分频,时钟的偶分频相对与奇分频比较简单,但是奇分频的理念想透彻后也是十分简单的,这里就把奇分频做一个记录. 1. 奇分频 其实现很简单,主要为使用两个 ...