EasyRTMP手机直播推流到EasyDSS进行RTMP直播过程中分辨率反复切换崩溃问题解决
前篇博客介紹了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直播过程中分辨率反复切换崩溃问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DOC文档转换成WPS格式要怎样操作
- 下一篇: 解决Maven使用install出错出现