先看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的作用如下:参考道长的文章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
继承自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 }
关于分析数据的H264or5VideoStreamParser参看道长的文章:http://blog.csdn.net/zhangjikuan/article/details/38555951