live555源码分析----mpg文件的处理

    live555支持的文件格式多为单流的文件,仅支持*.mpg、*.mkv、*.webm几种音视频混合类型的文件。其实我的目的是扩展其支持的格式,如avi等, 所以来分析一下mpg文件的处理。


    mpg文件处理涉及的类相当多,类间的关系比较复杂,对于RTP打包的过程(在RTPSink中完成)所以有的媒体类型比较相似(细节上有差异,这些都是在特定媒体相关的***RTPSink中完成的),所以主要分析的是从source中获取数据的过程。一个subsession对应一个流,当一个session中拥有多个subsession时,需要对每一个subsession进行单独的控制。我们可以看到,对处理“PLAY”命令时,对session中的每个subsession都调用了一次startStream操作,如下:


void RTSPServer::RTSPClientSession
  ::handleCmd_PLAY(ServerMediaSubsession* subsession, char const* cseq,
  char const* fullRequestStr) {

  //现在终于开始媒体数据传输了

  // Now, start streaming:
  for (i = 0; i < fNumStreamStates; ++i) {
    if (subsession == NULL /* means: aggregated operation */
|| subsession == fStreamStates[i].subsession) {
      unsigned short rtpSeqNum = 0;
      unsigned rtpTimestamp = 0;

      //开始各个subsession上的数据传输, 即开始播放了

      fStreamStates[i].subsession->startStream(fOurSessionId,
      fStreamStates[i].streamToken,
      (TaskFunc*)noteClientLiveness, this,
      rtpSeqNum, rtpTimestamp,
      handleAlternativeRequestByte, this);
    ...
    }
  }
  
...
}


    
    PLAY命令的处理过程前面的文章已经分析过了,通过subsession->startStream调用启动每个流上的播放,其从source获取源数据是将在MultiFramedRTPSink::packFrame()中进行的。


void MultiFramedRTPSink::packFrame() {
  if (fOutBuf->haveOverflowData()) {
...
  } else {
...

    //
    //从source中获取下一个frame
    //
    fSource->getNextFrame(fOutBuf->curPtr(), fOutBuf->totalBytesAvailable(),
			  afterGettingFrame, this, ourHandleClosure, this);
  }
}


    对于mpeg来讲,fSource是一个MPEG1or2VideoStreamFramer或者MPEG1or2AudioStreamFramer实例(根据live555中的源码,还有一种AAC格式音频,这里为了简便不作分析)。它们的继承关系如下:
    MPEG1or2VideoStreamFramer->MPEGVideoStreamFramer->FramedFilter->FramedSource->MediaSource
    MPEG1or2AudioStreamFramer->FramedSource->MediaSource


    先来分析mpeg video的处理。
    MPEG1or2VideoStreamFramer类的实现简单,主要是创建对应的语法分析器MPEG1or2VideoStreamParser实例。显然MPEG1or2VideoStreamFramer(是FrameSource的直接子类)是一个Filter,跟它的创建过程可以发现,它的输入source是一个MPEG1or2DemuxedElementaryStream类实例。对于单流的文件来讲, 一般包装的是ByteStreamFileSource类实例,从后面我们可以发现,最终直接读取文件的还是ByteStreamFileSource实例。对于语法分析部分,不作分析,我们只关心如何从文件中解析出音视频数据,所以直接跟踪Filter所包装的MPEG1or2DemuxedElementaryStream类。在语法分析器中,将会调用MPEG1or2DemuxedElementaryStream的getNextFrame函数。
    

    getNextFrame是定义在FramedSource中的非虚函数,实现如下

void FramedSource::getNextF
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值