某直播App问题分析
某直播App问题分析
一. 出现问题
- 观看自己开播的直播间,经常出现卡顿,而且画面一卡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,所以之前是走了一圈国外再回国内,蛋疼!
某直播App问题分析的更多相关文章
- 视频直播APP开发分析
视频直播APP开发到目前为止都还是热门的一个行业,而且发展到现在直播的种类非常多,很多行业都打入了直播行业,再也不是单纯的人物直播这么单一了.视频直播APP开发行业就像是吃螃蟹,来的早的人不懂如何吃, ...
- android黑科技系列——分析某直播App的协议加密原理以及调用加密方法进行协议参数构造
一.前言 随着直播技术火爆之后,各家都出了直播app,早期直播app的各种请求协议的参数信息都没有做任何加密措施,但是慢慢的有人开始利用这个后门开始弄刷粉关注工具,可以让一个新生的小花旦分分钟变成网红 ...
- 从0到1打造直播 App
转自http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 概要 分享内容: 互联网内容载体变迁历程,文字——图片/声音——视频——VR/AR——……..从直 ...
- 【如何快速的开发一个完整的iOS直播app】(播放篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 前言 在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,集成ijkpl ...
- 【腾讯Bugly干货分享】从0到1打造直播 App
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 作者:李智文 概要 分享内容: ...
- 个人作业2:QQ音乐APP案例分析
APP案例分析 QQ音乐 选择理由:毕竟作为QQ音乐九年的资深老用户以及音乐爱好者 第一部分 调研 1.第一次上手的体验 我算是很早期的QQ音乐的用户,用QQ音乐七八年,除了体验各方面还不错之外 ...
- 第二次 作业——APP案例分析
APP案例分析 产品 网易云课堂 选择理由 网易云课堂是从大一就开始使用的一款学习软件,有海量的学习资源,很适合学生课余时间的自主学习 调研,评测 上手体验 第一次打开网易云课堂app的时候,进入的是 ...
- 从0到1打造直播 App(直播流程介绍整理 <mark><转>)
注明:原创 2016-10-27 李智文 腾讯Bugly 概要 分享内容: 互联网内容载体变迁历程,文字——图片/声音——视频——VR/AR——……..从直播1.0秀场时代(YY),2.0游戏直播(斗 ...
- 直播APP源码是如何实现音视频同步的
1. 音视频同步原理 1)时间戳 直播APP源码音视频同步主要用于在音视频流的播放过程中,让同一时刻录制的声音和图像在播放的时候尽可能的在同一个时间输出. 解决直播APP源码音视频同步问题的最佳方案 ...
随机推荐
- Spring IoC介绍与Bean的使用
1. 介绍 IoC IoC-Inversion of Control,即"控制反转",它不是什么技术,而是一种设计思想.在 Java 开发中, IoC意味着将设计好的对象交给容 ...
- Git 基本工作流程
1. 用户信息配置(全局配置) $ git config --global user.name leo$ git config --global user.email hehe_xiao@qq.com ...
- C#语言基础——定义变量、变量赋值、输入输出
第一部分 了解c# 一.C#的定义及其特点 C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.net的应用而开发的语言.它吸收了c++.Visual basi ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
写在前面的话 承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...
- bash之重定向
标准输入 stdin:代码为0,使用< 或 <& ...
- MongoDB【第三篇】RockMongo 的安装
第一步:准备 1. 安装 Nginx 参照 Nginx[第一篇]安装 2. 安装 php 参照 PHP[第一篇]安装 3. RockMongo 安装包 rockmongo-v1.0.5.r53.zip ...
- Linux部署与基本指令
把以前写的linux发布一下下吧,写的真的好差劲... Linux部署 chmod:改变一个文件的权限 改变abc的权限为777 常用的权限: 777-644-755 ************** ...
- KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-handlebars
koahub-handlebars koahub-handlebars koahub handlebars templates Installation $ npm install koahub-ha ...
- c++ string 对象操作
字符串转换大小写如下: #include "stdafx.h" #include <iostream> #include <string> using na ...
- Go语言并发机制初探
Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源.这篇文章学习 g ...