1. 程式人生 > 其它 >記錄srs rtmp開發出現的一個記憶體問題

記錄srs rtmp開發出現的一個記憶體問題

背景

原架構是srs接流推到inner, inner是基於brpc實現的rtmp伺服器, 架構優化, 需要把inner功能合併到srs.srs接入rtmp流, 對音訊為G711的需要轉碼成aac之後再進行轉推, 發現最後出來的音訊播放有問題.

現象

wireshark抓包發現前面一部分rtmp body裡的音訊資料沒有改變, 還是原來的G711,後面的rtmp body裡面的音訊資料有了AAC資料. 但是實際程式碼中其實已經轉碼了. 轉碼結果也可以單獨拿出來正常播放.

排查

1、首先檢視整個on_audio處理流程, rtmp connection拿到audio之後交給source處理, 轉碼後的資料enqueue到consumer中, 傳送部分consumer dump出來queue中的msg, 直接傳送.整體流程上正確. 但是, enqueue的時候create msg的時候, 用的是source中的陣列,直接把指標賦值過去了, 這裡source是生產者, consumer是消費者, 不在同一個協程, 所以可能會在consumer沒有消費這個msg的時候, source會把這塊記憶體覆蓋, 導致出錯

. 這裡修改成動態申請就可以了.

2、檢視細節, source建立consumer的時候會先把 cache(rtmp aac四個位元組音訊資訊) 和goa_cache(音訊資料)enqueue到佇列中, 但是gop cache enqueue過程中, enqueue的source 沒有轉碼的G711資料, 所以這裡需要修改成轉碼後的aac_data.