google-chrome - 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 上,我得到了一个乱码。会是什么?
- cpu 为 70-100%(pi 有 4 个内核,所以有时我得到超过 100%)
- 网络问题?
- 关键帧正在丢失?
- 别的东西?
我想我真正要问的是如何通过 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 的人提到它会自动协商正确的上限。
解决方案
您将白噪声作为视频发送,pattern=snow
这对于编码器来说是不可能压缩的。白噪声在信号中几乎没有冗余,因此编码器无法很好地处理它。(尤其是在直播场景中)。
如果是球模式,它对你有用,因为大部分视频都是黑色的(意味着信号中有很多冗余),编码器很容易压缩那个。
我猜您的连接(数据通道)不够好,因此您看到的视频如此糟糕。从您的屏幕截图中,您可以清楚地看到左上角的视频看起来应该是这样,然后它在光栅扫描顺序中质量下降。
总结一下:
- 可能是丢包/网络问题
- 编码器在您的笔记本电脑上做得更好(根据您的编辑 4),因此在这种情况下发送的数据更少。
- 您可以尝试调整编码器参数(不仅仅是使用默认参数)以使其正常工作
- 发送白噪声通常不是您想做的事情。首先在您的真实内容上进行测试。尝试找到具有大量运动的最坏情况真实内容,看看问题是否仍然出现。