Linux 音视频SDK开发实践

一、兼容性适配处理

为什么需要兼容处理?
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a5b31c22f20c4f23b9b382d12b16039b

1、c++兼容处理

主要有ABI兼容性问题,不同ubuntu系统依赖的ABI版本如下:

ubuntu 18.04ubuntu 16.04ubuntu 14.04
g++7.55.44.8
stdc++版本libstdc++.so.6.0.25libstdc++.so.6.0.21libstdc++.so.6.0.19
GLIBCXXGLIBCXX_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_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)())@GLIBCXX_3.4.22
undefined reference to `__cxa_init_primary_exception@CXXABI_1.3.11'
undefined reference to `std::thread::_State::~_State()@GLIBCXX_3.4.22'
undefined reference to `typeinfo for std::thread::_State@GLIBCXX_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视频渲染
  • 视频设备事件通知
    • 插入、拔出操作等

V4L2(Video 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 System(X11)和Wayland,但当前使用最多的还是X11,窗口系统均采用C/S架构。
在这里插入图片描述

1、 基于X11屏幕共享开发

适用于X11窗口系统

基于X11进行开发,包括桌面共享和窗口共享,依赖X11,Xdamage,Xfixes,Xext,Xcomposite,xcb,Xdmcp和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.3,glib-2.0,gio-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 图形栈技术)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256849.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解YOLOv5网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

一、本文介绍 本文给大家带来的教程是利用YOLOv5训练自己的数据集&#xff0c;以及有关YOLOv5的网络结构讲解/数据集获取/环境搭建/训练/推理/验证/导出/部署相关的教程&#xff0c;同时通过示例的方式让大家来了解具体的操作流程&#xff0c;过程中还分享给大家一些好用的资源…

电脑备忘录小工具怎么添加?怎么在电脑桌面添加备忘录?

作为一名天天用电脑办公的上班族&#xff0c;如果你需要对某个项目或问题进入深入思考&#xff0c;想要快速记录想法和思路&#xff0c;这时候会选择什么样的记事方式呢&#xff1f;如果你需要记录常用的工作文字内容、工作注意事项、项目流程、待办的工作安排等&#xff0c;用…

vue 将后端返回的二进制流进行处理并实现下载

什么是二进制流文件&#xff1f; 二进制文件是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。二进制文件可以包含任意类型的数据&#xff0c;例如图像、音频、视频、可执行文件、压缩文件等&#xff0c;而文本文件则仅仅包含 ASCII 码或…

PCL 点云匹配 之NICP(Normal ICP)

一、概述 上面一篇中我们已经得出了一个结论&#xff0c;就是ICP虽然简单&#xff0c;但是也有明显的缺点 1、计算速度慢&#xff0c;收敛慢&#xff0c;迭代次数多 2、对内存的开销比较大 3、很容易陷入局部最优的困局 因此我们在经典ICP的基础上添加一两个约束&#xff1a; 第…

鸿蒙开发之简单登录页面

Entry Component struct Index {State loading:booleanfalse;build() {Row() {Column({ space: 5 }) {Image($r("app.media.app_icon")).width(100).height(100).borderRadius(10).margin({top: 60})Text("登录界面").fontSize(40).fontWeight(FontWeight.…

Apollo Planning——PathLaneBorrowDecider

引用 组件数据缓存 DependencyInjector DependencyInjector&#xff1a;依赖注入器&#xff0c;这是一个过于专业的名词&#xff0c;来自软件设计模式的依赖倒置原则的一种具体实现方式&#xff0c;起到模块解耦作用。“依赖倒置原则(Dependence Inversion Principle)是程序要…

全国国控监测点点位数据,shp/excel格式,已可视化

基本信息. 数据名称: 全国国控监测点点位数据 数据格式: shpexcel 时间版本&#xff1a;2023年 数据几何类型: 点 数据精度&#xff1a;全国 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省名称2city城市…

设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

原型模式 原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。 原型模式是一种创建型设计模式&#xff0c;允许一个对象再创建另外一个可定制的对象&#xff0c;无需知道如何创建的细节。 工作原…

SQLturning:定位连续值范围起点和终点

在上一篇blog说到&#xff0c;如何去优化查询连续值范围&#xff0c;没看过的朋友&#xff0c;上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm1001.2014.3001.5501) 那么今天来说说怎么将连续的数据合并&#xff0c;然后返回合并…

Android的组件、布局学习

介绍 公司组织架构调整&#xff0c;项目组需要承接其他项目组的android项目&#xff0c;负责维护和开发新需求&#xff0c;故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否&#xff0c;是与F:\androidProject\android_lear…

HTML有哪些列表以及具体的使用!!!

文章目录 一、HTML列表二、列表的应用1、无序列表2、有序列表3、自定义列表 三、总结 一、HTML列表 html的列表有三种&#xff0c;一种是无序列表&#xff0c;一种是有序列表&#xff0c;还有一种为自定义列表。 二、列表的应用 1、无序列表 <ul> <li>无序列表…

【ONE·English || 翻译作业 Development: Mendel‘s Legacy to Genetics】

总言 作业&#xff1a;没有严格按照语句结构进行翻译&#xff0c;有不规范之处。下述目录中每一小节是按照原文段落划分。   相关链接&#xff1a;pubmed中查阅的链接&#xff0c;提供了两处文章平台。 文章目录 总言part11.11.21.3 part2&#xff1a;Entwicklung and develo…

LabVIEW开发自动驾驶的双目测距系统

LabVIEW开发自动驾驶的双目测距系统 随着车辆驾驶技术的不断发展&#xff0c;自动驾驶技术正日益成为现实。从L2级别的辅助驾驶技术到L3级别的受条件约束的自动驾驶技术&#xff0c;车辆安全性和智能化水平正在不断提升。在这个过程中&#xff0c;车辆主动安全预警系统发挥着关…

hive企业级调优策略之Join优化

测试所用到的数据参考&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。 Join算法概述 Hive拥有多种join算法&#xff0c;包括Common Join&#xff0c;Map …

Android 应用基准分析

先推荐一个作者的开源项目 最快的Json解析方式 参考 benchmark数据参考 benchmark的例子 可以参考json-benchmark 应用基准分析 是衡量时间维度的框架,是App界的鲁大师跑分,常用于耗时判断,冷启动,热启动,框架对比 预热对比等方面 开局一张图 下面再编 今天要做的是Microbe…

使用Python编写简单网络爬虫实例:爬取图片

&#x1f34e;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 ​编辑 简介 步骤 1. 安装依赖库 2. 创建目录 3. 发送HTTP请求并解析页面 4. 查找图片标签并下载图片 注意事项 结语 我的其他博客 简介 网络爬虫是一种…

我的游戏被DDoS攻击了怎么办?

“我的游戏最近一直在被攻击&#xff0c;有什么办法可以解决”&#xff0c;最近遇到不少用户来问德迅云安全提到了自己目前遇到的这个攻击问题&#xff0c;询问有没有什么好的解决办法&#xff1f; 那遇到用户反馈的DDOS攻击&#xff0c;德迅云安全是怎么做的。 很多用户现在遇…

js数组方法总结,数组遍历方法,判断数组方法总结

目录 原生数组方法数组方法用法说明数组乱序和数组拆解会改变数组的方法不改变数组的方法JS 中的数组存储 判断数组的方法数组遍历的方法forEach和map方法有什么区别 原生数组方法 1.数组和字符串转换方法&#xff1a;toString&#xff0c;toLocalString&#xff0c;join&…

如何使用Qu1ckdr0p2快速通过HTTP或HTTPS实现文件托管

关于Qu1ckdr0p2 Qu1ckdr0p2是一款功能强大的文件托管工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以快速通过HTTP或HTTPS托管包括Payload和后渗透代码在内的任何文件。 Qu1ckdr0p2提供了别名和搜索功能&#xff0c;相关功能模块位于qu1ckdr0p2-tools库中。默…

半导体管路连接PFA阀门的应用说明

PFA阀门在半导体行业中具有广泛的应用。以下是PFA阀门在半导体行业中的几个应用领域&#xff1a; 1. 超纯水系统&#xff1a;在半导体行业中&#xff0c;超纯水是一个至关重要的介质&#xff0c;用于洗涤和清洁半导体芯片及其他关键器件。PFA阀门由于其优异的耐腐蚀性和高纯度特…