zoukankan      html  css  js  c++  java
  • nginx下视频无法播放的问题排查过程

    问题:

    部署了nginx,测试页面访问正常,添加了mp4支持模块后mp4无法播放

    排查过程:

    . 用开源flash jw 播放视频,无法播放,怀疑flash的问题,查看mp4扩展模块官方的例子,用那个flash(其实也是jw)测试,还是无法播放,抓包发现是没有crossdomain.xml

      观察其他视频网站的crossdomain.xml的编写方法,添加crossdomain.xml,调整nginx配置,使视频能下载,测试时下载时把视频url出入浏览器,发现确实能下载。但是flash仍然无法播放。

    . 浏览器中输出视频下载地址,下载视频,发现视频与源文件不一致,视频无法用播放器播放

    . 怀疑是mp4扩展模块编译的问题,严格按官方文档中的方法编译,结果不变

    . 用mp4查看工具查看文件,发现文件格式错误,工具无法打开

    . 怀疑是这个扩展模块的问题,使用官方的mp4扩展模块,重新编译nginx,结果不变

    . 怀疑是nginx版本问题,下载网上教程中的版本(官网页面不提供这个版本的下载,但是修改最新版下载地址的版本号后居然可以下载),严格按中的方法重新编译,结果不变

    . 怀疑是nginx配置的问题,按网上教程中的配置覆盖原来的配置,结果不变

    . 怀疑视频源有问题,下载流媒体网站的一段视频,发现放到网站上,通过nginx下载后仍无法播放,用播放器打开视频文件,发现有时候完全不能打开,有时候提示一部分头部信息,但是不全。

    . 抓包下载包,发现有多余的可疑字符

    . 对比源文视频和下载的视频(用ue二进制比较和文本比较都可以),同样发现有多余可以字符,每隔几k就会多一段字符

    . 构建测试页面,10000行,每行一段字符aaaaaaaaaa,浏览页面,发现同样被篡改,证明不是mp4扩展模块的问题

    . strace 进程,发现nginx并非读取文件然后发送给浏览器,而是用了一个nb的函数sendfile64,怀疑是这个函数的问题

    . 网上搜索这个函数和nginx,找到了nginx的配置文件有关于这个函数的是否启用的配置,关闭这个配置项,问题解决

    总结一下问题的排查过程,

    第一步,下载视频,定位到问题server上,开始没开抓包工具,没发现是crossdomain的问题,浪费了一些时间

    第二步,定位到是输出多了一些无意义的字符,这步做了大量尝试,浪费了大量时间,正确的方法应该是开抓包工具观察,或者用工具对比文件,应该可以很快观察到是多了一些字符。

    第三步,定位到是nginx的问题,而不是mp4扩展模块的问题,开始因为测试页面正常,没怀疑nginx本身,浪费了很多时间才用写程序输出长页面,然后测试。

    第四步,对nginx返回的错乱,一度绝望,找不到解决方法,应该及时使用strace观察

    归纳为3点

    1. 抓包工具要一直开着,帮助定位问题,而不是靠猜测

    2. 凡是可疑的地方,都要做测试,这次没怀疑nginx本身就是个很大错误

    3. 要善于使用已知的方法解决实际的问题,本次的问题主要就是抓包和strace两个工具解决的

  • 相关阅读:
    Simulink模块之Zero-Order Hold和Unit Delay的区别
    芯片电源引脚的去耦电容
    STM32中电源引脚
    Simulink:模块参数初始化
    工作笔记1
    至少清楚知道兼容IE8 ie9 ;持续更新
    FROM_UNIXTIME/CONCAT
    采集文章
    文件上传类(引用)
    php文件相关操作
  • 原文地址:https://www.cnblogs.com/liyulong1982/p/2323154.html
Copyright © 2011-2022 走看看