Ijkplayer直播App卡顿问题分析

news/2024/11/13 3:32:49/

一. 出现问题

  • 观看自己开播的直播间,经常出现卡顿,而且画面一卡6,7s,重新播放时会出现跳帧,卡顿频率也较高,导致该App可用性极低。

二. 分析

1. 直播架构分析

  • 根据log与抓包分析,其使用协议与后端架构如下:
    技术分享
  • 直播server
    • 国内:福建泉州(联通)、广东佛山、肇庆(电信)
    • 国外:如果ss登陆韩国,则访问韩国机房
  • 拉流CDN
    • 国内:潮州(联通)、揭阳(电信)
    • 国外:如果ss登陆韩国,则访问韩国机房
  • 推流协议
    • RTMP
  • 拉流协议
    • Http-flv
  • 观看端播放器
    • bilibili-ijkplayer

2. log分析

  • 跟进log,发现每当视频卡住和播放时日志如下:

    04-06 16:43:27.027 19089-25159/? D/IJKMEDIA﹕ ffp_toggle_buffering_l: start
    04-06 16:43:27.028 19089-25158/? D/AudioTrack﹕ pause() mState 0
    04-06 16:43:27.028 19089-25123/? D/IJKMEDIA﹕ FFP_MSG_BUFFERING_START:

    ...

    04-06 16:43:33.502 19089-25125/? D/IJKMEDIA﹕ ffp_toggle_buffering_l: end
    04-06 16:43:33.503 19089-25123/? D/IJKMEDIA﹕ FFP_MSG_BUFFERING_END:
    04-06 16:43:33.504 19089-25158/? D/AudioTrack﹕ start() mState 2

  • 部分ijk-player源码(ff_ffplay.c)
    技术分享
    技术分享
    技术分享
  • ijkplayer处理流程为
    • read_thread---> stream_component_open---> decoder_start---> video_thread--->ffplay_video_thread
    • log中,触发pause原因是:ffplay_video_thread在frame_decode时,如果不能从buffer中拿到新的frame,则触发pause,直到buffer满足播放要求后再start。
  • 分析结果
    • 按上面的代码,应用卡顿直接原因:本地buffer为空导致播放停止。但从主播端->观看端整个流程看,网络状况、服务器性能都可能导致/加剧问题。

3. TCP抓包分析

  • 由于App经常卡顿、且卡顿时间较长,为确定是否网络导致,在dump log同时,也抓了包:
    技术分享
  • 虽然有所卡顿,这段时间内数据包还是陆续有来的,卡6、7s不是很正常!根据上述代码,极有可能是App设置的IO buffer比较大,在网络环境较差情况下,触发start所需时间较长。
    技术分享

4. 其他分析

  • 在buffer方面,ijkplayer至少有2类buffer,一是上面提到的IO buffer,另外一类是显示buffer。
    技术分享
  • IO线程把数据读到后,再把数据喂给显示线程,上述2类buffer分别属于这2个线程。
  • 在使用App过程中,当log中输出D/AudioTrack﹕ start()后,画面马上更新(可能伴随跳帧),且无延迟,所以推测:
    • 该App显示buffer相当小
    • 有做额外的丢帧处理
  • 这估计是导致该应用播放频繁卡顿、且跳帧的原因!!!

三. 分析过程中的一些坑

1. Shawdowsocks

  • 本次FQ在OpenWrt上直接部署ss-local进行全局FQ,在抓包时候发现 推流 与 拉流 服务器皆为国内服务器,作为一个海外直播App,国外用户要FQ过来访问墙内服务器实在费解,遂在ss-server上ping相关域名获取ip,发现ss-server获取的ip是国外,按ss原理,DNS解析应在ss-server执行。后面经过排查,发现问题出在OpenWrt上,OpenWrt处理流程是:接到请求,DNS解析(此时,域名对应ip已经解析完毕),出口时走ss-local,到ss-server,访问之前DNS解析后的ip,所以之前是走了一圈国外再回国内,蛋疼!

http://www.ppmy.cn/news/439226.html

相关文章

直播疑难杂症排查(2) — 播放卡顿

本文是 《直播疑难杂症排查》系列的第二篇文章,我们主要分析下如何排查播放卡顿问题。 1. 播放卡顿的表现 播放卡顿的表现总结下来包括但不限于以下这些: 频繁出现缓冲播放不够流畅,画面一卡一卡的 2. 常见播放卡顿问题排查 从代码层面来…

一文读懂直播卡顿优化那些事儿

动手点关注 干货不迷路 👆 希望本文可以带给大家一个相对全局的视角看待卡顿问题,认识到卡顿是什么、卡顿的成因、卡顿的分类、卡顿的优化和一些经验积累,有的放矢地解决 App 流畅性问题。接下来会从以下五个方面进行讲述: ✦什么…

【C++】C++11新特性重点:可变参数+lambda

C11新特性第二篇重点 文章目录 上一篇的补充一、可变参数模板二、lambda函数总结 前言 上一篇我们重点讲解了右值引用移动语义,关于移动构造和移动赋值还有一些需要补充的知识: 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构…

[Spring Cloud]:Study Notes·壹

文章目录 摘要1 认识微服务1.1 单体架构与分布式架构1.2 分布式架构与微服务1.3 微服务架构 2 nacos2.1 什么是nacos2.2 nacos使用2.2.1 nacos使用逻辑2.2.2 启动下载好的nacos2.2.3 引入依赖2.2.4 各注册服务中配置nacos相关信息2.2.5 测试nacos注册成功 3 Ribbon负载均衡3.1 …

海尔w718刷机教程

作为一名小白用户,第一次刷机总是从茫然开始,但是过程却正如网友所言:恰如不断尝试以不同的方式去打开一扇窗户,那一次眼前的漫山遍野还真让人激动不已。 好了,废话不多说,贴教程,都是从网上汇…

海尔 条码全程应用

条码扫描就像一条纽带,把产品生命期中各阶段发生的信息实时取数,并实时追踪产品从生产到配送的全过程,使企业在最快的时间获得最准确的信息,通过正确的决策在激烈的市场竞争中处于有利地位。物畅其流,在整个庞大的海尔…

AMD——CPU微架构分析

一、SoC架构 1.1 整体架构 Zeppelin 参考链接:wikichip: Zeppelin 通过infinity fabric总线将单die分成多die的SoC架构,每个Die包含两个CPU核(CCX)、2各DDR通道、USB、低功耗IO以及多个IFOP和IFIS serdes接口。 如下所述中&…

网络安全进阶学习第二课——XSS漏洞

文章目录 一、前端安全1、什么是前端安全2、什么是Cookie3、Cookie的功能4、Cookie的生命周期5、常用的查看cookie插件6、XSS攻击能做什么 二、常被利用的前端代码三、JavaScript中常见的对象四、XSS原理五、XSS危害六、作为一名渗透人员(黑客)如何去挖掘…