点播模式
1 2 3 4 5 6 7 8 |
TaskScheduler* scheduler = BasicTaskScheduler::createNew(); BasicUsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); RTSPServer* rtspServer = RTSPServer::createNew(*env); ServerMediaSession* sms = ServerMediaSession::createNew(*env); sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, "test.264",false)); sms->addSubsession(ADTSAudioFileServerMediaSubsession::createNew(*env, "test.aac",false)); rtspServer->addServerMediaSession(sms); |
组播模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
OutPacketBuffer::maxSize = xxx; TaskScheduler* scheduler = BasicTaskScheduler::createNew(); BasicUsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); Groupsock *rtpGroupsock = new Groupsock(*env, destinationAddress, rtpPort, ttl); Groupsock *rtcpGroupsock = new Groupsock(*env, destinationAddress, rtcpPort, ttl); rtpGroupsock->multicastSendOnly(); rtcpGroupsock->multicastSendOnly(); RTPSink* rtpSink = H264VideoRTPSink::createNew(*env, rtpGroupsock, 96); // 针对H264 RTCPInstance* rtcp = RTCPInstance::createNew(*env, &rtcpGroupsock,500/*码率 Kbps*/, CNAME/*HOST NAME*/,rtpSink, NULL /* we're a server */,True /* we're a SSM source */); RTSPServer* rtspServer = RTSPServer::createNew(*env, 端口号,authDB(没有则NULL)); if (rtspServer == NULL) { *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n"; exit(1); } sms = ServerMediaSession::createNew(*env,"流名称", NULL, "流描述", True /*SSM*/); sms->addSubsession(PassiveServerMediaSubsession::createNew(rtpSink, rtcp)); rtspServer->addServerMediaSession(sms); // === 最主要的一步,数据源获取 FramedSource* liveSource = JappByteStreamLiveSource::createNew(*env, NULL, 0,this); H264VideoStreamDiscreteFramer* source = H264VideoStreamDiscreteFramer::createNew(*env, liveSource); rtpSink->startPlaying(*source, NULL, rtpSink); env->taskScheduler().doEventLoop(); // does not return |