Browse Source

1.实现多RTSP视频源输入,多rtsp视频源输出。

NHH 3 years ago
parent
commit
0b66808371
6 changed files with 112 additions and 29 deletions
  1. 4 2
      MediaSource.vcxproj
  2. 6 0
      MediaSource.vcxproj.filters
  3. 73 26
      MediaSourceMain.cpp
  4. 15 0
      MediaSourceMain.h
  5. 0 1
      MediaSourceRtsp.cpp
  6. 14 0
      rtsp_config.config

+ 4 - 2
MediaSource.vcxproj

@@ -19,10 +19,12 @@
     </ProjectConfiguration>
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="..\cvs\IOIUtils\TSysThread.cpp" />
     <ClCompile Include="MediaSourceMain.cpp" />
     <ClCompile Include="MediaSourceRtsp.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="MediaSourceMain.h" />
     <ClInclude Include="MediaSourceRtsp.h" />
   </ItemGroup>
   <PropertyGroup Label="Globals">
@@ -143,7 +145,7 @@
       <SDLCheck>false</SDLCheck>
       <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
-      <AdditionalIncludeDirectories>..\cvs\DeviceSDKs\libffmpeg\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\cvs\DeviceSDKs\libffmpeg\include;..\cvs\IOIUtils;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader />
       <PrecompiledHeaderFile />
       <PrecompiledHeaderOutputFile />
@@ -163,7 +165,7 @@
       <SDLCheck>false</SDLCheck>
       <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ConformanceMode>true</ConformanceMode>
-      <AdditionalIncludeDirectories>..\cvs\DeviceSDKs\libffmpeg\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\cvs\DeviceSDKs\libffmpeg\include;..\cvs\IOIUtils;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PrecompiledHeader />
       <PrecompiledHeaderFile />
       <PrecompiledHeaderOutputFile />

+ 6 - 0
MediaSource.vcxproj.filters

@@ -21,10 +21,16 @@
     <ClCompile Include="MediaSourceRtsp.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\cvs\IOIUtils\TSysThread.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="MediaSourceRtsp.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="MediaSourceMain.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 73 - 26
MediaSourceMain.cpp

@@ -1,29 +1,22 @@
-
-#include <windows.h>
-
-#include "MediaSourceRtsp.h"
-
-
-int main(int argc, char** argv) 
+#include "MediaSourceMain.h"
+#include <conio.h>
+#define DELETE_OBJECT(obj) if (obj) { delete obj; obj = NULL; }
+#define mygetch	getch
+AppClass::AppClass(std::string src, std::string dst, std::string transport)
+{
+	m_sSrc = src;
+	m_sDst = dst;
+	m_sTransport = transport;
+}
+void AppClass::Action()
 {
-
-	if (argc != 4) {
-
-		printf("Failed\n");
-		printf("RtspPush [src_rtsp] [out_rtsp] [tcp/udp]\n");
-		printf("[src_rtsp] input rtsp\n");
-		printf("[src_rtsp] output rtsp\n");
-		return 0;
-	}
-
 	CMediaSourceRtsp pusher;
-	pusher.m_Input_rtsp = std::string(argv[1]);
-	pusher.m_Output_rtsp = std::string(argv[2]);
+	pusher.m_Input_rtsp = m_sSrc;
+	pusher.m_Output_rtsp = m_sDst;
 
-	std::string tcporudp = std::string(argv[3]);
-	if ((tcporudp == "TCP") || (tcporudp == "tcp"))
+	if ((m_sTransport == "TCP") || (m_sTransport == "tcp"))
 		pusher.m_TcpOrudp = "tcp";
-	if ((tcporudp == "UDP") || (tcporudp == "udp"))
+	if ((m_sTransport == "UDP") || (m_sTransport == "udp"))
 		pusher.m_TcpOrudp = "udp";
 
 	if (!pusher.OpenInput(pusher.m_Input_rtsp, pusher.m_TcpOrudp)) {
@@ -38,8 +31,8 @@ int main(int argc, char** argv)
 
 	int ret = -1;
 
-	while (true) {
-	
+	while (!IsAborted()) {
+
 		std::shared_ptr<AVPacket> packet = nullptr;
 
 		packet = pusher.ReadPacket();
@@ -52,14 +45,68 @@ int main(int argc, char** argv)
 		}
 
 		if ((packet) && (packet->stream_index == pusher.m_nVideoStream)) {
-		
+
 			ret = pusher.WritePacket(packet);
 
 			if (ret < 0) {
-			
+
 				pusher.CheckOutputNet();
 			}
 		}
 	}
+}
+std::string LoadConfigFile()
+{
+	FILE* pf = fopen("rtsp_config.config", "rb+");
+	if (!pf) {
+		printf("open rtsp_config.config failed\n");
+		return "";
+	}
+	fseek(pf, 0, SEEK_END);
+	long lSize = ftell(pf);
+	char* text = new char[lSize];
+	rewind(pf);
+	fread(text, sizeof(char), lSize, pf);
+	std::string filedata = std::string(text, lSize);
+	delete[] text;
+	fclose(pf);
+	return filedata;
+}
+
+int main(int argc, char** argv) 
+{
+	std::string filedata = LoadConfigFile();
+	if (filedata == "") {
+		printf("load rtsp_config.config failed\n");
+		return -1;
+	}
+	nlohmann::json j = nlohmann::json::parse(filedata);
+
+	std::vector<AppClass*> pApp;
+	for (int i = 0; i < j["config"].size(); i++) {
+		std::string src = j["config"][i]["src_rtsp"];
+		std::string dst = j["config"][i]["dst_rtsp"];
+		std::string transport = j["config"][i]["rtsp_transport"];
+
+		AppClass* p = new AppClass(src,dst,transport);
+		p->Start();
+		pApp.emplace_back(p);
+	}
+
+	char c;
+	while (1) {
+		c = mygetch();
+		if (c != 'q') {
+			std::this_thread::sleep_for(std::chrono::milliseconds(100));
+		}
+		else {
+			std::vector<AppClass*>::iterator iter = pApp.begin();
+			for (; iter != pApp.end();) {
+				DELETE_OBJECT((*iter));
+				iter = pApp.erase(iter);
+			}
+			break;
+		}
+	}
 	return 0;
 }

+ 15 - 0
MediaSourceMain.h

@@ -0,0 +1,15 @@
+#pragma once
+#include <windows.h>
+#include "json.h"
+#include "MediaSourceRtsp.h"
+#include "TSysThread.h"
+
+class AppClass : public TSysThreadImpl {
+public:
+	std::string m_sSrc;
+	std::string m_sDst;
+	std::string m_sTransport;
+	AppClass(std::string src, std::string dst, std::string transport);
+	~AppClass() { Stop(); }
+	void Action();
+};

+ 0 - 1
MediaSourceRtsp.cpp

@@ -28,7 +28,6 @@ CMediaSourceRtsp::~CMediaSourceRtsp()
 {
 	CloseInput();
 	CloseOutput();
-
 }
 
 void CMediaSourceRtsp::CloseInput()

+ 14 - 0
rtsp_config.config

@@ -0,0 +1,14 @@
+{
+	"config":[
+		{
+			"src_rtsp":"rtsp://admin:123456@192.168.31.124/stream0",
+			"dst_rtsp":"rtsp://192.168.31.181/live/0",
+			"rtsp_transport":"tcp"
+		},
+		{
+			"src_rtsp":"rtsp://admin:dw2sdad9fg@192.168.31.125/stream0",
+			"dst_rtsp":"rtsp://192.168.31.181/live/1",
+			"rtsp_transport":"tcp"
+		}
+	]
+}