live555初探-修改live555当前工作目录

文章链接:http://www.liuschen.com

我的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,访问这个端口是需要在地址中具体指明的。

Loading Disqus comments...
Table of Contents