如何通过 udp 通过 gstreamer 发送 QImage

how to send QImages via gstreamer over udp

我使用的是不支持的 v4L 相机,我需要使用 gstreamer 将视频流式传输到远程电脑。
我已经使用 Qt 和 QImages 在主机上成功地流式传输它。 之前我问过问题 here

关于如何将外部框架输入 gstreamer。
我阅读了博客 here 并尝试使用 gstreamer 1.0 实现它,但不知何故它没有按预期工作。
所以我想到了在同一网络但在不同工作站上通过 gstreamer 流式传输 qimages。我想知道是否有人可以告诉我如何使用 gstreamer 1.0 发送 Qimages 的起点。我不是要代码,只是一个方向。
我对这种多媒体东西很陌生,所以如果你用通俗易懂的语言解释一下,我将不胜感激。

提前致谢

首先您需要确定要使用哪种协议和编码类型通过 UDP 传输它。在大多数情况下,我建议使用 h264 而不是 RTP。

GStreamer 提供了大量插件来执行此操作,包括名为 gst-launch 的命令行实用程序。以下是一些基本的 send/receive 命令:

gst-launch-1.0 videotestsrc pattern=ball ! video/x-raw,width=1280,height=720 ! videoconvert ! x264enc ! h264parse ! rtph264pay ! udpsink host=localhost port=7777

gst-launch-1.0 udpsrc port=7777 ! rtpbin ! rtph264depay ! decodebin ! videoconvert ! autovideosink

当您编写使用 GStreamer 管道的应用程序时,将帧获取到该管道的最简单方法是使用 appsrc。所以你可能有这样的东西:

const char* pipeline = "appsrc name=mysrc caps=video/x-raw,width=1280,height=720,format=RGB ! videoconvert ! x264enc ! h264parse ! rtph264pay ! udpsink host=localhost port=7777";

GError* error(NULL);
GstElement* bin = gst_parse_bin_from_description(tail_pipe_s.c_str(), true, &error);
if(bin == NULL || error != NULL) {
        ...
}

GstElement* appsrc = gst_bin_get_by_name(GST_BIN(bin), "mysrc");

GstAppSrcCallbacks* appsrc_callbacks = (GstAppSrcCallbacks*)malloc(sizeof(GstAppSrcCallbacks));
memset(appsrc_callbacks, 0, sizeof(GstAppSrcCallbacks));
appsrc_callbacks->need_data = need_buffers;
appsrc_callbacks->enough_data = enough_buffers;
gst_app_src_set_callbacks(GST_APP_SRC(appsrc), appsrc_callbacks, (gpointer)your_data, free);

gst_object_unref(appsrc);

然后在后台线程中调用 gst_app_src_push_buffer,这将涉及从 QImage 读取原始数据并将其转换为 GstBuffer。

也许 QT 有一些我不知道的更简单的方法。 :)