1.修改相关.cmake文件

CMake版本: cmake version 4.1.0
Toolchain.cmake修改如下

Qt6LinguistToolsMacros.cmake
注释掉下图所示:

FindGStreamer.cmake
修改如下:
增加iOS平台GStreamer链接目录

去掉GStreamer.pkg自动下载,改为手动下载
bash
https://gstreamer.freedesktop.org/data/pkg/ios/1.26.5/gstreamer-1.0-devel-1.26.5-ios-universal.pkg

变改版本为1.26.5

手动下载操作如下:
注意,每次重新生成是8b4033e03c4b5c34fb69a23b329505847f91858d这个guid是会变的,需要重新命名为最新的
下载好pkg

重命名为gstreamer.pkg

手动解压到Payload文件中

解压gstreamer-1.0-devel-1.22.12-ios-universal.pkg到gstreamer-pkg-expanded中
bash
pkgutil --expand gstreamer.pkg gstreamer-pkg-expanded

进入gstreamer-pkg-expanded解压ios-framework-1.22.12-universal.pkg
bash
mkdir Payload
cd Payload
cat ios-framework-1.22.12-universal.pkg/Payload | gunzip | cpio -i
修改后的FindGStreamer.cmake
路径: ~/Desktop/qgroundcontrol/cmake/find-modules/FindGStreamer.cmake
bash
if(NOT DEFINED GStreamer_FIND_VERSION)
if(LINUX)
set(GStreamer_FIND_VERSION 1.20)
else()
#set(GStreamer_FIND_VERSION 1.22.12)
set(GStreamer_FIND_VERSION 1.26.5)
endif()
endif()
if(NOT DEFINED GStreamer_ROOT_DIR)
if(DEFINED GSTREAMER_ROOT)
set(GStreamer_ROOT_DIR ${GSTREAMER_ROOT})
elseif(DEFINED GStreamer_ROOT)
set(GStreamer_ROOT_DIR ${GStreamer_ROOT})
endif()
if(DEFINED GStreamer_ROOT_DIR AND NOT EXISTS "${GStreamer_ROOT_DIR}")
message(STATUS "The user provided GStreamer directory does not exist: ${GStreamer_ROOT_DIR}")
endif()
endif()
if(NOT DEFINED GStreamer_USE_STATIC_LIBS)
if(ANDROID OR IOS)
set(GStreamer_USE_STATIC_LIBS ON)
else()
set(GStreamer_USE_STATIC_LIBS OFF)
endif()
endif()
if(NOT DEFINED GStreamer_USE_FRAMEWORK)
if(APPLE)
set(GStreamer_USE_FRAMEWORK ON)
else()
set(GStreamer_USE_FRAMEWORK OFF)
endif()
endif()
################################################################################
set(PKG_CONFIG_ARGN)
if(WIN32)
if(NOT DEFINED GStreamer_ROOT_DIR)
if(DEFINED ENV{GSTREAMER_1_0_ROOT_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_X86_64}")
set(GStreamer_ROOT_DIR "$ENV{GSTREAMER_1_0_ROOT_X86_64}")
elseif(MSVC AND DEFINED ENV{GSTREAMER_1_0_ROOT_MSVC_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_MSVC_X86_64}")
set(GStreamer_ROOT_DIR "$ENV{GSTREAMER_1_0_ROOT_MSVC_X86_64}")
elseif(MINGW AND DEFINED ENV{GSTREAMER_1_0_ROOT_MINGW_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_MINGW_X86_64}")
set(GStreamer_ROOT_DIR "$ENV{GSTREAMER_1_0_ROOT_MINGW_X86_64}")
elseif(EXISTS "C:/Program Files/gstreamer/1.0/msvc_x86_64")
set(GStreamer_ROOT_DIR "C:/Program Files/gstreamer/1.0/msvc_x86_64")
elseif(EXISTS "C:/gstreamer/1.0/msvc_x86_64")
set(GStreamer_ROOT_DIR "C:/gstreamer/1.0/msvc_x86_64")
endif()
endif()
cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)
if(NOT EXISTS "${GStreamer_ROOT_DIR}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")
set(ENV{PKG_CONFIG} "${GStreamer_ROOT_DIR}/bin")
set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config.exe")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig;${GSTREAMER_PLUGIN_PATH}/pkgconfig;$ENV{PKG_CONFIG_PATH}")
list(APPEND PKG_CONFIG_ARGN
--dont-define-prefix
--define-variable=prefix=${GStreamer_ROOT_DIR}
--define-variable=libdir=${GSTREAMER_LIB_PATH}
--define-variable=includedir=${GSTREAMER_INCLUDE_PATH}
)
elseif(LINUX)
if(NOT DEFINED GStreamer_ROOT_DIR)
if(EXISTS "/usr")
set(GStreamer_ROOT_DIR "/usr")
endif()
endif()
cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)
if(NOT EXISTS "${GStreamer_ROOT_DIR}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
if((EXISTS "${GStreamer_ROOT_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu" ) AND (EXISTS "${GStreamer_ROOT_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/gstreamer-1.0"))
set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu")
elseif(EXISTS "${GStreamer_ROOT_DIR}/lib")
set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")
else()
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
elseif(ANDROID)
if(QGC_CUSTOM_GST_PACKAGE)
set(_gst_android_url "https://qgroundcontrol.s3.us-west-2.amazonaws.com/android-gstreamer/qgc-android-gstreamer-${GStreamer_FIND_VERSION}.tar.xz")
else()
set(_gst_android_url "https://gstreamer.freedesktop.org/data/pkg/android/${GStreamer_FIND_VERSION}/gstreamer-1.0-android-universal-${GStreamer_FIND_VERSION}.tar.xz")
# https://gstreamer.freedesktop.org/data/pkg/android/${GStreamer_FIND_VERSION}/gstreamer-1.0-android-universal-${GStreamer_FIND_VERSION}.tar.xz.sha256sum
# set(_gst_android_url_hash "be92cf477d140c270b480bd8ba0e26b1e01c8db042c46b9e234d87352112e485")
endif()
CPMAddPackage(
NAME gstreamer
VERSION ${GStreamer_FIND_VERSION}
URL ${_gst_android_url}
# URL_HASH ${_gst_android_url_hash}
)
if(NOT DEFINED GStreamer_ROOT_DIR)
if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a")
set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/armv7")
elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")
set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/arm64")
elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86")
set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/x86")
elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64")
set(GStreamer_ROOT_DIR "${gstreamer_SOURCE_DIR}/x86_64")
endif()
endif()
cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)
if(NOT EXISTS "${GStreamer_ROOT_DIR}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")
set(ENV{PKG_CONFIG_PATH} "")
if(CMAKE_HOST_WIN32)
set(ENV{PKG_CONFIG} "${GStreamer_ROOT_DIR}/share/gst-android/ndk-build/tools/windows")
set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config.exe")
set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_LIB_PATH}/pkgconfig;${GSTREAMER_PLUGIN_PATH}/pkgconfig")
list(APPEND PKG_CONFIG_ARGN --dont-define-prefix)
elseif(CMAKE_HOST_UNIX)
set(ENV{PKG_CONFIG_LIBDIR} "${GSTREAMER_LIB_PATH}/pkgconfig:${GSTREAMER_PLUGIN_PATH}/pkgconfig")
endif()
list(APPEND PKG_CONFIG_ARGN
--define-variable=prefix=${GStreamer_ROOT_DIR}
--define-variable=libdir=${GSTREAMER_LIB_PATH}
--define-variable=includedir=${GSTREAMER_INCLUDE_PATH}
)
elseif(MACOS)
if(NOT DEFINED GStreamer_ROOT_DIR)
if(EXISTS "/Library/Frameworks/GStreamer.framework")
set(GStreamer_ROOT_DIR "/Library/Frameworks/GStreamer.framework/Versions/1.0")
elseif(EXISTS "/opt/homebrew/opt/gstreamer")
set(GStreamer_ROOT_DIR "/opt/homebrew/opt/gstreamer")
elseif(EXISTS "/usr/local/opt/gstreamer")
set(GStreamer_ROOT_DIR "/usr/local/opt/gstreamer")
endif()
endif()
cmake_path(CONVERT "${GStreamer_ROOT_DIR}" TO_CMAKE_PATH_LIST GStreamer_ROOT_DIR NORMALIZE)
if(NOT EXISTS "${GStreamer_ROOT_DIR}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
if(GStreamer_USE_FRAMEWORK)
set(GSTREAMER_FRAMEWORK_PATH "${GStreamer_ROOT_DIR}/../..")
endif()
set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include")
set(GSTREAMER_LIB_PATH "${GStreamer_ROOT_DIR}/lib")
#set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/gstreamer-1.0")
set(GSTREAMER_PLUGIN_PATH "${GSTREAMER_LIB_PATH}/libexec/gstreamer-1.0")
message("GStreamer_ROOT_DIR: ${GStreamer_ROOT_DIR}")
message("GSTREAMER_FRAMEWORK_PATH: ${GSTREAMER_FRAMEWORK_PATH}")
message("GSTREAMER_INCLUDE_PATH: ${GSTREAMER_INCLUDE_PATH}")
message("GSTREAMER_LIB_PATH: ${GSTREAMER_LIB_PATH}")
message("GSTREAMER_PLUGIN_PATH: ${GSTREAMER_PLUGIN_PATH}")
set(ENV{PKG_CONFIG} "${GStreamer_ROOT_DIR}/bin")
set(PKG_CONFIG_EXECUTABLE "$ENV{PKG_CONFIG}/pkg-config")
set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:${GSTREAMER_PLUGIN_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
list(APPEND PKG_CONFIG_ARGN
--dont-define-prefix
--define-variable=prefix=${GStreamer_ROOT_DIR}
--define-variable=libdir=${GSTREAMER_LIB_PATH}
--define-variable=includedir=${GSTREAMER_INCLUDE_PATH}
)
if(NOT EXISTS "${GStreamer_ROOT_DIR}" OR NOT EXISTS "${GSTREAMER_LIB_PATH}" OR NOT EXISTS "${GSTREAMER_PLUGIN_PATH}" OR NOT EXISTS "${GSTREAMER_INCLUDE_PATH}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
elseif(IOS)
#message(FATAL_ERROR "GStreamer for iOS is Currently Unsupported.")
CPMAddPackage(
NAME gstreamer
VERSION ${GStreamer_FIND_VERSION}
URL "https://gstreamer.freedesktop.org/data/pkg/ios/${GStreamer_FIND_VERSION}/gstreamer-1.0-devel-${GStreamer_FIND_VERSION}-ios-universal.pkg"
)
set(GST_PKG_FILE "${gstreamer_SOURCE_DIR}/gstreamer.pkg")
set(GST_EXPAND_DIR "${gstreamer_SOURCE_DIR}/gstreamer-pkg-expanded")
set(GST_PAYLOAD_DIR "${GST_EXPAND_DIR}/Payload")
#file(MAKE_DIRECTORY "${GST_EXPAND_DIR}") #new version pkgutil auto create it
execute_process(
#COMMAND pkgutil --expand-full "${GST_PKG_FILE}" "${GST_EXPAND_DIR}"
#COMMAND pkgutil --expand "${GST_PKG_FILE}" "${GST_EXPAND_DIR}"
COMMAND pwd
COMMAND ls ${GST_EXPAND_DIR}
RESULT_VARIABLE _pkgutil_rc
)
if(NOT _pkgutil_rc EQUAL 0)
message(FATAL_ERROR "pkgutil failed to expand GStreamer .pkg")
endif()
execute_process(
#COMMAND xar -xf "${GST_EXPAND_DIR}/gstreamer-1.0-devel-${GStreamer_FIND_VERSION}-ios-universal.pkg/Payload"
# --directory "${GST_PAYLOAD_DIR}"
#COMMAND mkdir Payload
#COMMAND cd Payload
#COMMAND cat "${GST_EXPAND_DIR}/ios-framework-${GStreamer_FIND_VERSION}-universal.pkg/Payload" | gunzip | cpio -i
COMMAND ls ${GST_PAYLOAD_DIR}
RESULT_VARIABLE _xar_rc
)
if(NOT _xar_rc EQUAL 0)
message(FATAL_ERROR "xar failed to extract GStreamer Payload")
endif()
# set(GSTREAMER_FRAMEWORK_PATH "/Library/Developer/GStreamer/iPhone.sdk" CACHE PATH "Path of GStreamer.Framework")
# set(GSTREAMER_FRAMEWORK_PATH "${GST_PAYLOAD_DIR}/usr/local/Frameworks/GStreamer.framework")
set(GSTREAMER_FRAMEWORK_PATH "${GST_PAYLOAD_DIR}/GStreamer.framework")
set(GStreamer_ROOT_DIR "${GSTREAMER_FRAMEWORK_PATH}/Versions/1.0")
if(NOT EXISTS "${GStreamer_ROOT_DIR}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_FRAMEWORK_PATH}/Headers")
endif()
if(GStreamer_USE_FRAMEWORK AND NOT EXISTS "${GSTREAMER_FRAMEWORK_PATH}")
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
################################################################################
if(GStreamer_USE_STATIC_LIBS)
set(GSTREAMER_EXTRA_DEPS
gstreamer-base-1.0
gstreamer-video-1.0
gstreamer-gl-1.0
gstreamer-gl-prototypes-1.0
gstreamer-rtsp-1.0
# gstreamer-gl-egl-1.0
# gstreamer-gl-wayland-1.0
# gstreamer-gl-x11-1.0
)
set(GSTREAMER_PLUGINS
coreelements
dav1d
isomp4
libav
matroska
mpegtsdemux
opengl
openh264
playback
rtp
rtpmanager
rtsp
sdpelem
tcp
typefindfunctions
udp
videoparsersbad
vpx
)
if(ANDROID)
list(APPEND GSTREAMER_PLUGINS androidmedia) # vulkan
elseif(APPLE)
list(APPEND GSTREAMER_PLUGINS applemedia vulkan)
elseif(WIN32)
list(APPEND GSTREAMER_PLUGINS d3d d3d11 d3d12 dxva nvcodec)
elseif(LINUX)
list(APPEND GSTREAMER_PLUGINS nvcodec qsv va vulkan) # qml6 - GStreamer provided qml6 is xcb only
endif()
endif()
if(ANDROID)
set(GStreamer_Mobile_MODULE_NAME gstreamer_android)
set(G_IO_MODULES openssl)
set(G_IO_MODULES_PATH "${GStreamer_ROOT_DIR}/lib/gio/modules")
set(GStreamer_NDK_BUILD_PATH "${GStreamer_ROOT_DIR}/share/gst-android/ndk-build/")
set(GSTREAMER_ANDROID_MODULE_NAME gstreamer_android)
set(GSTREAMER_JAVA_SRC_DIR "${CMAKE_BINARY_DIR}/android-build-${CMAKE_PROJECT_NAME}/src")
set(GSTREAMER_ASSETS_DIR "${CMAKE_BINARY_DIR}/android-build-${CMAKE_PROJECT_NAME}/assets")
configure_file(
"${GStreamer_NDK_BUILD_PATH}/gstreamer_android-1.0.c.in"
"${GStreamer_Mobile_MODULE_NAME}.c"
)
endif()
################################################################################
if(GStreamer_USE_FRAMEWORK)
list(APPEND CMAKE_FRAMEWORK_PATH "${GSTREAMER_FRAMEWORK_PATH}")
endif()
if(GStreamer_USE_STATIC_LIBS)
list(APPEND PKG_CONFIG_ARGN "--static")
endif()
find_package(PkgConfig REQUIRED QUIET)
list(PREPEND CMAKE_PREFIX_PATH ${GStreamer_ROOT_DIR})
if(LINUX)
pkg_check_modules(PC_GSTREAMER REQUIRED gstreamer-1.0>=${GStreamer_FIND_VERSION})
else()
pkg_check_modules(PC_GSTREAMER REQUIRED gstreamer-1.0=${GStreamer_FIND_VERSION})
endif()
set(GStreamer_VERSION "${PC_GSTREAMER_VERSION}")
################################################################################
function(find_gstreamer_component component pkgconfig_name)
set(target GStreamer::${component})
if(NOT TARGET ${target})
string(TOUPPER ${component} upper)
pkg_check_modules(PC_GSTREAMER_${upper} IMPORTED_TARGET ${pkgconfig_name})
if(TARGET PkgConfig::PC_GSTREAMER_${upper})
qt_add_library(GStreamer::${component} INTERFACE IMPORTED)
target_link_libraries(GStreamer::${component} INTERFACE PkgConfig::PC_GSTREAMER_${upper})
if("PC_GSTREAMER_${upper}" MATCHES "PC_GSTREAMER_GL")
get_target_property(_qt_incs PkgConfig::PC_GSTREAMER_GL INTERFACE_INCLUDE_DIRECTORIES)
set(__qt_fixed_incs)
foreach(path IN LISTS _qt_incs)
if(IS_DIRECTORY "${path}")
list(APPEND __qt_fixed_incs "${path}")
endif()
endforeach()
set_property(TARGET PkgConfig::PC_GSTREAMER_GL PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${__qt_fixed_incs}")
endif()
endif()
endif()
if(TARGET ${target})
set(GStreamer_${component}_FOUND TRUE PARENT_SCOPE)
endif()
endfunction()
################################################################################
find_gstreamer_component(Core gstreamer-1.0)
find_gstreamer_component(Base gstreamer-base-1.0)
find_gstreamer_component(Video gstreamer-video-1.0)
find_gstreamer_component(Gl gstreamer-gl-1.0)
find_gstreamer_component(GlPrototypes gstreamer-gl-prototypes-1.0)
find_gstreamer_component(Rtsp gstreamer-rtsp-1.0)
################################################################################
if(GlEgl IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(GlEgl gstreamer-gl-egl-1.0)
endif()
if(GlWayland IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(GlWayland gstreamer-gl-wayland-1.0)
endif()
if(GlX11 IN_LIST GStreamer_FIND_COMPONENTS)
find_gstreamer_component(GlX11 gstreamer-gl-x11-1.0)
endif()
################################################################################
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GStreamer
VERSION_VAR GStreamer_VERSION
HANDLE_COMPONENTS
)
if(GStreamer_FOUND AND NOT TARGET GStreamer::GStreamer)
qt_add_library(GStreamer::GStreamer INTERFACE IMPORTED)
if(GStreamer_USE_STATIC_LIBS)
target_compile_definitions(GStreamer::GStreamer INTERFACE QGC_GST_STATIC_BUILD)
endif()
if(APPLE AND GStreamer_USE_FRAMEWORK)
message("===>GSTREAMER_FRAMEWORK_PATH: ${GSTREAMER_FRAMEWORK_PATH}")
set(CMAKE_FIND_FRAMEWORK ONLY)
find_library(GSTREAMER_FRAMEWORK GStreamer
PATHS
"${GSTREAMER_FRAMEWORK_PATH}"
"/Library/Frameworks"
"/usr/local/opt/gstreamer"
"/opt/homebrew/opt/gstreamer"
NO_DEFAULT_PATH
)
unset(CMAKE_FIND_FRAMEWORK)
message("===>GSTREAMER_FRAMEWORK: ${GSTREAMER_FRAMEWORK}")
if(IOS)
target_link_libraries(GStreamer::GStreamer INTERFACE ${GSTREAMER_FRAMEWORK_PATH})
target_include_directories(GStreamer::GStreamer INTERFACE "${GSTREAMER_FRAMEWORK_PATH}/Headers")
return()
endif()
if(MACOS)
if(GSTREAMER_FRAMEWORK)
target_link_libraries(GStreamer::GStreamer INTERFACE ${GSTREAMER_FRAMEWORK})
target_include_directories(GStreamer::GStreamer INTERFACE "${GSTREAMER_FRAMEWORK}/Headers")
if(MACOS)
target_compile_definitions(GStreamer::GStreamer INTERFACE QGC_GST_MACOS_FRAMEWORK)
endif()
return()
else()
message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables")
endif()
endif()
elseif(ANDROID)
target_link_options(GStreamer::GStreamer INTERFACE "-Wl,-Bsymbolic")
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
target_link_options(GStreamer::GStreamer INTERFACE "-Wl,-z,notext")
endif()
endif()
target_link_directories(GStreamer::GStreamer INTERFACE ${GSTREAMER_LIB_PATH})
target_link_libraries(GStreamer::GStreamer
INTERFACE
GStreamer::Core
GStreamer::Base
GStreamer::Video
GStreamer::Gl
GStreamer::GlPrototypes
GStreamer::Rtsp
)
foreach(component IN LISTS GStreamer_FIND_COMPONENTS)
if(GStreamer_${component}_FOUND)
target_link_libraries(GStreamer::GStreamer INTERFACE GStreamer::${component})
endif()
endforeach()
################################################################################
if(GStreamer_USE_STATIC_LIBS)
qt_add_library(GStreamer::Plugins INTERFACE IMPORTED)
target_link_directories(GStreamer::Plugins INTERFACE ${GSTREAMER_PLUGIN_PATH})
foreach(plugin IN LISTS GSTREAMER_PLUGINS)
pkg_check_modules(GST_PLUGIN_${plugin} QUIET IMPORTED_TARGET gst${plugin})
if(GST_PLUGIN_${plugin}_FOUND)
target_link_libraries(GStreamer::Plugins INTERFACE PkgConfig::GST_PLUGIN_${plugin})
else()
find_library(GST_PLUGIN_${plugin}_LIBRARY
NAMES gst${plugin}
PATHS
${GSTREAMER_LIB_PATH}
${GSTREAMER_PLUGIN_PATH}
)
if(GST_PLUGIN_${plugin}_LIBRARY)
target_link_libraries(GStreamer::Plugins INTERFACE ${GST_PLUGIN_${plugin}_LIBRARY})
set(GST_PLUGIN_${plugin}_FOUND TRUE)
endif()
endif()
if(GST_PLUGIN_${plugin}_FOUND)
target_compile_definitions(GStreamer::Plugins INTERFACE GST_PLUGIN_${plugin}_FOUND)
endif()
endforeach()
target_link_libraries(GStreamer::GStreamer INTERFACE GStreamer::Plugins)
endif()
endif()
修改后的CMakeLists.txt
路径: ~/Desktop/qgroundcontrol/src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt
bash
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(${CMAKE_PROJECT_NAME} PRIVATE VideoItemStub.h)
if(QGC_ENABLE_GST_VIDEOSTREAMING)
if(NOT MACOS)
# Using FindGStreamer.cmake is currently bypassed on MACOS since it doesn't work
# So for now we hack in a simple hardwired setup which does work
find_package(GStreamer
REQUIRED
COMPONENTS Core Base Video Gl GlPrototypes Rtsp
#OPTIONAL_COMPONENTS GlEgl GlWayland GlX11
)
endif()
add_subdirectory(gstqml6gl)
# TODO: https://gstreamer.freedesktop.org/documentation/qt6d3d11/index.html#qml6d3d11sink-page
endif()
if(TARGET gstqml6gl)
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE gstqml6gl)
target_sources(${CMAKE_PROJECT_NAME}
PRIVATE
GStreamer.cc
GStreamer.h
GStreamerHelpers.cc
GStreamerHelpers.h
GstVideoReceiver.cc
GstVideoReceiver.h
)
add_subdirectory(gstqgc)
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_GST_STREAMING)
if(LINUX)
install(
DIRECTORY
"${GSTREAMER_PLUGIN_PATH}"
"${GSTREAMER_LIB_PATH}/gio"
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
FILES_MATCHING
PATTERN "*.so"
PATTERN "*.so.*"
PATTERN "*/include" EXCLUDE
)
install(
DIRECTORY "${GSTREAMER_LIB_PATH}/gstreamer1.0"
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
FILE_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
FILES_MATCHING
PATTERN "gst-*"
)
elseif(WIN32)
install(
DIRECTORY "${GStreamer_ROOT_DIR}/bin/"
DESTINATION "${CMAKE_INSTALL_BINDIR}"
FILES_MATCHING
PATTERN "*.dll"
)
install(
DIRECTORY "${GSTREAMER_LIB_PATH}/gio/modules/"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/gio/modules"
FILES_MATCHING
PATTERN "*.dll"
)
install(
DIRECTORY "${GSTREAMER_PLUGIN_PATH}/"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/gstreamer-1.0"
FILES_MATCHING
PATTERN "*.dll"
)
install(
DIRECTORY "${GStreamer_ROOT_DIR}/libexec/gstreamer-1.0/"
DESTINATION "${CMAKE_INSTALL_LIBEXECDIR}/gstreamer-1.0"
FILE_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
FILES_MATCHING
PATTERN "*.exe"
)
elseif(MACOS)
if(GSTREAMER_FRAMEWORK)
install(
DIRECTORY "${GSTREAMER_FRAMEWORK}"
DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}.app/Contents/Frameworks"
PATTERN "*.la" EXCLUDE
PATTERN "*.a" EXCLUDE
PATTERN "*/bin" EXCLUDE
PATTERN "*/etc" EXCLUDE
PATTERN "*/gst-validate-launcher" EXCLUDE
PATTERN "*/Headers" EXCLUDE
PATTERN "*/include" EXCLUDE
PATTERN "*/pkgconfig" EXCLUDE
PATTERN "*/share" EXCLUDE
)
endif()
endif()
endif()
Qt6LinguistToolsMacros.cmake
路径: ~/Qt/6.8.3/macos/lib/cmake/Qt6LinguistTools/Qt6LinguistToolsMacros.cmake
修改后的CustomOptions.cmake
bash
include(CMakeDependentOption)
# The following options can be overriden by custom builds using the CustomOverrides.cmake file
# App
set(QGC_APP_NAME "QGroundControl" CACHE STRING "App Name")
set(QGC_APP_COPYRIGHT "Copyright (c) 2025 QGroundControl. All rights reserved." CACHE STRING "Copyright")
set(QGC_APP_DESCRIPTION "Open Source Ground Control App" CACHE STRING "Description")
set(QGC_ORG_NAME "QGroundControl" CACHE STRING "Org Name")
set(QGC_ORG_DOMAIN "qgroundcontrol.com" CACHE STRING "Domain")
set(QGC_PACKAGE_NAME "org.mavlink.qgroundcontrol" CACHE STRING "Package Name")
set(QGC_SETTINGS_VERSION "9" CACHE STRING "Settings Version") # If you need to make an incompatible changes to stored settings, bump this version number up by 1. This will caused store settings to be cleared on next boot.
# Build
option(BUILD_SHARED_LIBS "Build using shared libraries" OFF)
option(QGC_STABLE_BUILD "Stable Build" OFF)
option(QGC_USE_CACHE "Use Build Caching" ON)
option(QGC_BUILD_INSTALLER "Build Installer" ON)
cmake_dependent_option(QGC_BUILD_TESTING "Enable testing" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
cmake_dependent_option(QGC_DEBUG_QML "Build QGroundControl with QML debugging/profiling support." ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF)
# Features
option(QGC_UTM_ADAPTER "Enable UTM Adapter" OFF)
option(QGC_VIEWER3D "Enable Viewer3D" ON) # Qt6Quick3D_FOUND
# option(QGC_DISABLE_MAVLINK_INSPECTOR "Disable Mavlink Inspector" OFF) # This removes QtCharts which is GPL licensed
# Comms
option(QGC_ENABLE_BLUETOOTH "Enable Bluetooth Links" ON) # Qt6Bluetooth_FOUND
option(QGC_ZEROCONF_ENABLED "Enable ZeroConf Compatibility" OFF)
option(QGC_AIRLINK_DISABLED "Disable AIRLink" ON)
option(QGC_NO_SERIAL_LINK "Disable Serial Links" OFF) # NOT IOS AND Qt6SerialPort_FOUND
# Video
option(QGC_ENABLE_UVC "Enable UVC Devices" ON) # Qt6Multimedia_FOUND
option(QGC_ENABLE_GST_VIDEOSTREAMING "Enable GStreamer Video Backend" ON)
cmake_dependent_option(QGC_CUSTOM_GST_PACKAGE "Enable Using QGC Provided Custom GStreamer Packages" OFF "QGC_ENABLE_GST_VIDEOSTREAMING" OFF)
option(QGC_ENABLE_QT_VIDEOSTREAMING "Enable QtMultimedia Video Backend" ON) # Qt6Multimedia_FOUND
# Joystick
# set(SDL_GAMECONTROLLERCONFIG "0300000009120000544f000011010000,OpenTX Radiomaster TX16S Joystick,leftx:a3,lefty:a2,rightx:a0,righty:a1,platform:Linux" CACHE STRING "Custom SDL Joystick Mappings")
# MAVLink
set(QGC_MAVLINK_GIT_REPO "https://github.com/mavlink/c_library_v2.git" CACHE STRING "URL to MAVLink Git Repo")
set(QGC_MAVLINK_GIT_TAG "19f9955598af9a9181064619bd2e3c04bd2d848a" CACHE STRING "Tag of MAVLink Git Repo")
# APM
option(QGC_DISABLE_APM_MAVLINK "Disable APM Dialect" OFF)
option(QGC_DISABLE_APM_PLUGIN "Disable APM Plugin" OFF)
option(QGC_DISABLE_APM_PLUGIN_FACTORY "Disable APM Plugin Factory" OFF)
# PX4
option(QGC_DISABLE_PX4_PLUGIN "Disable PX4 Plugin" OFF)
option(QGC_DISABLE_PX4_PLUGIN_FACTORY "Disable PX4 Plugin Factory" OFF)
# Android
set(QGC_QT_ANDROID_TARGET_SDK_VERSION "36" CACHE STRING "Android Target SDK Version")
set(QGC_ANDROID_PACKAGE_NAME "${QGC_PACKAGE_NAME}" CACHE STRING "Android Package Name")
set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/android" CACHE PATH "Android Package Path")
set(QT_ANDROID_DEPLOYMENT_TYPE "" CACHE STRING "Forces Signing if Set to Release")
option(QT_ANDROID_SIGN_APK "Enable Signing APK" OFF)
option(QT_ANDROID_SIGN_AAB "Enable Signing AAB" OFF)
option(QT_USE_TARGET_ANDROID_BUILD_DIR "Use Target Android Build Dir" OFF)
set(QGC_QT_MINIMUM_VERSION "6.8.3" CACHE STRING "Minimum Supported Qt Version")
set(QGC_QT_MAXIMUM_VERSION "6.8.3" CACHE STRING "Maximum Supported Qt Version")
set(QGC_QT_ANDROID_MIN_SDK_VERSION "28" CACHE STRING "Android Min SDK Version")
# MacOS
set(QGC_MACOS_PLIST_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/MacOSXBundleInfo.plist.in" CACHE FILEPATH "MacOS PList Path")
set(QGC_MACOS_BUNDLE_ID "${QGC_PACKAGE_NAME}" CACHE STRING "MacOS Bundle ID")
set(QGC_MACOS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.icns" CACHE FILEPATH "MacOS Icon Path")
set(QGC_MACOS_ENTITLEMENTS_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.entitlements" CACHE FILEPATH "MacOS Entitlements Path")
option(QGC_MACOS_UNIVERSAL_BUILD "Build MacOS Universal Build (arm64;x86_64)" ON)
# Linux
option(QGC_CREATE_APPIMAGE "Build an AppImage after build" ON)
set(QGC_APPIMAGE_ICON_256_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl_256.png" CACHE FILEPATH "AppImage Icon 256x256 Path")
set(QGC_APPIMAGE_ICON_SCALABLE_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl.svg" CACHE FILEPATH "AppImage Icon SVG Path")
set(QGC_APPIMAGE_APPRUN_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/AppRun" CACHE FILEPATH "AppImage AppRun Path")
set(QGC_APPIMAGE_DESKTOP_ENTRY_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop.in" CACHE FILEPATH "AppImage Desktop Entry Path")
set(QGC_APPIMAGE_METADATA_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.appdata.xml.in" CACHE FILEPATH "AppImage Metadata Path")
set(QGC_APPIMAGE_APPDATA_DEVELOPER "qgroundcontrol" CACHE STRING "AppImage Metadata Developer")
# Windows
set(QGC_WINDOWS_INSTALL_HEADER_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/installheader.bmp" CACHE FILEPATH "Windows Install Header Path")
set(QGC_WINDOWS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/WindowsQGC.ico" CACHE FILEPATH "Windows Icon Path")
set(QGC_WINDOWS_RESOURCE_FILE_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/QGroundControl.rc" CACHE FILEPATH "Windows Resource File Path")
# CPM
set(QGC_CPM_SOURCE_CACHE "" CACHE PATH "Directory to Download CPM Dependencies, Overrides CPM_SOURCE_CACHE Env Variable")
# set(CPM_USE_NAMED_CACHE_DIRECTORIES ON CACHE BOOL "Use additional directory of package name in cache on the most nested level.")
# Qt
set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml" CACHE PATH "Install path for QML")
set(QML_IMPORT_PATH "${QT_QML_OUTPUT_DIRECTORY}" CACHE STRING "Extra QML Import Paths")
option(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING "Silence Missing Dependency Warnings" OFF)
option(QT_ENABLE_VERBOSE_DEPLOYMENT "Verbose Deployment" ON)
option(QT_DEBUG_FIND_PACKAGE "Print Used Search Paths When a Package is Not Found" ON)
option(QT_QML_GENERATE_QMLLS_INI "https://doc.qt.io/qt-6/cmake-variable-qt-qml-generate-qmlls-ini.html" ON)
# set(ENV{QT_DEBUG_PLUGINS} "1")
# set(ENV{QML_IMPORT_TRACE} "1")
# CMAKE
# option(CMAKE_FIND_DEBUG_MODE "Print Used Search Paths When Finding a Package" OFF)
修改完成后run CMake重新生成
