最近需要为一个 IPC 项目实现 RTSP 功能,记录一下 Live555 实现 ISP 获取 H265 帧实现 RTSP 服务端的过程。
Live555 代码结构相对比较清晰:
其中 FramedSource 可以通过多层嵌套的方式实现 filter 功能。
官方提供大量测试代码以及若干范例,然而大多视频源来自文件,因此需要针对 ISP 视频流的应用场景做修改。要点如下:
-
实现 FramedSource 子类,可以参考 DeviceSource 的实现,但测试中发现没有必要实现新帧到达事件触发的过程,因为 rtsp 连接后会调用 FramedSource 的 doGetNextFrame 方法,在此方法中如果调用 FramedSource::afterGetting(this) 则会继续触发 doGetNextFrame 的调用,因此只需要考虑缓冲区无数据的情况下通过 envir().taskScheduler().scheduleDelayedTask() 操作延时触发即可。
-
需要注意的是,请勿阻塞的形式等待缓冲区数据到来,因为 live555 是单线程运行,阻塞会影响其他功能的正确执行。
-
实现 OnDemandServerMediaSubsession 子类,实现 createNewStreamSource 与 createNewRTPSink 方法,针对 ISP 帧的形式,需要设置 reuseFirstSource 为 True
-
需要注意 ISP 获取的视频帧信息是否带有 00000001 等帧头信息,根据实际情况使用 H265VideoStreamFramer 或 H265VideoStreamDiscreteFramer 等。