我正在使用不支持的v4L相机,我需要使用gstreamer将视频流式传输到远程PC 我已经使用Qt和QImages在主机上成功传输了它。 早些时候我问了问题The Use of Multiple JFrames, Good/Bad Practice?
关于如何将外部框架送入gstreamer 我阅读了博客here,并尝试使用gstreamer 1.0实现它,但不知何故它没有按预期工作 所以我想通过gstreamer在相同的网络中但在不同的工作站上流式传输qimages。我想知道是否有人可以给我提供如何使用gstreamer 1.0发送Qimages的起点。我不是要求代码而是要求方向 我对这种多媒体内容很陌生,所以如果你用非专业的语言解释它,我将不胜感激。
提前致谢
答案 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有一些我不知道的简单方法。 :)