问题描述
我需要帮助来调试概率问题。我构建了一个 gstreamer 管道来将 NVENC 编码的 h264 比特流(仅限视频)传输到浏览器。浏览器很少能正常播放。在大多数情况下,只渲染了几帧,然后图片就会被冻结。
NVENC 设置遵循“https://cloud.google.com/solutions/gpu-accelerated-streaming-using-webrtc”,它们是 h264 高配置和低延迟高质量和 NVENC_INFINITE_GOPLENGTH(已经尝试了一些设置,例如rateControlMode/enableVFR/sliceMode/repeatSPSPPS/outputAUD 但没有帮助)。在运行时,NVENC 将实时渲染的 opengl fbo 纹理编码为 h264 比特流,并通过 appsrc 将它们推送到 gstreamer。目前纹理大小为 512x512,以 10/20/30 fps 的速度馈送。
我使用gstreamer 1.18.2,管道定义为“appsrc name=nvenc_src do-timestamp=1 !video/x-h264,stream-format=byte-stream,alignment=au !rtph264payaggregate-mode=zero -延迟!队列!应用程序/x-rtp,media=video,encoding-name=H264,payload=123!webrtcbin bundle-policy=max-compat name=backend_webrtc”。
gstreamer 部分代码遵循 sendrecv 示例(用 websocketpp 替换 libsoup 并删除 recv 逻辑)。
该应用程序构建为 MSVC 2019 32 位。浏览器解码器是 NVDEC。 exe 应用程序和 js 代码在同一台 PC 上运行(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-internals”显示 bytes/headerBytes/packests_Received 不断增长,而 frameReceived/framesDecoded/framesDropped 保持不变。
由于按位相同的 h264 帧在不同的运行中表现不同,我猜 rtp 时间戳可能会导致问题。我已经尝试将 appsrc 的 do-timestamp 设置为 0 并手动设置 gstbuffer 的 PTS,但它没有帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)