【问题标题】:LIVE555 - Set SPS and PPS after receiving first frameLIVE555 - 接收第一帧后设置 SPS 和 PPS
【发布时间】:2016-01-12 20:29:25
【问题描述】:

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

问题:这些帧不包括 SPS 和 PPS NAL 单元。但是,我可以访问一个函数,该函数在设备对第一帧进行编码后向我提供 SPS 和 PPS NAL 单元。

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

  • 当调用 DESCRIBE 命令时,LIVE555 发送 SPS 和 PPS NAL 单元
  • 在调用 createNewStreamSource() 时设置 NAL 单位
  • 在调用 createNewRTPSink() 时设置 NAL 单位

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

【问题讨论】:

  • 你能解决问题吗?我知道,你提出这个问题已经太久了,我也很纠结,我还没有找到解决办法。
  • 为您发布了解决方案。

标签: c++ h.264 rtsp live555


【解决方案1】:

您没有提供有关应用程序设计/架构的足够信息来提供更好的答案:

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

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

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

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

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

【讨论】:

  • 在事件循环之前实例化编码器是非常不可能的,并且可能会导致我的设计出现问题。有没有更好的方法从事件循环中动态提供 SPS?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多