SRS RTMP 發布和播放代碼解析
err = do_publishing(source, &rtrd);
SrsPublishRecvThread 有
SrsRecvThread trd;
SrsRtmpServer* rtmp;
class SrsRecvThread : public ISrsCoroutineHandler
所以rtrd->start後,會調用SrsRecvThread::cycle()再調用do_cycle()
rtmp->recv_message讀取數據->SrsProtocol::recv_message ->
pumper->consume 調回 SrsRtmpConn::handle_publish_message(SrsSource* source, SrsCommonMessage* msg)
然後調用 process_publish_message
如果是edge邊緣服務器,直接推流回源到源服務器
處理audio數據
處理video數據
我們先看處理video數據
SrsCommonMessage* shared_video 轉換為 SrsSharedPtrMessage msg;
mix_correct是混合單增算法,解決音頻和視頻混合單增的問題
這裏沒有設置,就直接走on_video_imp
首先判斷是不是sequence header, 如果是,判斷跟之前的有沒有壹樣,壹樣,那就只緩存壹次,根據源碼可知,音視頻的metadata只發壹次,如果有新的拉流端需求,怎樣更新呢?
緩存h264 sequence header, hls分發,dvs分發,forwarders推流等,之後就客戶端消費者分發,如果有客戶端請求播放,那就會有consumer了,就可以進入consumer->enqueue
每個SrsConsumer消費者擁有獨立的SrsMessageQueue* queue隊列。內部隊列實現實際上是SrsFastVector msgs
SrsMessageQueue有數量大小限制,當隊列滿的時候刪除丟棄舊的messages:
隊列大小限制queue_size設置為配置文件中的"queue_length"。如果沒設置則默認#define SRS_PERF_PLAY_QUEUE 30。
max_queue_size = (int)(queue_size * 1000);
推流到此就結束了,而後播放端請求拉流,前面的基本壹致,從
srs_error_t SrsRtmpConn::stream_service_cycle()
{
srs_error_t err = srs_success;
}
會走 SrsRtmpConnPlay分支
SrsRtmpConn::do_playing
SrsConsumer::dump_packets
SrsMessageQueue::dump_packets
即前面的SrsMessageQueue* queue裏面取數據了
SrsRtmpServer::send_and_free_messages