live555初探-修改live555当前工作目录
我的live555是在virtualstudio上编译的,但是修改工作目录却是为了移植Android平台的便利。
1.输出
virtualStudio不太熟悉,所以调试live555也没用里面的工具,老办法,在代码里面输出内容来跟踪代码执行。
live555是通过UsageEnvironment来执行输出到屏幕的,live555MediaServer里面就可以看到
*env << "Play streams from this server using the URL\n\t"
<< urlPrefix << "<filename>\nwhere <filename> is a file present in the current directory.\n";
*env << "Each file's type is inferred from its name suffix:\n";
*env << "\t\".264\" => a H.264 Video Elementary Stream file\n";
*env << "\t\".265\" => a H.265 Video Elementary Stream file\n";
*env << "\t\".aac\" => an AAC Audio (ADTS format) file\n";
*env << "\t\".ac3\" => an AC-3 Audio file\n";
*env << "\t\".amr\" => an AMR Audio file\n";
*env << "\t\".dv\" => a DV Video file\n";
而在直接找不到env时,可以用envir()来输出,envir()是Medium基类的成员函数,许多类都继承于它,返回的也是UsageEnvironment的对象
2.查找-修改
如果要修改工作目录,也就是存放音视频的目录,首先需要找出打开文件的操作fopen,全局搜索fopen,总共有三处调用
- OuputFile.cpp
- InputFile,cpp
- DynamicRTSPServer.cpp
在每次打开文件前都做好输出标记,发现如果通过rtsp请求服务器文件,是只经过DynamicRTSPServer.cpp的,那么就在打开文件操作前添加如下代码:
char const* rootpath = "自定义的根目录";
envir() << "beforefilepath" << streamName0<<"\n";
std::string src1(rootpath);
//streamName0:函数参数由streamName改为streamName0
std::string src2(streamName0);
std::string dest = src1 + src2;
char const* streamName;
//因为该函数不只被调用一次,不加判断的话,根可能被重复添加
if (strstr(streamName0,rootpath)) {
streamName = streamName0;
}
else {
streamName = dest.c_str();
}
还要添加头文件iostream
3.进一步修改
在RTSPServer.hh中添加声明
char const* root_path;
void setRootPath(char const* rootpath);
RTSPServer.cpp中添加实现
void RTSPServer::setRootPath(char const* rootpath) {
root_path = rootpath;
}
然后,将子项目mediaServer设为启动项目,重新编译。
将以上代码中
char const* rootpath = "自定义的根目录";
改为
char const* rootpath = RTSPServer::root_path;
此时可以在live555MediaServer.cpp中直接设置工作目录了:
rtspServer->setRootPath("D:/music/");
将修改移动到Android的ndk下编译,可能会出现找不到iostream的错误,需要在Application.mk下添加,加入静态库支持:
APP_STL := stlport_static
通过Live555MedaiServer新建流媒体服务对象时,其中代码如下:
portNumBits rtspServerPortNum = 554;
rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);
if (rtspServer == NULL) {
rtspServerPortNum = 8554;
rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB);
}
第一次会设置554为访问端口,不成功会改设8554,在Android端曾出现访问不成功,最后发现端口被设成了8554,访问这个端口是需要在地址中具体指明的。