本文介绍的编译方法基于7.0.2版本
安装Java编译环境
安装JDK
apt install openjdk-11-jdk
安装Maven
apt install maven
安装编译依赖库
apt install -y libjsoncpp-dev libboost-all-dev libsigc++-2.0-dev libglibmm-2.4-dev libvpx-dev libsoup2.4-dev libnice-dev libssl-dev libwebsocketpp-dev
安装运行依赖库
apt install gstreamer1.0-nice
源码下载
git clone https://gh-proxy.com/https://github.com/Kurento/kurento.git
更新子Module
cd kurento/server
git submodule update --init --recursive
修改代码
- 在server/module-elements/src/gst-plugins/webrtcendpoint/kmswebrtctransportsink.c和server/module-elements/src/gst-plugins/webrtcendpoint/kmswebrtctransportsrc.c文件中注释或者删除compare_factory_names和gst_bin_iterate_all_by_element_factory_name函数。
// {{{{ FIXME: This can be deleted when we start using GStreamer >=1.18 for Kurento.
// Code sourced from GStreamer/gstbin.c >=1.18
//
// https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/10f72da5040b74678c8f81723971127ee8bee04f/subprojects/gstreamer/gst/gstbin.c#L4526-4537
// static gint
// compare_factory_names (const GValue *velement, GValue *factory_name_val)
// {
// GstElement *element = g_value_get_object (velement);
// GstElementFactory *factory = gst_element_get_factory (element);
// const gchar *factory_name = g_value_get_string (factory_name_val);
// if (factory == NULL)
// return -1;
// return g_strcmp0 (GST_OBJECT_NAME (factory), factory_name);
// }
// //
// // https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/10f72da5040b74678c8f81723971127ee8bee04f/subprojects/gstreamer/gst/gstbin.c#L4553-4574
// static GstIterator *
// gst_bin_iterate_all_by_element_factory_name (GstBin *bin,
// const gchar *factory_name)
// {
// GstIterator *children;
// GstIterator *result;
// GValue factory_name_val = G_VALUE_INIT;
// g_return_val_if_fail (GST_IS_BIN (bin), NULL);
// g_return_val_if_fail (factory_name && *factory_name, NULL);
// g_value_init (&factory_name_val, G_TYPE_STRING);
// g_value_set_string (&factory_name_val, factory_name);
// children = gst_bin_iterate_recurse (bin);
// result = gst_iterator_filter (children, (GCompareFunc)compare_factory_names,
// &factory_name_val);
// g_value_unset (&factory_name_val);
// return result;
// }
// }}}}
- 在server/media-server/3rdparty/DeathHandler/death_handler.cc文件中,将__arm__改为__aarch64__,并将uc->uc_mcontext.arm_pc改为uc->uc_mcontext.pc。
// Overwrite sigaction with caller's address
#ifdef __linux__
#if defined(__aarch64__)
trace[1] = reinterpret_cast<void *>(uc->uc_mcontext.pc);
#else
#if !defined(__i386__) && !defined(__x86_64__)
#error Only ARM64, x86 and x86-64 are supported
#endif
#if defined(__x86_64__)
trace[1] = reinterpret_cast<void *>(uc->uc_mcontext.gregs[REG_RIP]);
#else
trace[1] = reinterpret_cast<void *>(uc->uc_mcontext.gregs[REG_EIP]);
#endif
#endif
开始编译和运行
bin/build-run.sh