当前位置 - 股票行情交易網 - 財經資訊 - SRS RTMP 發布和播放代碼解析

SRS RTMP 發布和播放代碼解析

主程序啟動後,會根據config判斷是控制臺模式還是後臺運行模式,之後進入run_hybrid_server啟動各種服務,rtmp,fd_fileno(stfd), 0, this, source, _srs_context->get_id());

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