gstreamer webrtc h264在浏览器中播放几帧后停止



我需要帮助调试概率问题。我构建了一个gstreamer管道,将NVENC编码的h264比特流(仅限视频(流式传输到浏览器。浏览器很少正常播放。在大多数情况下,只有少数帧被渲染,然后图片被冻结。

NVENC设置遵循";https://cloud.google.com/solutions/gpu-accelerated-streaming-using-webrtc"它们是h264高调&低延迟高质量&NVENC_INFINITE_GOPLENGTH(已经尝试了一些设置,如rateControlMode/enableVFR/sliceMode/reeatSPSPPS/outputAUD,但没有帮助(。在运行时,NVENC将实时渲染的opengl fbo纹理编码为h264位流,并通过appsrc将其推送到gstreamer中。目前,纹理大小为512x512,以10/20/30帧/秒的速度馈送。

我使用gstreamer 1.18.2;appsrc名称=nvenc_src do时间戳=1!video/x-h264,流格式=字节流,对齐=au!rtph264支付聚合模式=零延迟!队列application/x-rtp,media=video,编码名称=H264,有效载荷=123!webrtcbin捆绑包策略=最大兼容名=backend_webrtc";。

gstreamer部分代码遵循sendrecv示例(用websockettpp替换libsoup并删除recv逻辑(。

该应用程序构建为MSVC 2019 32位。浏览器解码器是NVDEC。Exe应用程序和js代码在同一台电脑上运行(windwos 10,gtx1060,驱动程序版本460.89(。我尝试过Chrome(87.0.4280.88(和edge(87.0.664.66(。我也尝试过在android(Chrome(和ios(safari(中运行js代码,结果相同。

可以得出结论,NVENC生成"正确"的h264比特流。我将原始h264比特流转储到文件中。该文件在VLC中正常播放。我还尝试将转储的h264比特流推入gstreamer。冻结的问题仍然存在。

图片被冻结后,播放永远不会恢复。浏览器的"webrtc内部"显示字节/headerBytes/packests_Received保持增长,而frameReceived/framesDecoded/framesDropped保持不变。

由于逐位相同的h264帧在不同的运行中表现不同,我想rtp时间戳可能会导致问题。我尝试过将appsrc的do时间戳设置为0,并手动设置gstbuffer的PTS,但无济于事。

以下是您需要注意的几件事:

  • 无限GOP将不起作用-您必须配置NVENC以每30-60帧发送一个关键帧
  • 当然,SPS-PPS NAL必须出现在每个关键帧之前
  • 禁止B帧:WebRTC不支持它们,因为它们会增加延迟
  • NAL之间的启动代码必须为3字节启动代码:WebRTC不尊重2字节启动代码。我们以前遇到过这个问题,不得不手动更正启动代码

感谢user1390208的善意提醒,我使用h264分析器工具来检查转储的比特流并找出其中的弊端。

浏览器确实支持无限GOP。但它需要关键帧&用于从错误中恢复的SPS-PPS。在发射过程中,重新发送的需求很有可能出现。因此,一个快速的解决方案是重新发送关键帧&js检测到fps为0后,SPS-PPS通过webrtc数据通道向gstreamer发送重新发送请求。

我找不到答案的原因有两个:

  • 在调用nvEncEncodePicture之前,我没有设置encodePicFlags。无论gopLength&frameIntervalP被设置为所有I或I&P.有很多与共和党相关的参数,现在我觉得很困惑。在我当前的代码中,获得desried GOP控件的唯一方法是在调用nvEncEncodePicture之前设置NV_ENC_PIC_PARAMS::encodePicFlags。注意,我使用NV_ENC_PRESET_LOW_LATENCY_HQ_GUID&总是生成可能导致无限GOP的NV_ENC_H264_PROFILE_HIGH_GUID(当未设置encodePicFlags时(?NVENC在设置gopLength&frameIntervalP&repeatSPSPPS,所以我认为当GOP是所有I帧并且SPS-PPS没有帮助时,问题也会发生。

  • 在启动过程中,Infinity GOP并不总是在浏览器中引起上述问题。

因此,在我使用分析器工具检查h264位流之前,我认为即使是所有关键帧+SPS-PPS位流也存在这种概率问题。

NVENC生成4字节的起始代码。

最新更新