Прежде всего, необходимо определить, какой протокол и тип кодировки вы хотите использовать, чтобы передать его через UDP. Я бы рекомендовал h264 по RTP для большинства случаев.
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.
ИЛИ
Возможно QT имеет некоторый простой способ, что я не в курсе. :)