live555读文件改为读内存

近期有一项工作涉及到视频流的传输,在RTSP服务器中实时转播国标服务器获取到的h264视频数据,而live555库只支持文件推流,经过几天的摸索,实现其功能,以此文档记录之。(本次记录以live555库的mediaServer案例程序为基础)

live555版本为 这里 的2019.6.28版本
安装指令:

  1. ./genMakefiles linux (linux下为此操作,其他平台编译方法可在官网查看)
  2. ./make
  3. ./make install
    (live555安装的库文件在/usr/local/lib,头文件在/usr/local/include/文件夹下:
    BasicUsageEnvironment,groupsock,liveMedia,UsageEnvironment这四个文件)

经过demo程序live555MediaServer的代码跟踪可以发现,读取文件流的地方在ByteStreamFileSource类的doGetNextFrame函数里,如下:

void ByteStreamFileSource::doGetNextFrame() {
  if (feof(fFid) || ferror(fFid) || (fLimitNumBytesToStream && fNumBytesToStream == 0)) {
    handleClosure();
    return;
  }

#ifdef READ_FROM_FILES_SYNCHRONOUSLY
  doReadFromFile();//就是这个函数
#else
  if (!fHaveStartedReading) {
    // Await readable data from the file:
    envir().taskScheduler().turnOnBackgroundReadHandling(fileno(fFid),
	       (TaskScheduler::BackgroundHandlerProc*)&fileReadableHandler, this);
    fHaveStartedReading = True;
  }
#endif
}

在这里,需要在上面的doReadFromFile函数中实现读内存的功能,将需要推送的视频流数据拷贝到fTo缓冲区,fFrameSize是需要发送的帧数据的大小值,需要特别注意的是:fTo里的数据大小不能超过规定的帧size阀值,否则会导致程序中断,默认的值是150000,我们需要修改它,在文件live/liveMedia/StreamParser.cpp中定义了一个宏,#define BANK_SIZE就是这个帧值,将它改为比所有帧都大的值即可。(需要重新编译库)

这应该是最懒的实现读内存的操作了,但是破坏了这个库的内部结构,要是以后想要使用这里的文件推流怎么办?
下面记录了一种模仿几个类,另外添加的读内存的操作,保证了原有的文件推流源代码依然完整。

  1. 首先doReadFromFile是在ByteStreamFileSource中,我们需要模仿这个类重新实现一个新的类,就叫它ByteStreamLiveSource吧,依然是修改doReadFromFile函数,如上所说,在此不再重复,其他代码无需修改亦可。
  2. 在demo程序中我们可以发现,ByteStreamFileSource类的对象是在H264VideoFileServerMediaSubsession类中创建的,所以我们还需要重新实现这个类,就叫它H264VideoLiveServerMediaSubsession吧,如下:
FramedSource* H264VideoLiveServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {
  estBitrate = 500; // kbps, estimate

  // Create the video source:
  //ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);
  ByteStreamLiveSource* fileSource = ByteStreamLiveSource::createNew(envir(), fFileName);
  if (fileSource == NULL) return NULL;
  //fFileSize = fileSource->fileSize();

  // Create a framer for the Video Elementary Stream:
  return H264VideoStreamFramer::createNew(envir(), fileSource);
}
  1. 最后在H264VideoFileServerMediaSubsession调用的地方也替换掉就可以了,如下;
//DynamicRTSPServer.cpp
...
else if (strcmp(extension, ".264") == 0) {
    // Assumed to be a H.264 Video Elementary Stream file:
    NEW_SMS("H.264 Video");
    OutPacketBuffer::maxSize = 1014*1024; // allow for some possibly large H.264 frames
    //sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
    sms->addSubsession(H264VideoLiveServerMediaSubsession::createNew(env, fileName, reuseSource));
  }
...
  1. 可优化项:本程序为读内存操作,但是url请求路径中依然必须包含文件名及后缀名,并且在程序运行目录中必须存在该文件,因为live555底层有多处需要对该文件进行验证,如文件是否存在,是否可读以及视频流格式是否正确等,所以需要此文件保证程序不会崩溃,以后可去掉这些无用的判断项以及文件(暂未处理)

–The end–
欢迎指正!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值