制作app网站,科研实验室网站建设,苏州嘉盛建设工程有限公司网站,做网站管理系统一、兼容性适配处理
为什么需要兼容处理#xff1f;
1、c兼容处理
主要有ABI兼容性问题#xff0c;不同ubuntu系统依赖的ABI版本如下#xff1a;
ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXG…一、兼容性适配处理
为什么需要兼容处理
1、c兼容处理
主要有ABI兼容性问题不同ubuntu系统依赖的ABI版本如下
ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXGLIBCXX_3.4.25GLIBCXX_3.4.21GLIBCXX_3.4.19
若用ubuntu 18.04开发的SDK在utuntu 16.04去集成SDK开发APP链接大概率无法通过如果使用到GLIBCXX_3.4.21以上或CXXABI_1.3.9以上的符号错误举例如下
undefined reference to std::__exception_ptr::exception_ptr::exception_ptr(void*)CXXABI_1.3.11
undefined reference to std::thread::_M_start_thread(std::unique_ptrstd::thread::_State, std::default_deletestd::thread::_State , void (*)())GLIBCXX_3.4.22
undefined reference to __cxa_init_primary_exceptionCXXABI_1.3.11
undefined reference to std::thread::_State::~_State()GLIBCXX_3.4.22
undefined reference to typeinfo for std::thread::_StateGLIBCXX_3.4.22鉴于此我们采用静态链接C标准库的方式解决高版本开发环境到低版本生成环境无法运行的问题。 思考怎么操作 cmake方式下可以在CMakeLists.txt增加一条链接命令target_link_libraries(${PROJECT_NAME} -static-libgcc -static-libstdc 总结为了充分利用C语言的新特性和高级功能我们开发使用了较高版本的gcc/g和stdc但输出的SDK不再依赖c也就实现了开发环境和生产环境的解耦这里的生产环境可以指代使用SDK的客户开发环境和生产环境。
2、c兼容处理
和c兼容性一样c也有同样问题。 如果采用静态链接c库的方式会造成产物二进制体积暴增如果对包体积大小不敏感可以采用此方式另外可以选择一个低版本的c库去编译链接这样编译出来的产物就只依赖低版本的c库这样在高版本的系统里运行是没有兼容性问题的。
target_link_libraries(${RTCSDK_LIBRARY_NAME} ${LIB_DIR}/libc-2.19.so) # ubuntu 14.04, gcc4.8
target_link_libraries(${RTCSDK_LIBRARY_NAME} ${LIB_DIR}/libm-2.19.so)3、iot兼容处理
Linux音视频SDK除了运行于桌面端环境比如x86_64-ubuntu, aarch64-uos等也可以应用于IoT领域(arm-linux平台比如arm云对讲教育录播场景。
实践中发现OpenSSL在arm上存在一些兼容性问题比如使用libcurl based on OpenSSL实现https通信场景下会出现ssl connect error等一系列疑难问题后来使用libcurl based on mbedTLS顺利解决这个问题mbedTLS是为嵌入式设备而开发的一个TLS协议的轻量级实现用作OpenSSL的一个轻量级替代。(参考https://github.com/Mbed-TLS/mbedtls
二、音频开发
音频开发技术栈包括
基于ALSA驱动开发基于PulseAudio服务开发基于PipeWire服务开发
基于ALSA驱动开发存在独占混音等诸多难题开发难度大PulseAudio声音服务作为声音系统的代理对上层应用开发较友好开发者完全不用考虑底层复杂的处理细节PipeWire作为新一代Linux audio/video bus旨在取代PulseAudio并统一音视频框架但目前尚未全面普及稳定性暂时不如PulseAudio进展ubuntu 22.04桌面系统内部预安装了PulseAudio和PipeWire服务ubuntu 22.10预计会用PipeWire直接替换PulseAudio,基于此并考虑到到当前大多数Linux桌面系统发行版(包括低版本都将PulseAudio作为默认声音服务器提供音频能力我们倾向于选用PulseAudio进行音频功能开发包括
音频设备枚举 包括输入设备micphone和输出设备speaker 音频采集输入音频播放渲染音频设备事件通知 包括默认设备变更音频输入和输出设备插入、拔出等
三、视频开发
包括以下功能
基于V4L2视频采集基于OpenGL视频渲染视频设备事件通知 插入、拔出操作等
V4L2Video For Linux Two的缩写是Linux下关于视频采集相关设备的驱动框架为驱动和应用程序提供了一套统一的接口规范。应用程序通过一系列IO系统接口即可完成摄像头数据采集功能摄像头在Linux系统下会被映射为/dev/video0,/dev/video1等设备文件特别应注意V4L2支持的设备十分广泛但是其中只有很少一部分在本质上是真正的视频设备实际使用过程中应该特别关注V4L2_CAP_VIDEO_CAPTURE特征如下
struct v4l2_capability {__u8 driver[16];__u8 card[32];__u8 bus_info[32];__u32 version;__u32 capabilities;__u32 device_caps;__u32 reserved[3];
};struct v4l2_capability cap;
if (ioctl(fd, VIDIOC_QUERYCAP, cap) 0)
{if (cap.device_caps V4L2_CAP_VIDEO_CAPTURE){ // it is real video}
}Linux 桌面视频渲染较多采用OpenGL渲染Qt跨平台框架QOpenGLWidget也是基于OpenGL实现的。
四、屏幕共享开发
在Linux的世界里桌面、窗口或图形化界面并不是必须的因为Linux是基于命令行的操作系统图形界面只是Linux下的一个应用程序不带桌面的发行版也可以自己动手安装上桌面屏幕共享的实现依赖于桌面环境更准确的说法应该窗口系统或显示服务器。
窗口系统 在Linux系统下有两个比较常见的窗口系统X Window SystemX11和Wayland但当前使用最多的还是X11窗口系统均采用C/S架构。
1、 基于X11屏幕共享开发 适用于X11窗口系统 基于X11进行开发包括桌面共享和窗口共享依赖X11XdamageXfixesXextXcompositexcbXdmcp和Xau库等。 客户端应用使用xlib参考https://www.x.org/releases/current/doc/libX11/libX11/libX11.html与X Server进行通信完成屏幕共享等图形功能。
2、基于pipewire 屏幕共享开发 适用于Wayland 窗口系统 WebRTC M95升级pipewire0.2到pipewire0.3实现了基于pipewire进行屏幕共享和窗口共享功能内部使用D-bus做为通信方式依赖pipewire-0.3glib-2.0gio-2.0和gobject-2.0四个库。
以上流程分为两大模块屏幕源选择由xdg-desktop-portal实现)pipewire流处理和数据回调针对屏幕源选择不像X11需要自己去实现源选择对话框这里开箱即用。
3、番外ubuntu 桌面窗口系统演进 ubuntu在17.04版本引入了wayland但由于无法实现屏幕共享远程桌面等问题在18.04版本去除了wayland feature重新拥抱Xorg到22.04版本正式支持了wayland默认启动wayland窗口系统同时保留切换为X11的选项登录界面可进行切换。除了ubuntu 发行版其它Linux发行版也在跟进wayland的支持可见wayland已成为Linux 图形技术栈的最新方向。
4、补充Linux 图形栈技术