1078-部標多媒體服務器

經過一個月左右的開發,對1078部標多媒體視頻項目進展如下:

1,目前已能夠跑通音視頻展示流程,採用linux運行環境,c++編程語言,第三方庫使用了libevent和live555。其中libevent可自行考慮是否使用,由於已經有熟悉的libevent使用框架,所以直接採用的該框架來接收終端連接,然後進行粘包處理。在一開始的框架中,只有兩個線程,一個用戶粘包及業務處理(業務處理即將粘包處理後的包寫入隊列),再由live555線程負責讀取隊列,並向客戶端發送RTSP以及RTP over RTSP數據包,在客戶端展示實時音視頻。在經實際測試中發現,該方法只能支持單通道的實時音視頻,如果有多通道,或者說有多個音視頻接入點,這種方法就行不通。其原因應該是兩個線程間存在競爭關係導致要麼接收終端的慢,要麼發送給客戶端的線程會發生阻滯。後又另起一線程,該線程負責將粘包處理後的數據,進行解碼,根據解碼後的設備號和通道號,建立live555的相關serverMediaSession和Subsession,並將數據體寫入隊列。然後由live555線程與客戶端交互,併發送音視頻數據。

    //部分業務處理線程代碼
    char strBuffer[MAX_BUFFER_NUM] = {0};
    DWORD dwBufferLen = 0;

    while (1)
    {
        (void)pthread_mutex_lock(&mutexReadTask);
        //等待信號
		while(NULL == readHead)
		{
			(void)pthread_cond_wait(&condReadTask, &mutexReadTask);
		}
		//數據出
		memset(strBuffer, 0, MAX_BUFFER_NUM);
		struct task* pTmpTask = readHead;
		readHead = readHead->next;
		(void)pthread_mutex_unlock(&mutexReadTask);
		//判斷數據有效性
		dwBufferLen = pTmpTask->dwSize;
        if (dwBufferLen > MAX_BUFFER_NUM)
        {
            continue;
        }
        memcpy(strBuffer, pTmpTask->strBuffer, dwBufferLen);
        LOG_MSG(strBuffer, dwBufferLen);

        //解碼
        int iPos = 4;
        char *pBuf = strBuffer;
        BYTE v_p_x_cc = pBuf[iPos];
        iPos += g_byteLen;
        BYTE m_pt = pBuf[iPos];
        BYTE m = (m_pt>>7)&0x01;
        BYTE pt = m_pt & 0x7F;
        iPos += g_byteLen;
        WORD packageNoTmp = *(WORD*)(pBuf + iPos);
        WORD packageNo = ntohs(packageNoTmp);
        iPos += g_wordLen;
        //SIM卡號
        BYTE simNo[6] = {0};
        memcpy(simNo, pBuf+iPos, 6);
        string strSimNo;
        strSimNo = CUtil::BCDtoString((BYTE*)simNo, 6);
        iPos += 6;
        //邏輯通道號
        BYTE channel = *(BYTE*)(pBuf + iPos);
        iPos += g_byteLen;
        ....
        //業務處理,將解析出來的音視頻數據寫入隊列,由live555線程進行處理
        ...
        //創建對應的ServerMediaSession、H264LiveVideoServerMediaSubsession、AudioServerMediaSubsession
        ...
        

實際效果用VLC播放器播放如圖:

  

2,經測試,目前在採用4線程模型的情況下(線程1:主線程-終端鏈路接收及處理;線程2:終端數據接收及粘包處理;線程3:1078音視頻數據包解碼及寫隊列;線程4:live555線程與客戶端交互並讀取隊列,發送音視頻數據),可接收120個終端通道連接及實時音視頻數據的發送。客戶端連接數可達到280個穩定連接及音視頻播放.(根據目前需求和網絡情況,並未向更高的連接數進行測試)。cpu使用率:46%,內存:290M,網絡IO: 50Mbps。測試2小時,穩定運行!

3,另外,在測試客戶端連接時,一開始發現連接數達到32個的時候上不去,懷疑是FD_SETSIZE引起的,經理論論證,linux下的FD_SETSIZE爲1024,而不是windows下的64,最起碼能支撐512個客戶端連接數。在進行新的分析時,發現linux系統環境變量中的max locked memory 只有64 kbytes,將此數值改動後,客戶端連接數上升,測試280以上連接沒有出現問題。

修改方法:

 vi /etc/security/limits.conf 
#添加下面兩行到用戶變量
public soft memlock 50000000
public hard memlock 50000000

    以上!

 

聯繫qq: 446733415

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章