如何通过gstreamer通过udp发送QImages

时间:2015-11-30 22:57:19

标签: qt gstreamer qimage

我正在使用不支持的v4L相机,我需要使用gstreamer将视频流式传输到远程PC 我已经使用Qt和QImages在主机上成功传输了它。 早些时候我问了问题The Use of Multiple JFrames, Good/Bad Practice?

关于如何将外部框架送入gstreamer 我阅读了博客here,并尝试使用gstreamer 1.0实现它,但不知何故它没有按预期工作 所以我想通过gstreamer在相同的网络中但在不同的工作站上流式传输qimages。我想知道是否有人可以给我提供如何使用gstreamer 1.0发送Qimages的起点。我不是要求代码而是要求方向  我对这种多媒体内容很陌生,所以如果你用非专业的语言解释它,我将不胜感激。

提前致谢

1 个答案:

答案 0 :(得分:2)

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

GStreamer提供了大量插件来实现这一目标,包括一个名为gst-launch的命令行实用程序。以下是一些基本的发送/接收命令:

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。

OR

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