上一篇部落格簡單介紹了自己的需求,并對EasyIPCamera_RTSP進行編譯、運作。本篇部落格針對EasyIPCamera_RTSP進行二次開發,增添讀取配置檔案、讀取資料庫的功能,将EasyIPCamera_RTSP打造成為簡單的RTSP流媒體伺服器。
1. 讀取配置檔案(讀資料庫道理類似)
Win32下,讀取INI配置檔案非常簡單,其中我的配置檔案名為“EasyIPCamera_RTSP.ini”,具體内容如下:
[RunMode]
;單機模式、連資料庫模式
Mode = 單機
;資料庫服務位址
DBSIP = .
DBSUserName = root
DBSPassword =
[IPC0]
IPCName=測試
;ID号為必填項,用戶端請求時傳入此ID即可
IPCID=
;IP位址為必填項
IPCIP=.
;RTSP端口為必填項,一般預設為554即可
IPCPort=
;錄影機使用者名為必填項
UserName=admin
;錄影機密碼為必填項
Password=
RtspUrl=rtsp://admin:@.:
具體讀取配置檔案代碼如下:
char chRunMode[MAX_PATH];
::GetPrivateProfileStringA("RunMode", "Mode", "單機", chRunMode, MAX_PATH, ".\\EasyIPCamera_RTSP.ini");
上述代碼非常簡單,通過讀取配置檔案[RunMode]中的Mode字段,來确定程式的運作模式。“單機”模式就是通過配置檔案中的[IPCx]字段生成錄影機連接配接串資訊,“資料庫”模式就是将相關IPC連接配接串資訊存入資料庫,通過資料庫服務讀取。
2. 初始化所有通道資訊
根據配置檔案或者資料庫中的相關字段,生成的IPC連接配接串資訊需要一次性初始化至
RTSP_SOURCE_CHANNEL_T channel[MAX_CHANNEL_NUM];
for (int i=; i < MAX_CHANNEL_NUM; i++)
{
channel[i].id = i;
sprintf(str, "IPC%d", i);
::GetPrivateProfileStringA(str, "IPCID", "", buf, MAX_PATH, ".\\EasyIPCamera_RTSP.ini");
if (buf[] == '\0')
{
continue;
}
sprintf(channel[i].name, "channel=%s", buf);
char ipcRtspUrl[MAX_PATH] = {};
::GetPrivateProfileStringA(str, "RtspUrl", "", ipcRtspUrl, MAX_PATH, ".\\EasyIPCamera_RTSP.ini");
char rtspUrl[] = {};
sprintf_s(rtspUrl, "%s", ipcRtspUrl);
channel[i].sourceType = SOURCE_TYPE_RTSP;
strcpy(channel[i].source_uri, rtspUrl);
}
通過上面的循環,一次性填充了所有通道,這樣EasyIPCamera_RTSP就可以作為服務接收不同錄影機的請求了。
3. 視訊請求實作
假如EasyIPCamera_RTSP運作在192.168.1.155上面,則使用VLC用戶端請求時需要填入如下格式的RTSP URL:
rtsp://192.168.1.155:8554/channel=IPCID
配置檔案中的 IPCID在這裡就不受源代碼的限制了(原有是代碼寫死的)。
4.部署
将EasyIPCamera_RTSP.exe程式,EasyIPCamera_RTSP.ini ,libEasyIPCamera.dll , libEasyRTSPClient.dll 放在同一檔案夾中,同時放入msvcp100.dll和msvcr100.dll(Visual Studio 2010的動态連結庫),應該就可以在任意的Windows系統主機上運作了。
是不是非常簡單,僅僅需要4步,就能将EasyIPCamera打造成為一個“ RTSP服務+流媒體轉發” 的伺服器!
下一步,我們還可以使用EasyRTSPClient作為測試工具,批量、循環連斷EasyIPCamera_RTSP.exe,來測試該服務的穩定性、并發性。
大家趕快行動起來,領略一下EasyDarwin開源項目的魅力吧!