live555学习-ByteStreamFileSource和H264VideoStreamFramer

先看H264VideoFileServerMediaSubsession.hh和.cpp文件中的H264VideoFileServerMediaSubsession类

类中关于获取数据的source部分其实是用一下函数实现的

FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) {
  estBitrate = 500; // kbps, estimate


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


  // Create a framer for the Video Elementary Stream:
  return H264VideoStreamFramer::createNew(envir(), fileSource);
}

从此函数可知,通过调用H264VideoStreamFramer::createNew(envir(), fileSource)和ByteStreamFileSource::createNew(envir(), fFileName)实现的数据流读取

实际上H264VideoStreamFramer的作用如下:参考道长的文章http://blog.csdn.net/zhangjikuan/article/details/38555951

H264VideoStreamFramer把自己的缓冲(其实是sink的)传给H264VideoStreamParser,每当H264VideoStreamFramer要获取一个NALU时,就跟H264VideoStreamParser要,H264VideoStreamParser就从ByteStreamFileSource读一坨数据,然后进行分析,如果取得了一个NALU,就传给H264VideoStreamFramer.

也就是说

我们想像一下H264VideoStreamParser的所作所为:H264VideoStreamFramer把自己的缓冲(其实是sink的)传给H264VideoStreamParser,每当H264VideoStreamFramer要获取一个NALU时,就跟H264VideoStreamParser要,H264VideoStreamParser就从ByteStreamFileSource读一坨数据,然后进行分析,如果取得了一个NALU,就传给H264VideoStreamFramer.唉,H264VideoStreamFramer真是个不劳而获的坏家伙!


下面分别来说 H264VideoStreamFramer和ByteStreamFileSource

一:H264VideoStreamFramer

继承自H264or5VideoStreamFramer继承自MPEGVideoStreamFramer继承自FrameFilter继承自FramedSource继承自mediaSource继承自medium

他只是一个中间操办环节类中没添加什么新内容,完全是继承自H264or5VideoStreamFramer中的成员

H264or5VideoStreamFramer中cpp文件新创建了class H264or5VideoStreamParser: public MPEGVideoStreamParser负责分析数据

二:ByteStreamFileSource

继承自FramedFileSource继承自FramedSource继承自mediaSource继承自medium

FramedFileSource和FramedSource都是抽象类,在FramedSource中创建了纯虚函数virtual void doGetNextFrame() = 0;FramedFileSource未实现此纯虚函数所以也为抽象类,实际上FramedFileSource主要是继承FramedSource,自己并未实现什么,只是中间增加了个FILE变量

FramedSource类的讲解参考:http://blog.csdn.net/zhangjikuan/article/details/38564199

ByteStreamFileSource作用是从文件中读取数据,如果想做直播,可以参考这个类新建继承自FramedSource的类实现纯虚函数doGetNextFrame()

主要是实现了纯虚函数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
}

通过调用fileReadableHandler调用doReadFromFile实现从文件中读取数据的,这两个函数也是在此类中实现的


关于分析数据的H264or5VideoStreamParser参看道长的文章:http://blog.csdn.net/zhangjikuan/article/details/38555951


你可能感兴趣的:(Live555)