前篇博客介绍了Android EasyRTMP App的一些功能以及简单实现.这篇博客介绍一下我们遇到的一个BUG,以及它的出现原因,解决方式.

这个bug是在切换分辨率的时候,偶尔会出现App崩溃.我们经过不断测试发现在低分辨率切换至高分辨率的时候更容易出现,后来查看日志,发现打印的日志比较奇怪,是一些Native层的崩溃,并没有任何堆栈信息展示:

--------- beginning of crash09-21 13:39:26.636 24221 24231 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xc in tid 24231 (HeapTaskDaemon)09-21 13:39:26.744   578   578 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***09-21 13:39:26.744   578   578 F DEBUG   : Build fingerprint: 'Hisense/E76mini/HS8937QC:6.0.1/MMB29M/L1304.6.01.01:user/release-keys'09-21 13:39:26.744   578   578 F DEBUG   : Revision: '0'09-21 13:39:26.744   578   578 F DEBUG   : ABI: 'arm64'09-21 13:39:26.745   578   578 F DEBUG   : pid: 24221, tid: 24231, name: HeapTaskDaemon  >>> org.easydarwin.easyrtmp <<<09-21 13:39:26.745   578   578 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc09-21 13:39:26.770   578   578 F DEBUG   :     x0   0000000000000004  x1   0000000000000000  x2   0000007f7b36bca0  x3   00000055a5c9bae009-21 13:39:26.770   578   578 F DEBUG   :     x4   0000000000000000  x5   00000000051fa000  x6   0000007f7f5e27c8  x7   410410000410410009-21 13:39:26.770   578   578 F DEBUG   :     x8   00000000002450a0  x9   0000000000001228  x10  00000055a5c9bb04  x11  000000000000000009-21 13:39:26.770   578   578 F DEBUG   :     x12  00000000000000ab  x13  0000000000002ddd  x14  00000055a5c9bb00  x15  00000000000000a909-21 13:39:26.770   578   578 F DEBUG   :     x16  00000055a5c9bb04  x17  0000000000000000  x18  0000000000002ddd  x19  0000000000002de109-21 13:39:26.770   578   578 F DEBUG   :     x20  00000000706df038  x21  000000000000000c  x22  0000007f7c2bb000  x23  0000007f7c2bf2f009-21 13:39:26.770   578   578 F DEBUG   :     x24  0000000000000000  x25  0000000079aeb000  x26  0000000000000003  x27  00000055a5c9c31009-21 13:39:26.770   578   578 F DEBUG   :     x28  0000007f7b36bca0  x29  0000007f7b36bbe0  x30  0000007f7b36bca809-21 13:39:26.771   578   578 F DEBUG   :     sp   0000007f7b36bbe0  pc   0000007f7beb8e64  pstate 000000008000000009-21 13:39:26.787   578   578 F DEBUG   : 09-21 13:39:26.787   578   578 F DEBUG   : backtrace:09-21 13:39:26.788   578   578 F DEBUG   :     #00 pc 000000000021fe64  /system/lib64/libart.so (_ZN3art2gc9collector9MarkSweep16ProcessMarkStackEb+220)09-21 13:39:26.788   578   578 F DEBUG   :     #01 pc 0000000000220800  /system/lib64/libart.so (_ZN3art2gc9collector9MarkSweep12MarkingPhaseEv+256)09-21 13:39:26.788   578   578 F DEBUG   :     #02 pc 0000000000220b58  /system/lib64/libart.so (_ZN3art2gc9collector9MarkSweep9RunPhasesEv+732)09-21 13:39:26.788   578   578 F DEBUG   :     #03 pc 0000000000212cc8  /system/lib64/libart.so (_ZN3art2gc9collector16GarbageCollector3RunENS0_7GcCauseEb+296)09-21 13:39:26.788   578   578 F DEBUG   :     #04 pc 000000000024506c  /system/lib64/libart.so (_ZN3art2gc4Heap22CollectGarbageInternalENS0_9collector6GcTypeENS0_7GcCauseEb+2056)09-21 13:39:26.788   578   578 F DEBUG   :     #05 pc 000000000024690c  /system/lib64/libart.so (_ZN3art2gc4Heap16ConcurrentGCTask3RunEPNS_6ThreadE+152)09-21 13:39:26.788   578   578 F DEBUG   :     #06 pc 000000000026963c  /system/lib64/libart.so (_ZN3art2gc13TaskProcessor11RunAllTasksEPNS_6ThreadE+80)09-21 13:39:26.788   578   578 F DEBUG   :     #07 pc 0000000001ffa57c  /system/framework/arm64/boot.oat (offset 0x1ffa000)09-21 13:39:27.169   578   578 F DEBUG   : 09-21 13:39:27.169   578   578 F DEBUG   : Tombstone written to: /data/tombstones/tombstone_03

这种问题一般是内存越界或者无效内存导致的.仔细一想会不会是编码器内部bug,比如说不支持切换后的这个1080P分辨率?

那我们可以先屏蔽切换的过程,直接用1080P作为初始化分辨率试下?

OK,将初始化分辨率改为1920*1080后,发现并不崩溃,那就不是因为编码器不支持了.

那再想下,切换后导致崩溃,是不是因为编码器初始化依然用的老的分辨率参数?这个也是很有可能的一个bug,因为这种异步的切换,很多先来后到的问题,这样就很难面面俱到,也就无法按照我们所期待的顺序来执行,即很可能用老的参数初始化了编码器,但是数据帧却用1080P的视频帧来喂编码器.

再检查一遍代码,发现的确是这种问题.

在切换分辨率时width和height是在主线程进行的,分辨率更改后,在初始化编码器时,还是用老的摄像头的分辨率.而后续给编码器喂视频数据时,视频帧的分辨率已经是更改过的了.这时,编码器内部就会内存溢出.

更改办法则是把切换的过程都同步进行,即:

Created with Raphaël 2.1.0 1 1 2 2 3 3 4 4 停止预览,反初始化编码器 设置新的预览分辨率,并打开摄像头预览 使用新的分辨率初始化编码器

按照这种思路,需要将图表里的这些动作都POST到摄像头线程,经过这样修改后,这个bug不会再出现了.

关于EasyRTMP推流SDK

EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、arm(hisiv100/hisiv200/hisiv300/hisiv400/etc..)、Android、iOS平台,支持市面上绝大部分的RTMP流媒体服务器,包括Red5、Ngnix_rtmp、crtmpserver等主流RTMP服务器,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等等方面!

点击链接加入群【EasyRTMP-RTMP直播推送】:587254841

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2017

EasyRTMP手机直播推流到EasyDSS进行RTMP直播过程中分辨率反复切换崩溃问题解决相关推荐

  1. OBS推流到EasyDSS平台匿名直播时却在其他直播间生成了录像文件该如何解决?

    EasyDSS视频直播点播平台集视频直播.点播.转码.管理.录像.检索.时移回看等功能于一体,可提供音视频采集.视频推拉流.播放H.265编码视频.存储.分发的视频流可覆盖全终端等视频能力服务,同时也 ...

  2. 视频直播点播平台EasyDSS降低视频流直播延迟的2种方法

    视频直播点播平台EasyDSS支持一站式的上传.转码.直播.回放.嵌入.分享等功能,在推流上,可支持手机推流短视频.音乐等音视频文件,提供多种上传方式,支持批量上传.大文件上传.平台视频功能具备超低延 ...

  3. 微信串流服务器,微信视频号无人直播推流教程分享(无人直播技术非常的火怎么操作方法)...

    去年抖音无人直播技术非常的火,很多团队批量操作无人直播卡广场流量,赚得盆满钵满,市面上一度炒作到3000元的抖音无人直播技术,收割了不少小白玩家,如今随着视频号直播推流正式开放,预计一大波视频号无人直 ...

  4. java做flv直播服务器_一种RTMP直播流到HTTPFLV直播流实时转换系统及其工作方法与流程...

    本发明属于互联网的音视频技术领域,具体涉及一种RTMP直播流到HTTP FLV直播流实时转换系统及其工作方法. 背景技术: 在传统互联网直播领域,PC端采用RTMP协议进行视频直播,国内一部分CDN服 ...

  5. 直播/点播/推流平台EasyDSS如何使用匿名推流直播?

    EasyDSS支持一站式的上传.转码.直播.回放.嵌入.分享功能,具有多屏播放.自由组合.接口丰富等特点.平台可用于视频的直播和点播,并支持OBS.推流相机.EasyRTMP等设备的推流直播. 有用户 ...

  6. 【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 )

    文章目录 一. 安卓直播推流专栏博客总结 二. 相关资源介绍 三. GitHub 源码地址 四. 整体 Android 直播推流数据到服务器并观看直播演示过程 Android 直播推流流程 : 手机采 ...

  7. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  8. 【Android RTMP】RTMP 直播推流服务器搭建 ( Ubuntu 18.04.4 虚拟机 )

    文章目录 安卓直播推流专栏博客总结 一. Android RTMP 直播推流简介 二. Nginx.RTMP Module 编译环境源码准备 三. pcre.OpenSSL.zlib 函数库安装 四. ...

  9. 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 )

    文章目录 安卓直播推流专栏博客总结 一. 阿里云服务器购买 二. 远程服务器控制软件 三. 配置 Ubuntu 服务器 1 . 更新 apt 源 2 . 安装 pcre.OpenSSL.zlib 库 ...

最新文章

  1. oracle并行parallel update两张表_Oracle并行更新的两种方式(merge/update内联视图)
  2. WARNING: cell0 mapping not found - not syncing cell0
  3. oracle 得到一个树,Related to Oracle SQL 关于树形数据的遍历
  4. C# Activator
  5. Chain of responsibility(职责链)--对象行为型模式
  6. 解决 ubuntu出现的 cd Do-bash: cannot create temp file for here-document: Permission denied问题
  7. SQL Server外连接、内连接、交叉连接
  8. 希尔排序不稳定例子_Python实现希尔排序(已编程实现)
  9. 自定义 matplotlib 设置
  10. python中装饰器的作用_Python中装饰器的用法
  11. IOS文件操作(NSFileManager)
  12. “阿里云开放平台俱乐部”首站启航
  13. linux系统管理考试试题及答案,《Linux系统管理》期末综合试题答案1
  14. 首次登录Navicat连接数据库遇到的问题
  15. 数据结构和算法经典书籍
  16. C语言练习---杨辉三角
  17. C语言中 malloc函数用法
  18. 使用Netty实现一个小型服务器(作为数据中转站)
  19. Android Adapter接口的实现类总结
  20. 功放IC音频芯片双声道D类3W ESOP-8封装

热门文章

  1. itunes未能连接到iphone软件更新服务器,无法联系iphone软件更新服务器,itunes无法联系iphone软件更新服务器解决方法...
  2. sqlserver2005数据库18456错误(转)
  3. mac os重置服务权限
  4. oracle安装后,电脑变得很卡,解决办法(安装的是oracle11g)
  5. 51单片机基础——数码管数组动态显示0—F
  6. 面试题27-二叉树的镜像
  7. 分享一些正确的放松方式
  8. matlab儒略日转日期,将日期(年、月、日)转换为儒略日编号并返回日期
  9. 谈谈对CNN在NLP中可行性的理解
  10. 网易历届笔试面试题整理大全