问题背景:

前两天看读者留言让再写写音视频问题排查方面的思路,前面大概写几篇:《音视频播放疑难杂症分析和解决 :序篇》、《音视频常见问题分析和解决:延时和抖动》、《记一次因为丢帧导致视频播放花屏问题的排查》。今天继续这个系列补充。由于移动互联网的快速发展,现在一些音视频IOT相关的智能设备如IPC、智能猫眼等,有很多移动端浏览器或者微信小程序的播放需求,这种情况我们用了HLS+TS方案。

近期上线后,发现视频整体播放没有啥大问题,但是仔细看还是感觉有点卡顿,不仔细看不容易发现,就这个视频卡顿问题进行了一番排查,先说下结论:我们在读磁盘的TS切片文件时,没有把整个TS读完整,导致每个GOP最后有几帧丢了导致视频播放起来有稍微的卡顿感。

视频卡顿引起的原因很多,一般分为两大类:

一类是因为音视频时间戳打的不规范导致视频在解码渲染时顺序不对引起的;

另外一大类就是视频传输过程中因为网络问题导致的丢包进而产生的花屏和卡顿问题。一般具体问题需要具体分析,但是思路差不多。


问题排查:

1.排查问题前,大概画下流程处理示意图:

2. 分析思路:还是利用对比法和分段法进行定位问题出现在那个环节和模块。

上传码流从生产到消费的路径有两条:

第一条码流传输路径:

1-----2------6:这条路径主要是我们的私有协议,在自研移动端APP上进行观看播放码流,实际发现播放很顺畅,无卡顿感。

第二条码流传输路径:

1-----2-----3-----4------5:由于第一条没有问题,那说明问题只可能出现在3-----4-----5这三个环节。其中HLSTS服务是进行码流转化和切片的模块,第三方对象存储主要是借助公有云进行存储TS文件,HLSAPI是m3u8生成和码流分发模块。由于第三方对象存储都是大厂阿里,华为的,出问题概率比较低,所以先从HLSTS切片模块分析起来,逐渐向上层排查。

3. 为了复现该问题,我们在摄像头前面电脑上循环播放一段篮球投篮的小视频,如果出现卡顿问题很容易在浏览器上播放时发现,大家可以看下当时卡顿的情况。接着把HLSTS当时切片到磁盘上的一个个小TS合并成一个大文件播放,比较下到底是不是问题出现在把私有流传TS切片的过程,如果不是就继续分析上传到对象存储以及之后的下载分发情况。

结果发现把磁盘文件down到本地合并后播放,并无卡顿感播放挺顺利,那说明问题至少出在HLSTS服务上传第三方对象存储过程以后了。然后利用对象存储SDK将上传上去的TS片段拉下来分析发现视频的确卡顿,进而说明问题就出在HLSTS上传这块了。

4. 那到底什么原因导致从磁盘读文件再上传就少了一部分数据呢,少的数据又少了什么呢?然后把从对象存储拉下来的TS文件利用Elecard工具分析,发现每个GOP文件内少了几个P帧数据,由于摄像头是固定帧率,每4秒一个GOP,我们切片也是一个个GOP进行切成TS文件的。按道理一个TS应该100帧,实际发现总是在GOP的末尾少了几帧,既然丢帧了难怪播放起来不是很顺畅,如果丢帧5帧以上则播放TS时更明显,当时分析的文件:

这里帧率是25,一个GOP 4秒固定帧率算下来实际是100帧实际只有97帧,说明丢了3帧。

5. 后来发现从第三方对象存在下载下来的所有TS多少都存在丢帧情况,有些上传到OSS对象上丢了1、2帧有些则丢了4、5帧,那问题肯定出在HLSTS的上传文件模块中。为了验证实际将切到磁盘文件的大小和上传模块读的文件大小做了比较,的确上传模块上传文件都没有把文件读完整进行上传。

其中左侧是切出来文件写到磁盘上的实际大小,右侧是日志上传时读取的大小,明显发现没有把TS读完整进行上传。

6. 由于切片这块我们借助了FFMPEG,大概思路就是收到一个GOP时完成一个TS切片,切完后立即通知上传模块的线程进行读取文件上传对象存储。既然读的模块没有上传完整,大概想原因可能在读取文件时,实际切片还没完全写到磁盘的文件时,收到通知后发现有文件就开始上传了。后来也验证了猜想的正确,因为毕竟丢帧都丢在TS文件的末尾几帧数据上,那什么原因导致写磁盘的过程滞后读文件的线程呢,毕竟这里是同步操作的。再后来发现切片写文件我们用的FFmpeg接口是av_interleaved_write_frame 而不是av_write_frame,这样前面的接口为了交织的将音视频packet写的TS文件,会根据音视频的DTS进行缓存和排序,这样写文件时没有av_write_frame直接写得快,实际我们在调用这个接口时音视频的DTS我们上层是能控制的也是排好序的,完全没必要让FFmpeg接口取做缓存排序这件事,所以将接口切换到av_write_frame,后来切换后实际写完后通知上传文件线程就能读到完整文件。实际上传的大小也就是文件写磁盘的大小,视频卡顿也消失了。下面是分析结果和实际优化后的播放效果。

这里一个GOP就变成100帧,实际日志也显示上传的大小和磁盘文件最终的文件大小一致:

当然解决这个问题思路很多,我们就是通过换接口进行了解决,因为我们直接写TS不会存在问题,上层调用者对DTS排序问题已经做了处理。


思考总结:

音视频问题很多,常见的就有音视频卡顿、花屏、延时大,音画不同步等一系列问题。但是偏差这些问题无非就下面几点:

1. 分段分析,先利用二分法把问题一点点局限到一个过程或者一个服务中,这样缩小问题的排查范围;

2. 对比实验,利用一些路径上的对比实验也可以快速排查问题不是出在什么地方,也可以大幅度缩小问题排查。例如,直播时如大家APP播放同一主播的视频都出现问题,那问题大概率出现在主播端上行推流端,如果你的APP有问题,其他人能顺畅播放那说明问题出在你APP的下行端概率比较高,这样通过做一些简单的对比试验就可以把问题不会出现的路径去除掉

3. 写码流、分析码流、看日志、搭建环境复现问题成了排查问题根因的最后手段,线上问题一般先采用一些规避手段解决掉;

4. 专业的事交给专业的工具,视频码流是比较复杂的东西,分析时一定要借助专业工具,这些专业工具有些是现成的比如FFmpeg、Elecard、ParseFlv、Mp4Box,有些也需要自己平时积累开发一些工具出来,然后分析是传输、封装还是编解码层的问题。


往期文章回顾:

译:构建音视频直播应用需要考虑的12件事

HLS+FMP4方案对H.265+AAC支持要点

流媒体传输协议:RTMP、HLS和RTSP介绍

基于HLS-TS&RTMP-FLV的微信小程序点直播方案

一图看懂音视频核心技术栈(框架、工具和场景))

国产开源流媒体SRS4.0对视频监控GB28181的支持

从方块效应&呼吸效应看编码量化参数对流控的作用

家庭消费类摄像头选择攻略和隐私保护小建议

音视频封装小总结(PS TS 和FLV)

SDP在RTSP、国标GB28181、WebRTC中的实践

视频监控摄像头的互联网化实践思路

在HTML5上开发音视频应用的五种思路

周末活动回顾:视频质量主观评价、实时RTC和AV1

音视频封装:MP4结构概述和分析工具

音视频解封装:MP4核心Box详解及H264&AAC打包方案

音视频基础知识-时间戳的理解

音视频封装格式:AAC音频基础和ADTS打包方案详解

从人类的第一次直播聊聊视频监控行业

音视频压缩:H264码流层次结构和NALU详解

音视频传输:RTP协议详解和H.264打包方案

音视频常见问题分析和解决:延时和抖动


个人转载内容至朋友圈和群聊天,无需特别申请版权许可。

引用转载该订阅号文章,注明文章来源即可。

记得右下角点“在看”,还可以关注该订阅号,防止遗漏推送哦


今天就说这么多,祝您工作顺利!

微信小程序 RTMP 音视频 通话 ffmpeg_音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查...相关推荐

  1. ffmpeg 丢帧 灰屏_音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查...

    问题背景: 前两天看读者留言让再写写音视频问题排查方面的思路,前面大概写几篇:<音视频播放疑难杂症分析和解决 :序篇>.<音视频常见问题分析和解决:延时和抖动>.<记一次 ...

  2. 音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查

    ​问题背景: 前两天看读者留言让再写写音视频问题排查方面的思路,前面大概写几篇:<音视频播放疑难杂症分析和解决 :序篇>.<音视频常见问题分析和解决:延时和抖动>.<记一 ...

  3. 微信小程序云开发如何实现上传视频 以及 图片

    微信小程序云开发如何实现上传视频 以及 图片 最基础的数据库增删改查,上传到云存储即可实现,附源码 wxml文件 <button bindtap="upload">上传 ...

  4. 视频教程-微信小程序项目实战之我画你猜视频课程-微信开发

    微信小程序项目实战之我画你猜视频课程 精通PHP软件开发和WEB前端开发技术,熟悉PHP.Java.Javascript.HTML等语言,熟悉HTTP协议及W3C相关互联网规范,曾在山西某知名公司担任 ...

  5. 微信小程序商城15天从零实战视频课程-收货地址列表

    微信小程序交流群:111733917 | 微信小程序从0基础到就业的课程:https://edu.csdn.net/topic/huangjuhua js代码 // pages/addr/addr.j ...

  6. 视频教程-老司机讲前端之微信小程序开发成语消消乐游戏视频课程-微信开发

    老司机讲前端之微信小程序开发成语消消乐游戏视频课程 中国实战派HTML5培训第一人,微软技术讲师,曾任百合网技术总监,博看文思HTML5总监.陶国荣长期致力于HTML5.JavaScript.CSS3 ...

  7. 老司机讲前端之微信小程序开发成语消消乐游戏视频课程-陶国荣-专题视频课程...

    老司机讲前端之微信小程序开发成语消消乐游戏视频课程-102人已学习 课程介绍         本课通过一个完整.真实的游戏项目,带着学员手动开发代码,本课分项目介绍.界面效果.技术分析.代码实现.打包 ...

  8. 《微信小程序-进阶篇》Lin-ui组件库源码分析-列表组件List(一)

    大家好,这是小程序系列的第二十篇文章,在这一个阶段,我们的目标是 由简单入手,逐渐的可以较为深入的了解组件化开发,从本文开始,将记录分享lin-ui的源码分析,期望通过对lin-ui源码的学习能加深组 ...

  9. 微信小程序 RTMP 音视频 通话 ffmpeg_WebRTC与微信小程序音视频互通方案设计与实现...

    背景 在之前的WebRTC实时音视频通话之语音通话设计与实践中介绍了58 TEG部门基于 WebRTC 的实时音视频通话解决方案. 考虑到腾讯微信的小程序平台提供了音视频通话与直播的支持,如果能打通基 ...

最新文章

  1. 解决Intellij idea运行android application时找不到aapt/li...
  2. echarts地图罗平县的json_Echarts全国省市区县地图数据文件(含js及json)
  3. php 结构体_【开发规范】PHP编码开发规范下篇:PSR-2编码风格规范
  4. HR搬程序员椅子拍老板马屁,开怼的程序员被开?
  5. 被薅秃了!元气森林:损失近千万元 将为14.05万下单用户每人寄一箱白桃气泡水...
  6. 华为平板matepad pro鸿蒙,华为MatePad Pro 2平板电脑入网:首款预装鸿蒙OS
  7. respond java 使用_java – 使用android问题的HttpResponse:执行总...
  8. string s=new string() 创建了几个对象_Java的String类5个常见面试题的解答过程和原理...
  9. 滨州学院计算机自荐考试题型,滨州学院期末考试试卷标准样式.doc
  10. 提供了一个UBUNTU安装NVIDIA驱动的脚本的下载
  11. ArcGIS单波段影像重分类与批处理
  12. 图新地球:如何导入修改了高程基准(椭球)的CAD文件
  13. 怎么用计算机打游戏视频,网吧电脑可以边玩游戏边录视频吗?这样的方法很少人知道...
  14. 设计一个python程序来计算显示通过如图2-7所示的管道_python程序设计习题与答案...
  15. Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
  16. 用Ajax+js+jQuery实现无闪烁定时刷新页面 定时刷新
  17. seo专员日常工作内容是什么?
  18. 【Vulnhub】之JIS-CTF-VulnUpload-CTF01
  19. 编译Python时报错:configure: error: no acceptable C compiler found in $PATH
  20. C++ 后室·无限#1 游戏制作实录(RPG类型游戏)

热门文章

  1. 小哥哥,WebRTC 了解一下
  2. ffplay命令汇总
  3. Java多线程之死锁编码及定位分析
  4. gearman的安装与使用示例
  5. 联邦学习:保护用户数据隐私
  6. 通过PageSpeed优化网站性能
  7. 记一种数据库水平扩展的技巧
  8. go sync.WaitGroup源码分析
  9. 如何在maven的setting.xml中指定jdk版本(详细步骤)
  10. 分布式文件系统之Tachyon是什么?