首页 > 解决方案 > webrtc h264视频乱码chrome

问题描述

您好我正在尝试设置摄像机的实时流以流式传输到 chrome 浏览器。我来自相机的流以 h264 编码,因此我想使用 gstreamers webrtcbin 元素直接将其发送到浏览器。我可以让它将视频推送到屏幕上,但问题是视频出现乱码。我已经使用 videotestsrc 对其进行了测试,看看直接对其进行编码并将其发送到浏览器是否会有所帮助。

这是我看到的:

在此处输入图像描述

这是管道:

PIPELINE_DESC = '''
webrtcbin name=sendrecv bundle-policy=max-bundle
 videotestsrc is-live=true pattern=snow ! videoconvert ! queue ! x264enc ! rtph264pay !
 queue ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! sendrecv.
 audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay !
 queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=96 ! sendrecv.
'''

有什么我想念的吗?

编辑:有趣的是,当尝试不同的模式(如球)时,输出看起来和表现良好:

在此处输入图像描述

EDIT2:视频在 Firefox 中播放良好... hrmm ... chrome 显示 h264 有问题吗?

它可能与关键帧有关吗?

EDIT3:当我在本地运行我的管道时,我可以完美地看到它。难道是我丢包?

EDIT4:当我在笔记本电脑上运行相同的代码时,它工作正常。但是在我的 Pi 上,我得到了一个乱码。会是什么?

我想我真正要问的是如何通过 webrtc 将 h264 流发送到使用 gstreamer 的浏览器?

编辑:这是我的解决方案:

从视频来源的机器:

gst-launch-1.0 -v videotestsrc ! x264enc speed-preset=ultrafast ! "video/x-h264,profile=constrained-baseline,width=1280,height=720,stream-format=byte-stream,level=(string)3.1" ! rtph264pay config-interval=1 ! udpsink port=7001

我们可以看到级别设置为 3.1 并且我们正在编码,但这也适用于已经在 h264 中的视频,例如直接来自相机的视频。

客户端/网络浏览器需要这个管道:

PIPELINE_DESC = '''
    webrtcbin name=sendrecv bundle-policy=max-bundle
        udpsrc port=7001 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! 
        h264parse ! rtph264pay config-interval=-1 !
        queue ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtpjitterbuffer ! sendrecv.''' 

我不完全确定它为什么会出现这个问题,我怀疑它与配置文件级别有关,但 gstreamer irc 的人提到它会自动协商正确的上限。

标签: google-chromewebrtcgstreamerh.264

解决方案


您将白噪声作为视频发送,pattern=snow这对于编码器来说是不可能压缩的。白噪声在信号中几乎没有冗余,因此编码器无法很好地处理它。(尤其是在直播场景中)。

如果是球模式,它对你有用,因为大部分视频都是黑色的(意味着信号中有很多冗余),编码器很容易压缩那个。

我猜您的连接(数据通道)不够好,因此您看到的视频如此糟糕。从您的屏幕截图中,您可以清楚地看到左上角的视频看起来应该是这样,然后它在光栅扫描顺序中质量下降。

总结一下:

  • 可能是丢包/网络问题
  • 编码器在您的笔记本电脑上做得更好(根据您的编辑 4),因此在这种情况下发送的数据更少。
  • 您可以尝试调整编码器参数(不仅仅是使用默认参数)以使其正常工作
  • 发送白噪声通常不是您想做的事情。首先在您的真实内容上进行测试。尝试找到具有大量运动的最坏情况真实内容,看看问题是否仍然出现。

推荐阅读