我想使用 gstreamer 以 RTP/h.264 格式将图像从多个 Logitech C920 网络摄像头流式传输到 Janus 媒体服务器。网络摄像头生成 h.264 编码的视频流,因此我可以将流发送到 UDP 接收器,而无需重新编码数据,只需对其进行有效载荷。
我正在使用 gst-interpipe 插件在不同的网络摄像头之间切换,这样 Janus 接收到的视频流保持不变,但图像来 self 选择的任何网络摄像头。
它有效,但我遇到了一些破帧问题,其中颜色为灰色且细节模糊,主要是在网络摄像头源流之间切换后的前 5 - 10 秒。之后图像会自行校正。
起初我认为这是一个 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
选项。 (但实际上我不知道它对于只是缺少引用帧的“正确”帧的行为)。或者他们可以选择跳过所有内容,直到出现 RAP 帧。这取决于您的具体解码器实现。但是请注意,在这些选项中的任何一个上,在您看到任何图像之前的初始延迟都会增加。
关于linux - 如何解决通过 gstreamer udpsink 流式传输 h.264 时的图像问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54706610/