live555 source

Source和Sink:可以把source理解为发送端的流,sink理解为接受端。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式和编码的支持即是通过对这两个类的派生实现的。Source和Sink通过RTP子会话(MediaSubSession)联系在一起。

 

   FramedSource 派生自MediaSource, 一帧码流的实现。私有unsigned char* fTo; // in  是指向发送的码流的指针。

重要的函数有 getNextFrame

void  FramedSource::getNextFrame(unsigned char * to, unsigned maxSize,
                 afterGettingFunc* afterGettingFunc,
                 void * afterGettingClientData,
                 onCloseFunc* onCloseFunc,
                 void * onCloseClientData) {
   // Make sure we're not already being read:
   if  (fIsCurrentlyAwaitingData) {
     envir() << "FramedSource["  << this  << "]::getNextFrame(): attempting to read more than once at the same time!\n" ;
     envir().internalError();
   }
 
   fTo = to;
   fMaxSize = maxSize;
   fNumTruncatedBytes = 0; // by default; could be changed by doGetNextFrame()
   fDurationInMicroseconds = 0; // by default; could be changed by doGetNextFrame()
   fAfterGettingFunc = afterGettingFunc;
   fAfterGettingClientData = afterGettingClientData;
   fOnCloseFunc = onCloseFunc;
   fOnCloseClientData = onCloseClientData;
   fIsCurrentlyAwaitingData = True;
 
   doGetNextFrame();
}

  

doGetNextFrame(); 是一个虚函数,具体各种编码模式,我们可以根据自己的码流类型定义一个派生自FramedSource的类, 重新再定义doGetNextFrame如何获得下一帧的码流。在自己重定义的doGetNextFrame() 中将fTo指向要发送的缓存。
<br><br>我们可以通过doGetNextFrame() 是fTo重定向我们要发送的流,而不是从文件中读取。(搞定了source)之后就是要如何让fTo与发送会话连接起来,OnDemandServerMediaSubsession由 ServerMediaSubsession 派生而来,其有一个新的私有函数 virtual  FramedSource* createNewStreamSource,我们又可以重新定义一个派生自OnDemandServerMediaSubsession 的类,重新定义createNewStreamSource 将fTo 与 ServerMedia联系起来。<br>如下live555中的例子<br><br>
复制代码
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);
}
复制代码
ByteStreamFileSource说到底还是继承自FramedSource,定义了从文件获取source的方法,而这个函数又将ServerMedia 与source联系了起来,
ServerMedia 就知道该发送什么东东了。  return H264VideoStreamFramer::createNew(envir(), fileSource); 给 ServerMedia  返回了一个 FramedSource 。
不过,如果自己定义的ServerMedia直接从 OnDemandServerMediaSubsession 继承的话,有很多纯虚函数需要自己去实现,比较麻烦,所以可以直接从
H264VideoFileServerMediaSubsession 继承,它实现了这些纯虚函数,我们只需重定义createNewStreamSource 就ok了。
<br><br><br>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
live555是一个开源的多媒体流媒体库,可以用于实现RTSP服务器和推流功能。根据引用\[1\]和引用\[2\]的描述,使用live555可以通过读取文件并打包成RTSP包来实现推流功能。你可以将视频文件放到live555的服务目录下,然后使用VLC等支持RTSP协议的播放器通过rtsp://ip:8554/file.264的方式来播放视频。 如果你想自定义访问格式,可以根据引用\[2\]中的描述,定义自己的RTSP服务器类,并继承live555的RTSPServerSupportingHTTPStreaming类。通过定义自己的rtsp://ip:8554/chX/main格式,其中X代表通道地址,你可以实现符合自己需求的访问格式。 此外,根据引用\[3\]的描述,你还可以创建CCameraVideo类对象来实现实时视频流和实时音频流接口。这些接口可以用于控制视频和音频的开始、获取下一帧、获取帧的时长等操作。 综上所述,live555可以通过读取文件并打包成RTSP包来实现推流功能,同时也支持自定义访问格式和实时视频流和实时音频流接口的实现。 #### 引用[.reference_title] - *1* *2* [建立live555海思编码推流服务](https://blog.csdn.net/liqinghan/article/details/54411732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [live555+ffmpeg实时视频推流](https://blog.csdn.net/hey5178/article/details/131102813)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值