LIVE555 - 收到第一帧后设置 SPS 和 PPS

LIVE555 - Set SPS and PPS after receiving first frame

我有一个设备可以提供 H264 编码的帧。那些我想使用LIVE555通过网络传输的。

问题:这些帧不包括 SPS 和 PPS NAL 单元。但是,我可以访问一个功能,该功能在设备编码第一帧后为我提供 SPS 和 PPS NAL 单元。

问题:LIVE555的事件循环已经启动后,如何设置SPS和PPS NAL单元?我读过许多关于类似问题的帖子,但所有这些帖子都提出了以下解决方案:

所有这些解决方案对我来说都没有用,因为此时我还没有 SPS 和 PPS NAL 单元。在事件循环已经开始后,是否有某种方法可以更新这些 NAL 单元?

您没有提供足够的关于应用程序的信息design/architecture来提供更好的答案:

不确定我是否正确理解您的问题,但听起来您只是在 RTSP 客户端请求之后实例化编码器。然而,DESCRIBE 请求通过了 SPS、PPS,并且在 DESCRIBE 时,您还没有对任何数据进行编码,因此没有 SPS 和 PPS。

如果编码器在 live555 事件循环中实例化 客户端请求之后,那么一种解决方案是

  • 使用所需配置(或所有可能的配置)实例化编码器在应用程序启动时
  • 编码一帧
  • 检索并保存 SPS 和 PPS
  • 关闭编码器
  • 继续 "normal" 事件循环并等待 RTSP 客户端连接。

根据我的经验,SPS 和 PPS 通常不会(经常)更改,您必须从某个地方(配置文件?)获取编码器配置。

如果这不能回答您的问题,请提供更多详细信息,例如应用程序线程,什么是事件循环 运行,编码器生命周期等

好久不见了。但正如所要求的那样,我的解决方案是什么的一般概述。我不知道它是否是一个好的解决方案。为此,时间太长了:

  1. 我在一开始就编码了一帧,并使用提到的函数来抓取 SPS 和 PPS NAL 单元
  2. ...然后立即销毁编码器
  3. ...从结果中删除了起始代码
  4. ...分别对 SPS 和 PPS NAL 单元进行 base64 编码,并以 SPS + "," + PPS
  5. 的格式将它们连接起来
  6. ...创建了一个 ServerMediaSession
  7. ...创建了一个自定义 MediaSubsession,它使用方法 createNewStreamSource 和 createNewRTPSink
  8. 扩展了 OnDemandServerMediaSubsession
  9. ...创建了一个新的编码器实例并将其传递给 createNewStreamSource 方法中的 H264VideoStreamDiscreteFramer
  10. ...在 createNewRTPSink 方法中使用了 H264VideoRTPSink,我将上述串联的 SPS 和 PPS NAL 单元传递给该方法