如何通过gstreamer udpsink流式传输h.264时修复图像问题

问题描述 投票:0回答:1

使用gstreamer我想将几个Logitech C920网络摄像头的图像流式传输到RTP / h.264格式的Janus媒体服务器。网络摄像头产生h.264编码的视频流,因此我可以将流发送到UDP接收器而无需重新编码数据,只需加载它。

我正在使用gst-interpipe插件在不同的网络摄像头之间切换,因此Janus收到的视频流保持不变,但图像来自我选择的任何网络摄像头。

它可以工作,但我遇到了一些问题,破碎的框架颜色是灰色的,细节模糊了,主要是我在网络摄像头源流之间切换后的前10-10秒。之后,图像自我纠正。

First frames

After 5 - 10 seconds or more

首先我认为这是gst-interpipe特定的问题,但我可以通过简单地设置两个管道来重现它 - 一个将视频流发送到UDP接收器,一个从UDP源读取:

gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! queue ! video/x- 
h264,width=1280,height=720,framerate=30/1 ! rtph264pay 
config-interval=1 ! udpsink host=127.0.0.1 port=8004


gst-launch-1.0 -v udpsrc port=8004 caps = "application/x-rtp, 
media=video, clock-rate=90000, encoding-name=H264, payload=96" ! 
rtph264depay ! decodebin ! videoconvert ! xvimagesink

注意:如果我将视频流直接发送到xvimagesink,即不使用UDP流时,我没有遇到此问题。

我错过了管道中的一些重要参数吗?这是缓冲问题吗?我真的不知道如何纠正这个问题。任何帮助是极大的赞赏。

linux video-streaming gstreamer h.264
1个回答
0
投票

由于视频流的时间依赖性的性质,您不能只调入流并期望它可以立即解码。正确的解码只能从随机接入点帧(例如I或IDR帧)开始。在此之前,您将获得依赖于您尚未收到的视频帧的图像数据 - 因此它们看起来会破碎。有些解码器可以控制如何处理这些情况。例如,libavdec_h264有一个output-corrupt选项。 (但实际上我并不知道它对于那些只是缺少参考帧的“正确”帧的表现如何)。或者他们可以选择跳过所有内容,直到发生RAP帧。这取决于您的特定解码器实现。但请注意,在任何这些选项上,您将看到任何图像之前的初始延迟将增加。

© www.soinside.com 2019 - 2024. All rights reserved.