LIVE555 - 收到第一帧后设置 SPS 和 PPS
LIVE555 - Set SPS and PPS after receiving first frame
我有一个设备可以提供 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 单元?
您没有提供足够的关于应用程序的信息design/architecture来提供更好的答案:
不确定我是否正确理解您的问题,但听起来您只是在在 RTSP 客户端请求之后实例化编码器。然而,DESCRIBE 请求通过了 SPS、PPS,并且在 DESCRIBE 时,您还没有对任何数据进行编码,因此没有 SPS 和 PPS。
如果编码器在 live555 事件循环中实例化 在 客户端请求之后,那么一种解决方案是
- 使用所需配置(或所有可能的配置)实例化编码器在应用程序启动时
- 编码一帧
- 检索并保存 SPS 和 PPS
- 关闭编码器
- 继续 "normal" 事件循环并等待 RTSP 客户端连接。
根据我的经验,SPS 和 PPS 通常不会(经常)更改,您必须从某个地方(配置文件?)获取编码器配置。
如果这不能回答您的问题,请提供更多详细信息,例如应用程序线程,什么是事件循环 运行,编码器生命周期等
好久不见了。但正如所要求的那样,我的解决方案是什么的一般概述。我不知道它是否是一个好的解决方案。为此,时间太长了:
- 我在一开始就编码了一帧,并使用提到的函数来抓取 SPS 和 PPS NAL 单元
- ...然后立即销毁编码器
- ...从结果中删除了起始代码
- ...分别对 SPS 和 PPS NAL 单元进行 base64 编码,并以 SPS + "," + PPS
的格式将它们连接起来
- ...创建了一个 ServerMediaSession
- ...创建了一个自定义 MediaSubsession,它使用方法 createNewStreamSource 和 createNewRTPSink
扩展了 OnDemandServerMediaSubsession
- ...创建了一个新的编码器实例并将其传递给 createNewStreamSource 方法中的 H264VideoStreamDiscreteFramer
- ...在 createNewRTPSink 方法中使用了 H264VideoRTPSink,我将上述串联的 SPS 和 PPS NAL 单元传递给该方法
我有一个设备可以提供 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 单元?
您没有提供足够的关于应用程序的信息design/architecture来提供更好的答案:
不确定我是否正确理解您的问题,但听起来您只是在在 RTSP 客户端请求之后实例化编码器。然而,DESCRIBE 请求通过了 SPS、PPS,并且在 DESCRIBE 时,您还没有对任何数据进行编码,因此没有 SPS 和 PPS。
如果编码器在 live555 事件循环中实例化 在 客户端请求之后,那么一种解决方案是
- 使用所需配置(或所有可能的配置)实例化编码器在应用程序启动时
- 编码一帧
- 检索并保存 SPS 和 PPS
- 关闭编码器
- 继续 "normal" 事件循环并等待 RTSP 客户端连接。
根据我的经验,SPS 和 PPS 通常不会(经常)更改,您必须从某个地方(配置文件?)获取编码器配置。
如果这不能回答您的问题,请提供更多详细信息,例如应用程序线程,什么是事件循环 运行,编码器生命周期等
好久不见了。但正如所要求的那样,我的解决方案是什么的一般概述。我不知道它是否是一个好的解决方案。为此,时间太长了:
- 我在一开始就编码了一帧,并使用提到的函数来抓取 SPS 和 PPS NAL 单元
- ...然后立即销毁编码器
- ...从结果中删除了起始代码
- ...分别对 SPS 和 PPS NAL 单元进行 base64 编码,并以 SPS + "," + PPS 的格式将它们连接起来
- ...创建了一个 ServerMediaSession
- ...创建了一个自定义 MediaSubsession,它使用方法 createNewStreamSource 和 createNewRTPSink 扩展了 OnDemandServerMediaSubsession
- ...创建了一个新的编码器实例并将其传递给 createNewStreamSource 方法中的 H264VideoStreamDiscreteFramer
- ...在 createNewRTPSink 方法中使用了 H264VideoRTPSink,我将上述串联的 SPS 和 PPS NAL 单元传递给该方法