Vscode GStreamer插件开发环境配置

概述

本教程使用vscode和Docker搭建Gstreamer2.24的开发环境,可以用于开发调试Gstreamer程序或者自定义插件开发。

1. vscode依赖插件

  • C/C++ Extension Pack(ms-vscode.cpptools-extension-pack):该插件包包含一组用于 Visual Studio Code 中 C++ 开发的流行扩展,主要包括对 C/C++ 的语言支持, C/C++ 扩展 UI 主题,对 CMake 的支持和工具
  • Docker(ms-azuretools.vscode-docker):提供对Docker的构建、管理和部署容器化应用程序
  • Meson(mesonbuild.mesonbuild):提供对 Meson 的支持,Gstreamer使用Meson进行编译。

2. 创建.devcontainer

devcontainer文件夹是 vscode 的 Docker 插件用来定义开发容器的配置文件夹。它用于配置一个隔离的开发环境,使得开发者可以在容器中进行开发,而无需在本地配置复杂的开发环境。
.devcontainer 文件夹通常包含以下文件:

  1. Dockerfile
    自定义容器环境,可以通过 Dockerfile 定义容器的构建过程。通常使用apt安装的Gstreamer版本为1.6,截至2024年11月,Gstreamer已经更新到了2.24,多很多新的功能,二次开发接口也有了不同的接口。这里使用镜像livekit/gstreamer:1.24.5-dev-amd64来构建我们的开发容器,该镜像包含了Gstreamer2.24的开发环境。以下是Dockerfile的内容:
    FROM livekit/gstreamer:1.24.5-dev-amd64# 设置环境变量避免交互式界面
    ENV DEBIAN_FRONTEND=noninteractive
    RUN apt-get update \&& apt-get -y install --no-install-recommends build-essential meson ninja-build vim gdb cmake make valgrind \# Clean up&& apt-get autoremove -y \&& apt-get clean -y \&& rm -rf /var/lib/apt/lists/*ENV DEBIAN_FRONTEND=dialogARG WORKSPACE
    
  2. devcontainer.json
    这是主要的配置文件,定义了开发容器的构建和运行环境。以下是devcontainer.json的内容和详细注释:
// See https://aka.ms/vscode-remote/devcontainer.json for format details.
{"dockerFile": "Dockerfile","build": {"args": {"WORKSPACE": "${containerWorkspaceFolder}" // 代表容器工作区的路径}},"remoteUser": "root", // 容器内默认用户// runArgs 配置是传递给 Docker 容器的启动参数,用来定制容器的行为"runArgs": ["--network=host", // 让容器使用主机的网络设置,这样容器内的应用可以访问主机的网络"--cap-add=SYS_PTRACE", // 用于调试进程"--security-opt=seccomp:unconfined", // 禁用 Docker 容器的 seccomp 安全配置,这样容器内的进程可以进行更多系统调用"--security-opt=apparmor:unconfined", // 禁用 AppArmor 安全配置,类似于 seccomp"--volume=/tmp/.X11-unix:/tmp/.X11-unix", // 将主机的 X11 socket 共享给容器,允许容器内的图形应用访问主机的显示(比如 GUI)"--ipc=host" // 使容器与主机共享 IPC(进程间通信)命名空间,允许容器与主机共享内存和信号量等],// containerEnv 配置设置了容器内部的环境变量,这些环境变量帮助容器内的应用程序访问主机的显示和音频等服务。"containerEnv": {"DISPLAY": "${localEnv:DISPLAY}", // 会从主机的环境变量中获取 DISPLAY 设置"XDG_RUNTIME_DIR": "${localEnv:XDG_RUNTIME_DIR}", // 允许容器使用主机的 XDG_RUNTIME_DIR,它通常包含用于与显示服务交互的 Unix 域套接字"PULSE_SERVER": "${localEnv:PULSE_SERVER}", // 允许容器使用主机的 PulseAudio 音频服务器"LIBGL_ALWAYS_SOFTWARE": "1", // 强制 OpenGL 使用软件渲染,这通常用于没有硬件加速支持的环境"GST_PLUGIN_PATH": "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0", // 默认的gstreamer插件安装路径// "HTTP_PROXY": "http://127.0.0.1:7890", // 添加 HTTP 代理// "HTTPS_PROXY": "http://127.0.0.1:7890" // 添加 HTTPS 代理},// 定制容器内的 VS Code 环境"customizations": {"vscode": {"extensions": ["ms-vscode.cpptools-extension-pack","ms-azuretools.vscode-docker","mesonbuild.mesonbuild",]}},// 这里用来关闭 Yama 安全模块,以便容器内的应用程序可以Attach调试其他进程。"postCreateCommand": "sudo sh -c 'echo 0 > /proc/sys/kernel/yama/ptrace_scope'"
}

3. 配置launch.json

由于vscode的Meson插件只负责编译,没有集成Debug调试的功能,因此需要自己编写launch.json配置文件实现调试Gstreamer代码的功能。(launch.json 是用来配置调试环境的文件。它定义了如何启动、配置和调试你的项目,允许你设置断点、运行调试器、传递参数等。这个文件位于 .vscode 文件夹中)
以下是launch.json的详细内容和注释。通过配置可以实现直接对Gstreamer可执行应用、插件的直接调试也可以实现Gstreamer插件附加到运行中的进程中进行调试。

{"version": "0.2.0","configurations": [{// 该配置实现把插件附加到一个已经运行的进程上进行调试"name": "Attach","type": "cppdbg","request": "attach","program": "${workspaceFolder}/gst-template/builddir/${input:exe_package}/${input:program}","MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}]},{// 该配置实现启动一个新的进程进行调试"name": "GDB Launch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/gst-template/builddir/${input:exe_package}/${input:program}","args": ["${workspaceFolder}/1.mp4"],"stopAtEntry": true,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},]},],"inputs": [{"id": "exe_package","type": "promptString","description": "可执行文件默认的包名","default": "tests"},{"id": "lib_package","type": "promptString","description": "插件默认的包名","default": "gst-plugin"},{"id": "program","type": "promptString","description": "debug默认程序","default": "test_plugin"}]
}

4. 插件开发代码创建

可以通过GStreamer官方的模板搭建插件开发基础。通过以下命令复制官方的插件开发模板:

git clone https://gitlab.freedesktop.org/gstreamer/gst-template.git

这样我们的文件夹结构应该如下

gst-template/
|-- .devcontainer/
|   |-- devcontainer.json
|   |-- Dockerfile
|-- .vscode/
|   |-- launch.json
|-- builddir/
|   |-- .gitignore
|   |-- .hgignore
|   |-- .ninja_deps
|   |-- .ninja_log
|   |-- build.ninja
|   |-- compile_commands.json
|   |-- gst-app/
|   |   |-- gst-app
|   |   |-- gst-app.p/
|   |-- gst-plugin/
|   |-- meson-info/
|   |-- meson-logs/
|   |-- meson-private/
|   |-- meson-vscode.env
|   |-- tests/
|-- gst-app/
|   |-- meson.build
|   |-- src/
|-- gst-plugin/
|   |-- .gitignore
|   |-- AUTHORS
|   |-- ChangeLog
|   |-- COPYING
|   |-- meson.build
|   |-- src/
|   |-- tools/
|-- meson.build

5. 构建容器

在vscode中按F1或者Ctrl+Shift+P,选择【开发容器: 在容器中打开文件夹(Dev Containers: Open Folder in Container)】,然后选择确定。等待几分钟,就可以在容器中开发Gstreamer了。

6. 编译

同样按F1或者Ctrl+Shift+P,输入或者直接选择【Meson: build】,然后选择【Build all targets】或者直接选想编译的目标。

7. 调试

  1. 直接调试可执行文件
    点击vscode左侧运行和调试,然后在下拉框中选择【GDB Launch】,然后按F5,选择调试的包和目标开始调试。此时可以调试可执行程序,也可以调试可执行程序中使用的Gstreamer插件代码。
  2. 通过附加到进程调试
    首先运行Gstreamer可执行程序,在可执行程序中需要使用待调试的插件。
    点击vscode左侧运行和调试,然后在下拉框中选择【Attach】,选择可执行程序的包和目标,然后选择正在运行的可执行进程开始插件代码的调试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义一个maven骨架 | 最佳实践

自定义一个maven骨架 | 最佳实践 目的:将一个多模块项目的基础结构制作成maven骨架,实现项目的快速构建,风格统一 公司内部会制定自己的规范及包结构。当创建新项目的时候就需要选择骨架,即可生成包结构。 Archetype都为不同类型的…

CTFHUB-web进阶(Bypassdisable_function)

LD_PRELOAD 来到首页发现有一句话直接就可以用蚁剑连接 根目录里有/flag但是不能看;命令也被ban了就需要绕过了 绕过工具在插件市场就可以下载 如果进不去的话 项目地址: #本地仓库;插件存放 antSword\antData\plugins 绕过选择 上传后我们点进去可以看到多了一个绕过的文件;…

workman服务端开发模式-GatewayWorker的使用

一、GatewayWorker介绍 Workerman是一个使用PHP开发的高性能组件,用于构建高性能的异步并发TCP、UDP、Unix Socket、HTTP、Websocket服务。 GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架,实现了单发、群发、广播等接口,内置了…

oracle linux8.10+ oracle 23ai安装

介质准备: 数据库23ai https://edelivery.oracle.com 上述网站下载基础版本,本次未使用。 本次是安装了带补丁的版本: Database Release Update 23.6.0.24.10 GoldImage表示带补丁用于直接安装的软件包 查找888.1对应Primary Note for …

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》(A Philosophy of Software Design)是一本在软件架构与设计领域颇具影响力的书籍,作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则,汇聚了作者丰富的实战经验与深邃的…

uniApp打包H5发布到服务器(docker)

使用docker部署uniApp打包后的H5项目记录,好像和VUE项目打包没什么区别... 用HX打开项目,首先调整manifest.json文件 开始用HX打包 填服务器域名和端口号~ 打包完成后可以看到控制台信息 我们可以在web文件夹下拿到下面打包好的静态文件 用FinalShell或…

【es6复习笔记】rest参数(7)

什么是 rest 参数? rest 参数是 ES6 引入的一个特性,它允许我们将一个不定数量的参数表示为一个数组。使用 rest 参数可以更方便地处理函数的参数,尤其是在参数数量不确定的情况下。 如何使用 rest 参数? 在函数定义中&#xf…

项目实战——高并发内存池

一.项目介绍 本项目——高并发内存池,是通过学习并模仿简化 google 的一个开源项目 tcmalloc ,全称 Thread-Caching Malloc,即线程缓存的malloc,模拟实现了一个自己的高并发内存池,用于高效的多线程内存管理&#xff…

Apache Log4j漏洞复现

所用环境 宝塔云服务器 log4j2 是Apache的⼀个java日志框架,我们借助它进行日志相关操作管理,然而在2021年末log4j2爆出了远程代码执行漏洞,属于严重等级的漏洞。 apache log4j通过定义每⼀条日志信息的级别能够更加细致地控制日志⽣成地过…

自动驾驶控制算法-横向误差微分方程LQR前馈控制

本文是学习自动驾驶控制算法第六讲 前馈控制与航向误差以及前两节的学习笔记。 1 横向误差微分方程 以规划的轨迹作为自然坐标系,计算自车在轨迹上的投影点,进而计算误差: 如图所示,横向误差为 d d d,航向误差为 θ…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使,可以说是一坨… 关键词:Apache RocketMQ 5.0 JDK 17 废话少说,开整。 1.版本 官网地址,版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

Google Cloud Kubernetes Anthos是什么,和Istio有什么关联

Google Cloud Platform (GCP) Kubernetes Anthos 是 Google 推出的一种多云管理平台,基于 Kubernetes,旨在帮助企业在多个云环境中管理和运行容器化应用程序。 https://cloud.google.com/blog/topics/hybrid-cloud/5-frequently-asked-questions-about-…

多摩川编码器协议

多摩川编码器是一种常用的绝对值编码器,其协议基于485硬件接口的标准NRZ协议,通讯波特率为固定的2.5Mbps。以下是多摩川编码器协议的详细说明: 硬件接口 多摩川编码器使用RS485接口进行通信,接口定义如下: 5V供电&…

AI新书推荐:深度学习和大模型原理与实践(清华社)

本书简介 在这个信息爆炸、技术革新日新月异的时代,深度学习作为人工智能领域的重要分支,正引领着新一轮的技术革命。《深度学习和大模型原理与实践》一书,旨在为读者提供深度学习及其大模型技术的全面知识和实践应用的指南。 本书特色在于…

redis延迟队列

Redis延迟队列 Redis延迟队列是基于Redis构建的消息队列,用来处理需延迟执行的任务。 基本原理 它借助Redis的有序集合(Sorted Set)数据结构达成目的。会把任务及其执行时间分别当成成员与分值存进有序集合,由于执行时间作为分值…

Android 之 List 简述

一、简单创建方式 Android 开发中&#xff0c;列表有很多种类&#xff0c;如ArrayList、LinkedList、List、MutableList等&#xff0c;创建列表的方式如下所示&#xff1a; fun listDemo() {// 使用 listOf 创建不可变的空列表val list listOf<Int>()val list1 listOf…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module)&#xff0c;它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode&#xff0c;它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API&#xff0c;比如最常…

微信小程序页面之间的传值方式

在微信小程序的开发过程中&#xff0c;页面之间的传值是一个常见的操作。根据多年的实践&#xff0c;我就我所知道的小程序页面之间的传值方式&#xff0c;进行简单的总结。希望能够帮助大家。 一、URL参数传递 原理 这种方式类似于网页开发中的URL传参。在微信小程序中&…

cursor保存更改操作技巧

1. 当我们在agent模式时&#xff0c;要求cursor更改代码时&#xff0c;cursor回答后&#xff0c;就已经更改了代码了&#xff0c;这时候就可以对程序进行编译和测试&#xff0c; 不一定先要点” accept“, 先测试如果没有问题再点“accept”&#xff0c;这样composer就会多一条…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…