·您当前的位置:首页 > 技术教程 > live555技术 >

[live555]基于live555环境构建流媒体服务器

时间:2015-03-27 15:46酷播
[live555]基于live555环境构建流媒体服务器,读test.264码流文件,客户端可以通过ffplay.exe rtsp: xxx播放出来。直接使用编译好的库,改自testOnDemandRTSPServer.cpp

读test.264码流文件,客户端可以通过ffplay.exe rtsp: xxx播放出来。

直接使用编译好的库,改自testOnDemandRTSPServer.cpp

  1. #include "liveMedia.hh" 
  2. #include "BasicUsageEnvironment.hh" 
  3.   
  4. #pragma comment (lib, "Ws2_32.lib")   
  5. #pragma comment (lib, "BasicUsageEnvironment.lib") 
  6. #pragma comment (lib, "groupsock.lib") 
  7. #pragma comment (lib, "liveMedia.lib") 
  8. #pragma comment (lib, "UsageEnvironment.lib") 
  9. UsageEnvironment* env; 
  10.  
  11. // To make the second and subsequent client for each stream reuse the same 
  12. // input stream as the first client (rather than playing the file from the 
  13. // start for each client), change the following "False" to "True": 
  14. Boolean reuseFirstSource = False
  15.  
  16. // To stream *only* MPEG-1 or 2 video "I" frames 
  17. // (e.g., to reduce network bandwidth), 
  18. // change the following "False" to "True": 
  19. Boolean iFramesOnly = False
  20.  
  21. static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms, 
  22.                char const* streamName, char const* inputFileName); // fwd 
  23.  
  24. static char newMatroskaDemuxWatchVariable; 
  25. static MatroskaFileServerDemux* demux; 
  26. static void onMatroskaDemuxCreation(MatroskaFileServerDemux* newDemux, void* /*clientData*/) { 
  27.   demux = newDemux
  28.   newMatroskaDemuxWatchVariable = 1
  29.  
  30. int main(int argc, char** argv) { 
  31.   // Begin by setting up our usage environment: 
  32.   TaskScheduler* scheduler = BasicTaskScheduler::createNew(); 
  33.   env = BasicUsageEnvironment::createNew(*scheduler); 
  34.  
  35.   UserAuthenticationDatabase* authDB = NULL
  36. #ifdef ACCESS_CONTROL 
  37.   // To implement client access control to the RTSP server, do the following: 
  38.   authDB = new UserAuthenticationDatabase; 
  39.   authDB->addUserRecord("username1", "password1"); // replace these with real strings 
  40.   // Repeat the above with each <username><password> that you wish to allow 
  41.   // access to the server. 
  42. #endif 
  43.  
  44.   // Create the RTSP server: 
  45.   RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB); 
  46.   if (rtspServer == NULL) { 
  47.     *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n"; 
  48.     exit(1); 
  49.   } 
  50.  
  51.   char const* descriptionString 
  52.     = "Session streamed by \"testOnDemandRTSPServer\""; 
  53.  
  54.   // Set up each of the possible streams that can be served by the 
  55.   // RTSP server.  Each such stream is implemented using a 
  56.   // "ServerMediaSession" object, plus one or more 
  57.   // "ServerMediaSubsession" objects for each audio/video substream. 
  58.  
  59.   
  60.   // A H.264 video elementary stream: 
  61.   { 
  62.     char const* streamName = "h264ESVideoTest"
  63.     char const* inputFileName = "test.264"
  64.     ServerMediaSession* sms 
  65.       = ServerMediaSession::createNew(*env, streamName, streamName, 
  66.                       descriptionString); 
  67.     sms->addSubsession(H264VideoFileServerMediaSubsession 
  68.                ::createNew(*env, inputFileName, reuseFirstSource)); 
  69.     rtspServer->addServerMediaSession(sms); 
  70.  
  71.     announceStream(rtspServer, sms, streamName, inputFileName); 
  72.   } 
  73.  
  74.  
  75.  
  76.   // Also, attempt to create a HTTP server for RTSP-over-HTTP tunneling. 
  77.   // Try first with the default HTTP port (80), and then with the alternative HTTP 
  78.   // port numbers (8000 and 8080). 
  79.  
  80.   //if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) { 
  81.   //  *env << "\n(We use port " << rtspServer->httpServerPortNum() << " for optional RTSP-over-HTTP tunneling.)\n"; 
  82.   //} else { 
  83.   //  *env << "\n(RTSP-over-HTTP tunneling is not available.)\n"; 
  84.   //} 
  85.  
  86.   env->taskScheduler().doEventLoop(); // does not return 
  87.  
  88.   return 0; // only to prevent compiler warning 
  89.  
  90. static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms, 
  91.                char const* streamName, char const* inputFileName) { 
  92.   char* url = rtspServer->rtspURL(sms); 
  93.   UsageEnvironment& env = rtspServer->envir(); 
  94.   env << "\n\"" << streamName << "\" stream, from the file \"" 
  95.       << inputFileName << "\"\n"; 
  96.   env << "Play this stream using the URL \"" << url << "\"\n"; 
  97.   delete[] url; 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器