HOME> 世界杯颁奖仪式> 如何一次又一次地创建和销毁rtsp服务器Live 555

如何一次又一次地创建和销毁rtsp服务器Live 555

我想从一个文件做rtsp流式传输,所以我使用了live 555 libraries.In live 555测试目录"testMpeg2TransportStreamer“程序来流式传输一个TS格式的文件,我所做...

我想从一个文件做rtsp流式传输,所以我使用了live 555 libraries.In live 555测试目录"testMpeg2TransportStreamer“程序来流式传输一个TS格式的文件,我所做的是,我把整个代码放在线程中,所以每当客户端请求流式传输线程开始工作时,当客户端说不流式传输线程时,线程就关闭了,我还写了代码Medium::close ( rtsp服务器的指针),所以要关闭RTSP服务器,这对于第一个流和不流请求很好,但是在不流请求之后,当客户端说要流时,我调试了代码,发现它无法创建rtsp服务器。然后我使用了另一种方法,在第一个流请求时只创建一次rtsp服务器,并在整个程序退出之前不关闭它,但这也是fails.Can任何人建议的任何其他方式,我的代码如下:

代码语言:javascript运行复制#define TRANSPORT_PACKET_SIZE 188

#define TRANSPORT_PACKETS_PER_NETWORK_PACKET 7

#define IMPLEMENT_RTSP_SERVER

// To stream using "source-specific multicast" (SSM), uncomment the following:

//#define USE_SSM 1

#ifdef USE_SSM

Boolean const isSSM = True;

#else

Boolean const isSSM = False;

#endif

/********************Global variable***************************/

UsageEnvironment* env=NULL;

FramedSource* videoSource;

RTPSink* videoSink;

DeviceSourceFICard* fileSource;

FICardDeviceParameters fi_params;

HANDLE g_hRtpComThread;

DWORD g_dwRtpComThreadID;

char g_ExitEventLoop;

void play(); // forward

RTSPServer* rtspServer=NULL;

ServerMediaSession* sms;

int initLm555Settings(void)

{

scheduler = BasicTaskScheduler::createNew();

env = BasicUsageEnvironment::createNew(*scheduler);

destinationAddressStr//make it global

#ifdef USE_SSM

= "232.255.42.42";

#else

= "239.255.42.42";

const unsigned short rtpPortNum = 18888;//make it global

rtpPortNum1=rtpPortNum;

const unsigned short rtcpPortNum = rtpPortNum+1;

const unsigned char ttl = 7;

struct in_addr destinationAddress;

destinationAddress.s_addr = our_inet_addr(destinationAddressStr);

const Port rtpPort(rtpPortNum);

const Port rtcpPort(rtcpPortNum);

Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);

rtpGroupsock.multicastSendOnly();

Groupsock rtcpGroupsock(*env, destinationAddress, rtcpPort, ttl);

rtcpGroupsock.multicastSendOnly();

#ifdef USE_SSM

rtpGroupsock.multicastSendOnly();

rtcpGroupsock.multicastSendOnly();

#endif

g_ExitEventLoop = 0;

videoSink =

SimpleRTPSink::createNew(*env, &rtpGroupsock, 33, 90000, "video", "MP2T",

1, True, False /*no 'M' bit*/);

setSendBufferTo(*env, rtpGroupsock.socketNum(), 1024 * 1024);

setSendBufferTo(*env, rtpGroupsock.socketNum(), 1024 * 1024);

// Create (and start) a 'RTCP instance' for this RTP sink:

const unsigned estimatedSessionBandwidth = 5000; // in kbps; for RTCP b/w share

const unsigned maxCNAMElen = 100;

unsigned char CNAME[maxCNAMElen+1];

gethostname((char*)CNAME, maxCNAMElen);

CNAME[maxCNAMElen] = '\0'; // just in case

RTCPInstance* rtcp =

RTCPInstance::createNew(*env, &rtcpGroupsock,

estimatedSessionBandwidth, CNAME,

videoSink, NULL /* we're a server */, isSSM);

UserAuthenticationDatabase* authDB = NULL;

portNumBits rtspServerPortNum = 554;

unsigned reclamationTestSeconds=65U;

rtspServer = RTSPServer::createNew(*env,rtspServerPortNum, authDB, reclamationTestSeconds);

if (rtspServer == NULL)

{

*env << "Failed to create RTSP server: " <getResultMsg()<<"\n";

rtspServerPortNum = 8554;

rtspServer = RTSPServer::createNew(*env,rtspServerPortNum);

if (rtspServer == NULL)

{

return 0;

}

Boolean const inputStreamIsRawUDP = False;

char const* descriptionString={"Session streamed by \"testOnDemandRT\""};

sms=ServerMediaSession::createNew(*env, streamName, streamName,descriptionString);

sms->addSubsession(MPEG2TransportUDPServerMediaSubsession::createNew(*env,destinationAddressStr,rtpPortNum1,inputStreamIsRawUDP));

rtspServer->addServerMediaSession(sms);

char* url = rtspServer->rtspURL(sms);

*env << "Play this stream using the URL \"" << url << "\"\n";

delete[] url;

if (rtspServer->setUpTunnelingOverHTTP(sport) || rtspServer->setUpTunnelingOverHTTP(sport) || rtspServer->setUpTunnelingOverHTTP(sport))

{

out<<"\n\n\n(We use port "<httpServerPortNum()<<" for optional RTSP-over-HTTP tunneling.)\n";

}

else

{

pDailyLogger->LogInfoString("(RTSP-over-HTTP tunneling is not available.)");

cout<<"\n\n\n(RTSP-over-HTTP tunneling is not available.)";

}

play();

env->taskScheduler().doEventLoop(&g_ExitEventLoop);

Medium::close(rtspServer);

Medium::close(rtcp);

Medium::close(videoSink);

rtpGroupsock.removeAllDestinations();

rtcpGroupsock.removeAllDestinations();

env->reclaim();

delete scheduler;

pDailyLogger->LogDebugString("OUT::initLm555Settings Thread");

return 0; // only to prevent compiler warning

}

void afterPlaying(void* /*clientData*/) {

*env << "...done reading from file\n";

videoSink->stopPlaying();

Medium::close(videoSource);

play();

}

void play() {

// Open the input file as a 'byte-stream file source':

fi_params.nFICardFrameSize = TRANSPORT_PACKETS_PER_NETWORK_PACKET * TRANSPORT_PACKET_SIZE;

fi_params.pfnGetRTPPayload = GetRTPPayload;

fi_params.socketNum = videoSink->groupsockBeingUsed().socketNum();

DeviceParameters temp;

fileSource = DeviceSourceFICard::createNew(*env, fi_params, temp);

if (fileSource == NULL) {

*env << "Unable to open Foresight card as a byte-stream file source\n";

exit(1);

}

FramedSource* videoES = fileSource;

videoSource = MPEG1or2VideoStreamDiscreteFramer::createNew(*env, videoES);

*env << "Beginning to read from file...\n";

videoSink->startPlaying(*videoSource, afterPlaying, videoSink);

}

void StartRTPProcess(void)

{

g_hRtpComThread = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,

(LPTHREAD_START_ROUTINE)initLm555Settings, 0, 0, &g_dwRtpComThreadID);

if(g_hRtpComThread) SetThreadPriority(g_hRtpComThread, THREAD_PRIORITY_LOWEST/*THREAD_PRIORITY_NORMAL*/);

}

int StopRTProcess(void)

{

g_ExitEventLoop = 1;

g_ExitEventLoop = 0;

g_hRtpComThread = 0;

g_dwRtpComThreadID = 0;

}当我收到不流消息时会调用StopRTProcess(),我遗漏了什么请告诉我


短裙的英文怎么写 水龙头净化器十大品牌排行榜