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

时间:2015-10-14 16:20:15

标签: c++ h.264 rtsp live555

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

问题:这些框架不包含SPS和PPS NAL单元。但是,我可以访问一个功能,在设备编码第一帧后,它会向我发送SPS和PPS NAL单元。

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

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

所有这些解决方案在我的情况下都没用,因为我在这些时刻没有SPS和PPS NAL单元。有没有某种方法在事件循环开始后更新这些NAL单元?

2 个答案:

答案 0 :(得分:2)

您尚未提供有关应用程序设计/体系结构的足够信息,以提供更好的答案:

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

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

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

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

如果这不能解答您的问题,请提供有关例如应用程序线程,正在运行的事件循环,编码器生命周期等。

答案 1 :(得分:1)

已经有一段时间了。但应要求提供有关我的解决方案的概述。我不知道这是否是一个好的解决方案。为此已经太久了:

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