Android之live555构建RTSP Client

来源:互联网 发布:macbook有的软件删不掉 编辑:程序博客网 时间:2024/05/21 08:43

============

myRTSPClient.cpp
主要函数调用例程:
#include "BasicUsageEnvironment.hh"
#include "RTSPClient.hh"
1.建立RTSPClient
scheduler = BasicTaskScheduler::createNew();
env = BasicUsageEnvironment::createNew(*scheduler);
streamURL = address;  //用户输入Server地址
const int verbosityLevel = 1;
const char* progName = "MyRTSPClientProg";
portNumBits tunnelOverHTTPPortNum;
ourClient = RTSPClient::createNew(env, streamURL, verbosityLevel, progName, tunnelOverHTTPPortNum);
2.发送打开命令
void *continueAfterOPTIONS(RTSPClient* client, int resultCode, char* resultString);
Authenticator* ourAuthenticator;
ourClient->sendOptionsCommand(continueAfterOPTIONS, ourAuthenticator);  //传入一个回调函数和作者
3.请求服务器描述信息
在continueAfterOPTIONS这个回调中完成如下:
void *continueAfterDESCRIBE(RTSPClient* client, int resultCode, char* resultString);
ourRTSPClient->sendDescribeCommand(continueAfterDESCRIBE, ourAuthenticator);  //传入一个回调函数和作者
4.建立会话及发送命令
在continueAfterDESCRIBE这个回调函数中完成如下:
session = MediaSession::createNew(*env, resultString);  //该步骤会调用live555,完成RTP和RTCP组播UDP的建立
subsession->setClientPortNum(desiredPortNum);
subsession->initiate(simpleRTPoffsetArg);
subsession->rtpSource()->setPacketReorderingThresholdTime(thresh);
setupStreams();
下面看setupStream()函数
MediaSubsession *subsession;
void *continueAfterSETUP(RTSPClient* client, int resultCode, char* resultString);
ourClient->sendSetupCommand(*subsession, continueAfterSETUP, False, streamUsingTCP, forceMulticastOnUnspecified, ourAuthenticator); 
                 //传入一个回调函数和作者
5.建立媒体接收会话
在continueAfterSETUP这个回调中完成如下:
afterSetupStreams();
下面看afterSetupStreams()函数:
FileSink* fileSink;
fileSink = WAVAudioFileSink::createNew(*env, pipeName,fileSinkBufferSize, subsession->numChannels(),subsession->rtpTimestampFrequency(), 16 /* bit */);  //这个类是自己实现的
subsession->sink = fileSink;
subsession->sink->startPlaying(*(subsession->readSource()),NULL, NULL);
subsession->rtcpInstance()->setByeHandler(subsessionByeHandler, subsession);
ourRTSPClient->sendPlayCommand(*session, continueAfterPLAY, start, end, scale, ourAuthenticator);  //传入一个回调函数和作者
6.实现一些我们特有功能
在continueAfterPLAY这个回调中可以完成一些其他功能。
7.最后进入任务调度
env->taskScheduler().doEventLoop(&eventLoopWatchVariable);



最后,需要特别关注和研究的函数如下:
live555/liveMedia/RTSPClient.cpp
unsigned RTSPClient::sendRequest(RequestRecord* request);
live555/liveMedia/MediaSession.cpp
Boolean MediaSubsession::initiate(int useSpecialRTPoffset);
void MediaSubsession::setDestinations(netAddressBits defaultDestAddress);
live555/groupsock/GroupsockHelper.cpp
netAddressBits ourIPAddress(UsageEnvironment& env);  //注意:setsockopt这个系统调用的反复调用有可能造成系统不稳定

原创粉丝点击