linux - 如何解决通过 gstreamer udpsink 流式传输 h.264 时的图像问题

标签 linux video-streaming gstreamer h.264

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

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

它有效,但我遇到了一些破帧问题,其中颜色为灰色且细节模糊,主要是在网络摄像头源流之间切换后的前 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 选项。 (但实际上我不知道它对于只是缺少引用帧的“正确”帧的行为)。或者他们可以选择跳过所有内容,直到出现 RAP 帧。这取决于您的具体解码器实现。但是请注意,在这些选项中的任何一个上,在您看到任何图像之前的初始延迟都会增加。

关于linux - 如何解决通过 gstreamer udpsink 流式传输 h.264 时的图像问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54706610/

相关文章:

python - 可以在控制台中使用 Kafka 消息但不能使用 Python 库吗?

linux - Go 导致 OpenGL 与 time.Tick 但不是 time.After 发生段错误

asp.net-core - 使用 .NET Core Blazor 将(实时)视频从服务器流式传输到客户端

video-streaming - 如何使用 Shaka Player 播放多个分辨率的视频?

python - 能否在服务器端使用 Gstreamer 按需将音频流式传输到多个客户端?

python - 使用 scapy 和 IP 获取 MAC

ios - 使用 Apple 的 HTTP Live Streaming 播放视频时如何避免出现纯音频屏幕?

c++ - 使用 GStreamer 和 multiudpsink 设置不同的 RTP SSRC

android - GStreamer 通过 HTTPS 视频流传输 RTSP

linux - 如何调用 BASH 中的程序执行的大量配对文件?