如何解决通过 gstreamer udpsink 流式传输 h.264 时的图像问题
How to fix image problems when streaming h.264 via gstreamer udpsink
我想使用 gstreamer 以 RTP/h.264 格式将图像从多个 Logitech C920 网络摄像头流式传输到 Janus 媒体服务器。网络摄像头产生 h.264 编码的视频流,因此我可以将流发送到 UDP 接收器而无需重新编码数据,只需对其进行有效载荷。
我正在使用 gst-interpipe 插件在不同的网络摄像头之间切换,以便 Janus 接收到的视频流保持不变,但图像来自我选择的任何网络摄像头。
它有效,但我遇到了一些破帧问题,其中颜色为灰色且细节模糊,主要是在我切换网络摄像头源流后的前 5 - 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 流时,我不会遇到这个问题。
我的管道中是否遗漏了一些重要参数?这是一个缓冲问题吗?我真的不知道如何纠正这个问题。
非常感谢任何帮助。
由于视频流的时间依赖性的性质,您不能只调入流并期望它可以立即解码。正确的解码只能从随机访问点帧(例如 I 或 IDR 帧)开始。在此之前,您将获得依赖于您尚未收到的视频帧的图像数据 - 因此它们看起来会损坏。一些解码器对这些情况下的操作提供了一些控制。 libavdec_h264
例如有一个 output-corrupt
选项。 (但实际上我不知道 "correct" 缺少参考帧的帧的行为)。或者他们可以选择跳过所有内容,直到出现 RAP 帧。这取决于您的具体解码器实现。但是请注意,在任何这些选项上,您看到任何图像之前的初始延迟都会增加。
我想使用 gstreamer 以 RTP/h.264 格式将图像从多个 Logitech C920 网络摄像头流式传输到 Janus 媒体服务器。网络摄像头产生 h.264 编码的视频流,因此我可以将流发送到 UDP 接收器而无需重新编码数据,只需对其进行有效载荷。
我正在使用 gst-interpipe 插件在不同的网络摄像头之间切换,以便 Janus 接收到的视频流保持不变,但图像来自我选择的任何网络摄像头。
它有效,但我遇到了一些破帧问题,其中颜色为灰色且细节模糊,主要是在我切换网络摄像头源流后的前 5 - 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 流时,我不会遇到这个问题。
我的管道中是否遗漏了一些重要参数?这是一个缓冲问题吗?我真的不知道如何纠正这个问题。 非常感谢任何帮助。
由于视频流的时间依赖性的性质,您不能只调入流并期望它可以立即解码。正确的解码只能从随机访问点帧(例如 I 或 IDR 帧)开始。在此之前,您将获得依赖于您尚未收到的视频帧的图像数据 - 因此它们看起来会损坏。一些解码器对这些情况下的操作提供了一些控制。 libavdec_h264
例如有一个 output-corrupt
选项。 (但实际上我不知道 "correct" 缺少参考帧的帧的行为)。或者他们可以选择跳过所有内容,直到出现 RAP 帧。这取决于您的具体解码器实现。但是请注意,在任何这些选项上,您看到任何图像之前的初始延迟都会增加。