YP.Lam | Live555 RTSP 视频流服务端开发笔记
  • In RTSP AV
  • /
  • Posted 2023-05-13

Live555 RTSP 视频流服务端开发笔记

最近需要为一个 IPC 项目实现 RTSP 功能,记录一下 Live555 实现 ISP 获取 H265 帧实现 RTSP 服务端的过程。

Live555 代码结构相对比较清晰:

R F t r s a p m S e e d r S v o e u r r c e M F e r d a i m a e S d e S s o s u i r o c n e M R e T d P i S a i S n u k b S e s s i o n

其中 FramedSource 可以通过多层嵌套的方式实现 filter 功能。

官方提供大量测试代码以及若干范例,然而大多视频源来自文件,因此需要针对 ISP 视频流的应用场景做修改。要点如下:

  1. 实现 FramedSource 子类,可以参考 DeviceSource 的实现,但测试中发现没有必要实现新帧到达事件触发的过程,因为 rtsp 连接后会调用 FramedSource 的 doGetNextFrame 方法,在此方法中如果调用 FramedSource::afterGetting(this) 则会继续触发 doGetNextFrame 的调用,因此只需要考虑缓冲区无数据的情况下通过 envir().taskScheduler().scheduleDelayedTask() 操作延时触发即可。

  2. 需要注意的是,请勿阻塞的形式等待缓冲区数据到来,因为 live555 是单线程运行,阻塞会影响其他功能的正确执行。

  3. 实现 OnDemandServerMediaSubsession 子类,实现 createNewStreamSource 与 createNewRTPSink 方法,针对 ISP 帧的形式,需要设置 reuseFirstSource 为 True

  4. 需要注意 ISP 获取的视频帧信息是否带有 00000001 等帧头信息,根据实际情况使用 H265VideoStreamFramer 或 H265VideoStreamDiscreteFramer 等。