EasyRTMP手机直播推流到EasyDSS进行RTMP直播过程中分辨率反复切换崩溃问题解决
2017-10-07 14:34
751 查看
前篇博客介绍了Android EasyRTMP App的一些功能以及简单实现.这篇博客介绍一下我们遇到的一个BUG,以及它的出现原因,解决方式.
这个bug是在切换分辨率的时候,偶尔会出现App崩溃.我们经过不断测试发现在低分辨率切换至高分辨率的时候更容易出现,后来查看日志,发现打印的日志比较奇怪,是一些Native层的崩溃,并没有任何堆栈信息展示:
这种问题一般是内存越界或者无效内存导致的.仔细一想会不会是编码器内部bug,比如说不支持切换后的这个1080P分辨率?
那我们可以先屏蔽切换的过程,直接用1080P作为初始化分辨率试下?
OK,将初始化分辨率改为1920*1080后,发现并不崩溃,那就不是因为编码器不支持了.
那再想下,切换后导致崩溃,是不是因为编码器初始化依然用的老的分辨率参数?这个也是很有可能的一个bug,因为这种异步的切换,很多先来后到的问题,这样就很难面面俱到,也就无法按照我们所期待的顺序来执行,即很可能用老的参数初始化了编码器,但是数据帧却用1080P的视频帧来喂编码器.
再检查一遍代码,发现的确是这种问题.
在切换分辨率时width和height是在主线程进行的,分辨率更改后,在初始化编码器时,还是用老的摄像头的分辨率.而后续给编码器喂视频数据时,视频帧的分辨率已经是更改过的了.这时,编码器内部就会内存溢出.
更改办法则是把切换的过程都同步进行,即:
Created with Raphaël 2.1.011223344停止预览,反初始化编码器设置新的预览分辨率,并打开摄像头预览使用新的分辨率初始化编码器
按照这种思路,需要将图表里的这些动作都POST到摄像头线程,经过这样修改后,这个bug不会再出现了.
点击链接加入群【EasyRTMP-RTMP直播推送】:587254841
WEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2017
这个bug是在切换分辨率的时候,偶尔会出现App崩溃.我们经过不断测试发现在低分辨率切换至高分辨率的时候更容易出现,后来查看日志,发现打印的日志比较奇怪,是一些Native层的崩溃,并没有任何堆栈信息展示:
--------- beginning of crash 09-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 0xc 09-21 13:39:26.770 578 578 F DEBUG : x0 0000000000000004 x1 0000000000000000 x2 0000007f7b36bca0 x3 00000055a5c9bae0 09-21 13:39:26.770 578 578 F DEBUG : x4 0000000000000000 x5 00000000051fa000 x6 0000007f7f5e27c8 x7 4104100004104100 09-21 13:39:26.770 578 578 F DEBUG : x8 00000000002450a0 x9 0000000000001228 x10 00000055a5c9bb04 x11 0000000000000000 09-21 13:39:26.770 578 578 F DEBUG : x12 00000000000000ab x13 0000000000002ddd x14 00000055a5c9bb00 x15 00000000000000a9 09-21 13:39:26.770 578 578 F DEBUG : x16 00000055a5c9bb04 x17 0000000000000000 x18 0000000000002ddd x19 0000000000002de1 09-21 13:39:26.770 578 578 F DEBUG : x20 00000000706df038 x21 000000000000000c x22 0000007f7c2bb000 x23 0000007f7c2bf2f0 09-21 13:39:26.770 578 578 F DEBUG : x24 0000000000000000 x25 0000000079aeb000 x26 0000000000000003 x27 00000055a5c9c310 09-21 13:39:26.770 578 578 F DEBUG : x28 0000007f7b36bca0 x29 0000007f7b36bbe0 x30 0000007f7b36bca8 09-21 13:39:26.771 578 578 F DEBUG : sp 0000007f7b36bbe0 pc 0000007f7beb8e64 pstate 0000000080000000 09-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.011223344停止预览,反初始化编码器设置新的预览分辨率,并打开摄像头预览使用新的分辨率初始化编码器
按照这种思路,需要将图表里的这些动作都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.orgWEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2017
相关文章推荐
- rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
- 【问题解决】configChanges详解-之解决问题:手机切换字体后,app异常崩溃
- EasyRTMP Android安卓手机直播推流摄像头偏暗的问题解决
- EasyRTMP Android安卓手机直播推流摄像头偏暗的问题解决
- EasyRTMP视频直播推送H264 sps解析错误导致播放画面拉伸问题解决
- EasyRTMP视频直播推送H264 sps解析错误导致播放画面拉伸问题解决
- EasyRTMP手机直播推送rtmp流flash无法正常播放问题
- EasyRTMP手机直播推送rtmp流flash无法正常播放问题
- EasyDarwin手机直播转发快速显示问题之音频处理过程
- rtmp直播拉流客户端EasyRTMPClient设计过程中时间戳问题汇总
- EasyDarwin手机直播转发快速显示问题之音频处理过程
- 抓取网页中的内容、如何解决乱码问题、如何解决登录问题以及对所采集的数据进行处理显示的过程
- EasyNVR+EasyDSS实现简单套路的RTMP、微信直播、录像、回放方案
- 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
- 腾讯互动直播1.7横竖屏切换以及画面颠倒问题解决
- 解决eclipse在开发Android过程中崩溃的问题
- 类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们的问题的解决方法 续集
- (转)Cocos2dx游戏开发系列笔记9:android手机上运行《战神传说》,并解决横竖屏即分辨率自适应问题
- 解决Android部分手机图片剪切返回崩溃问题
- Ubuntu不能利用ssh进行远程连接的解决方案及其解决过程中出现的问题