Vscode GStreamer插件开发环境配置

news/2024/12/25 10:25:32 标签: vscode, ide, gstreamer, c++

概述

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

vscode_2">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=dialog
    
    ARG 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.niftyadmin.cn/n/5798985.html

相关文章

如何完全剔除对Eureka的依赖,报错Cannot execute request on any known server

【现象】 程序运行报错如下: com.netflix.discovery.shared.transport.TransportException报错Cannot execute request on any known server 【解决方案】 (1)在Maven工程中的pom去掉Eureka相关的引用(注释以下部分&#xff0…

【进阶编程】代理模式和适配模式的比较

代理模式和适配器模式(Adapter Pattern)都属于结构型设计模式,它们在某些方面有相似之处,都涉及到为其他对象提供间接访问和包装,但它们的核心目的是不同的。下面是对代理模式和适配器模式的详细比较: 1. 目的 代理模式(Proxy Pattern): 代理模式的目的是通过一个代理…

微软在AI时代的战略布局和挑战

微软的CEO萨提亚纳德拉(Satya Nadella)在与投资人比尔格里(Bill Gurley)和布拉德格斯特纳(Brad Gerstner)的一场深度对话中,详细回顾了微软在AI时代的战略布局与所面临的挑战。这场对话不仅总结…

【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern

前言 (题外话)nav2系列教材,yolov11部署,系统迁移教程我会放到年后一起更新,最近年末手头事情多,还请大家多多谅解。回顾我们整个学习历程,我们已经学习了很多C的代码特性,也学习了很多ROS2的跨…

五十一:HPACK如何减少HTTP头部的大小?

在现代的Web通信中,HTTP是最常用的协议。然而,随着网络应用程序的复杂化,HTTP头部的大小迅速增加,尤其是在HTTP/2中,由于其多路复用特性,多个请求和响应共享同一个连接,头部大小对性能的影响变得…

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务,要求用户在60天内迁移账号,否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息: 1. 背景介绍:GitLab是一家全球知名的软件开发平台,提供代码托…

物理层知识要点

文章目录 物理层接口的四大特性通信基础编码和调制(1)数字数据编码为数字信号(2)模拟数据编码为数字信号(3)常见调制方式(3)信道的极限容量 多路复用技术数据传输方式物理层下的传输…

leetcode 05 回文字符串

leetcode 05 回文字符串 1. 描述 给你一个字符串,找到里面最长的回文字符串 2. 事例 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: …