ardupilot开发 --- 机载(边缘)计算机-SpireCV-SDK 篇

0. 前言

关于机载计算机;

1. APSync

  • 说到机载计算机Companion computer就不得不提另一个关键词APSync;
  • APSync简化了机载计算机的设置,以便它可以为ArduPilot提供额外的功能,并简化与互联网服务的集成;
  • 提供日志下载和视频流转发到地面站的功能;
  • 机载计算机通过串口与飞控连接,将飞控的log转存到自己的文件系统中,并创建一个网络热点,用于给运行地面站的PC连接,PC连接该热点后可以:1)从机载计算机下载日志;2)查看视频流;3)连接热点后地面站可以通过UDP连接到飞控;
  • http://10.0.1.128 (Configuration pages)
  • http://10.0.1.128:8000 (Which shows a video streaming on/off button)
  • PC连接到网络热点后(网络热点名称为ardupilot,密码也是ardupilot),地面站可通过UDP,port 14550来连接到飞控;
  • 关于下载log:可以用这个脚本来下载机载计算机的日志到PC:apsync-download-logs,或者从机载计算机上拔下SD卡来读取;
  • 关于视频流:视频流被发送到请求遥测数据的第一个地面站的IP地址;地面站查看视频流:右击Hub ~> Video ~> Set GSreamer Source;
  • PC连接热点后可通过SSH工具来远程登录到机载计算机;
  • 飞控的数据如何路由到各种程序的?
    How flight controller data is routed to various programs:
    https://ardupilot.org/dev/docs/apsync-intro.html#how-flight-controller-data-is-routed-to-various-programs
  • Installing APSync and setting the autopilot:https://ardupilot.org/dev/docs/apsync-intro.html#installing-apsync
    在这里插入图片描述
    在这里插入图片描述

2. 阿木实验室SpireCV-SDK

参考文献:SpireCV-SDK

2.1 简介

主要功能包括吊舱/相机控制、视频保存、推流、目标检测、识别与跟踪等。旨在为智能无人系统开发者提供高性能、高可靠、接口简洁、功能丰富的视觉处理功能。
在这里插入图片描述

3. SpireCV-SDK实践历程

编译源码:

cd ~/SpireCV/build
sudo make install

查看应用程序名称:

ls ~/SpireCV/build

执行应用程序:

./app-name

3.1 新增一个demo,如何修改CMakeLists.txt让编译器编译自己的demo ?

方法:在VSCode中搜索现有的demo的cpp文件名,看看在哪里使用了这些文件名,你会发现仅在同一目录的CMakeLists.txt中使用了这些cpp文件名,因此只需要修改这些CMakeLists.txt即可。
如:在/home/hyl20/SpireCV/CMakeLists.txt 中添加:

add_executable(CameraReading2 samples/demo/camera_reading2.cpp)
target_link_libraries(CameraReading2 sv_world)

其中camera_reading2.cpp就是我新添加的demo的名称。

3.2 更改视觉源输入类型

  • 以视频文件作为输入源
    在当前目录下新建一个mp4文件如000.mp4,以camera_reading2.cpp为例,做以下代码修改:
    cap.setVideoPath("/home/hyl20/SpireCV/samples/demo/000.mp4");
    cap.open(sv::CameraType::VIDEO, 0);  // CameraID 0
    
  • 以RTSP视频流作为输入源
    以camera_reading2.cpp为例,做以下代码修改:
    cap.setRtspUrl("rtsp://192.168.144.25:8554/main.264");
    cap.setPort(8554);
    cap.open(sv::CameraType::RTSP, 0);  // CameraID 0
    
    报错?如何解决?
    在这里插入图片描述
    修改代码:
    SpireCV/video_io/sv_video_input.cpp中的else if (this->_type == CameraType::RTSP) {…}
    //原来的代码
    sprintf(pipe, "rtspsrc location=%s W=%d H=%d FPS=%d latency=100 ! \
                   application/x-rtp,media=video ! rtph264depay ! parsebin ! avdec_h264 ! \
                   videoconvert ! appsink sync=false", 
                   this->_rtsp_url.c_str(), this->_width, this->_height, this->_fps);
    this->_cap.open(pipe, cv::CAP_GSTREAMER);
    
    //修改后的代码:
    sprintf(pipe, "rtspsrc location=%s latency=100 ! \
                   application/x-rtp,media=video ! rtph264depay ! parsebin ! avdec_h264 ! \
                   videoconvert ! \
                   videorate ! video/x-raw,framerate=%d/1 ! \
                   videoscale ! video/x-raw,width=%d,height=%d ! \
                   appsink sync=false", 
                   this->_rtsp_url.c_str(), this->_fps, this->_width, this->_height );
    this->_cap.open(pipe, cv::CAP_GSTREAMER);
    
    //或者改成:
    sprintf(pipe, "%s",this->_rtsp_url.c_str());
    this->_cap.open(pipe, cv::CAP_ANY);
    
    其中cv::CAP_ANY会自动检测数据来源类型,opencv会自行调用gstreamer中合适的功能函数。

3.3 相机内参标定

  • 1)采用读取视频文件的方式作为视觉输入源,修改calibrate_camera_charuco.cpp中的代码:
    inputVideo.setWH(imW, imH);
    inputVideo.setFps(fps);
    inputVideo.open(c_type, camId);
    //修改为:
    inputVideo.setVideoPath("/home/hyl20/SpireCV/samples/demo/bd1.mp4"); 
    inputVideo.setWH(imW, imH);
    inputVideo.setFps(fps); 
    inputVideo.open(sv::CameraType::VIDEO, camId);  // CameraID 0
    
  • 2)打印一张标定图案(A4纸)
    在这里插入图片描述
  • 3)录制一段标定图案的视频保存为:/home/hyl20/SpireCV/samples/demo/bd1.mp4
    拍摄注意事项:不同角度、不同距离拍摄;
    在这里插入图片描述
  • 4)编译代码
    cd ~/SpireCV/build
    sudo make install
    
  • 5)执行标定程序
    ./CameraCalibrarion -w=5 -h=7 -sl=0.035 -ml=0.021 -d=6 -ci=0 calib.yaml
    
  • 注意事项
    • w为标定板一行的格子数,h为标定板一列的格子数,sl为测量黑色实心方块的边长,ml为测量黑色二维码方块的边长,ci为Camera ID数;
    • 标定时需要拍摄不同距离、不同像平面位置、不同倾斜角的多张图像(>5张);
    • 标定完成后,标定文件保存在build目录下calib.yaml里;

3.4 二维码检测

认识Aruco二维码
在这里插入图片描述
二维码示例文件下载
用途:一般用于增强现实、相机姿势估计和相机校准等应用场景,具体如无人机的自主降落地标、机器人定位等。
组成:黑色宽边框 + 二进制矩阵(黑白方形阵列)
黑色边框:有助于其在图像中的快速检测;
黑白方形阵列:标识符 (ID) ,用于被识别以及错误检测和校正技术;
黑白方形的大小决定了内部矩阵的大小。例如,6×6 的Aruco码大小由 36 位组成;
6×6即长宽都是4个方形;
在这里插入图片描述
实践:

  • 1)采用读取视频文件的方式作为视觉输入源,修改aruco_detection.cpp中的代码:

      cap.open(sv::CameraType::V4L2CAM, 0);  // CameraID 0
      改为:
      cap.setVideoPath("/home/hyl20/SpireCV/samples/demo/ac2.mp4");
      cap.open(sv::CameraType::VIDEO, 0);  // CameraID 0
    
  • 2)修改内参文件的路径,使用上一个实验生成的内参:

      // 手动导入相机参数,如果使用Amov的G1等吊舱或相机,则可以忽略该步骤,将自动下载相机参数文件
      ad.loadCameraParams(sv::get_home() + "/SpireCV/build/calib1.yaml");
    
  • 3)录制一段aruco二维码图案视频保存为:/home/hyl20/SpireCV/samples/demo/ac2.mp4
    拍摄注意事项:不同角度、不同距离拍摄。
    在这里插入图片描述

  • 4)编译

    cd ~/SpireCV/build
    sudo make install
    
  • 5)运行

    ./ArucoDetection
    
  • 6)观察终端的打印信息
    在这里插入图片描述

  • 7)运行ros接口查看ros数据?
    待续…

4. 在wsl2-ubuntu20.04上安装SpireCV

  • 参考:Ubuntu20.04+CUDA11.6安装教程
  • 问题:文档上提供的教程是基于ubuntu20.04 cuda11.6 ,但是本机电脑的cuda版本是12.2的,应该如何安装环境和依赖呢?请看本文的第6小节。
  • 实践依据:分析SpireCV官方教程中的 ubuntu2004-cuda-cudnn-11-6.sh 脚本。

5. Ubuntu20.04安装NVIDIA显卡驱动、cuda、cuDNN、tensorRT

参考文献:

6. wsl2-Ubuntu20.04安装cuda、cuDNN、tensorRT

参考资料:

6.1 一些概念

  • 参考文献
    https://docs.nvidia.com/cuda/wsl-user-guide/index.html
    https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#
  • WSL2支持访问GPU以实现程序从GPU加速计算中受益。
  • WSL2支持的NVIDIA软件包括这些:
  • 只要Windows中安装好了NVIDIA显卡驱动,在wsl2中可以直接使用该驱动,最新的NVIDIA Windows GPU驱动程序将完全支持WSL2,所以不要为wsl2安装任何的NVIDIA显卡驱动,以造成覆盖问题!
  • 要编译CUDA应用程序,还需要在wsl2-ubuntu中安装CUDA Toolkit、Cudnn(可选)。
  • CUDA:CUDA是NVIDIA®发明的一种并行计算平台和编程模型。通过利用图形处理单元(GPU)的强大功能,它能够显著提高计算性能。
  • cuDNN:是由NVIDIA开发的一个深度学习GPU加速库,用来加速深度学习框架(例如TensorFlow、PyTorch)在NVIDIA GPU上的运算。
  • TensorRT:TensorRT是NVIDIA家的一款高性能深度学习推理SDK。此SDK包含深度学习推理优化器和运行环境,可为深度学习推理应用提供低延迟和高吞吐量。在推理过程中,基于TensorRT的应用程序比仅仅使用CPU作为平台的应用程序要快40倍。
  • Cuda版本切换
    如果机器上安装了多个版本的cuda,则会在/usr/local/中存在多个cuda-xx的文件夹,如下:
    在这里插入图片描述
    其中/usr/local/cuda文件夹是个软链接,链接到目前的cuda版本目录,所以如果要切换版本的话,只需要将原来cuda软链删除,重新建立指向另一个cuda-xx目录即可。
  • 安装cuda的系统要求、硬件条件、编程语言要求、内核要求等、系统版本要求、编译器版本要求请查阅:Pre-installation Actions
  • GPG、GPG public key:GPG(GNU Privacy Guard)是一个用于加密、签名和验证文件的开源加密工具。它可以帮助用户保护他们的数据免受未经授权的访问和篡改。您可以使用GPG来加密和签名电子邮件、文件和文本消息,以确保它们的安全性和完整性。

6.2 安装 CUDA Toolkit

  • 0)安装前的准备工作
    • 确认PC的GPU使用可以使用CUDA:lspci | grep -i nvidia(wsl中不显示?)
    • 确认Ubuntu版本是否兼容CUDA
    • 确认是否安装了gcc:gcc --version
    • 确认系统安装了正确的Kernel Headers和开发包:uname -r
  • 1)卸载WSL2中的显卡驱动
    一旦在Windows 上安装了NVIDIA GPU驱动程序,CUDA就可以在WSL2中以libcuda.so的形式使用。因此,不要在WSL 2中安装任何NVIDIA显卡驱动,否则会造成驱动覆盖问题!假如安装了,要卸载掉并重启wsl2:
    sudo apt-get remove --purge nvidia*
    sudo reboot
    
  • 2)卸载旧的 CUDA
    卸载掉可能存在的旧 CUDA -Toolkit,以进行正确版本 CUDA 的安装:
     sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \
     "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
    sudo apt-get autoremove
    
  • 3)删除旧的 GPG key,GPG 秘钥用于从CUDA仓库中下载文件的身份认证!7fa2af80是旧的key,目前CUDA repository最新的key是3bf863cc,推荐使用cuda-keyring来安装最新的key:
    sudo apt-key del 7fa2af80 
    
  • 4)选择合适自己PC显卡的 CUDA 版本
    最合适当前显卡的cuda版本查看方法:nvidia-smi
    也可以在windows中的NVIDIA控制面板中查看!
    在这里插入图片描述
    但是这个cuda版本不一定兼容应用程序编译环境,可能与应用程序调用的其他软件包互不兼容,所以要根据具体情况来选择cuda版本,选择依据有以下几个方面:
    • 一,要兼容当前安装的显卡驱动,查看当前安装的显卡驱动版本:nvidia-smi
      在这里插入图片描述
    • 二,当前安装的显卡驱动支持哪些版本的cuda?
      查看方法:Table 2 CUDA Toolkit and Minimum Required Driver Version for CUDA Minor Version Compatibility.
      注意:CUDA驱动程序是向后兼容的,例如:CUDA 11.6.x 要求显卡驱动版本 >= 450.80.02,假如你的显卡驱动版本是 536.67的话,那么你的显卡驱动同样可以兼容 CUDA 11.6.x.
    • 三,要选择与其他软件包互相兼容的cuda版本。
      例如:你的程序使用了TensorRT包,那么在选择CUDA 版本时要考虑与TensorRT的相互兼容,或在选择TensorRT版本时要考虑与CUDA 版本的相互兼容!
  • 5)在 WSL-Ubuntu 中安装 CUDA-Toolkit
    安装Linux默认的CUDA-Toolkit时总是附带安装一个显卡驱动,因此不能使用这种方式给WSL2-Ubuntu安装CUDA-Toolkit。为了避免显卡驱动覆盖问题,应该使用下面的方式为WSL2-Ubuntu安装CUDA-Toolkit:
    • 5.1)从CUDA Toolkit Archive中选择一个合适的cuda版本,以cuda11.6为例:
      在这里插入图片描述
    • 5.2)安装类型选择 wsl-ubuntu :
      在这里插入图片描述
    • 5.3)在bash中执行安装命令(任选一种安装方式,推荐使用Network方式):
      # Network 方式安装:
      wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
      sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
      sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/7fa2af80.pub
      sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"
      sudo apt-get update
      sudo apt-get -y install cuda
      # Local方式安装:
      wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
      sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
      wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda-repo-wsl-ubuntu-11-6-local_11.6.0-1_amd64.deb
      sudo dpkg -i cuda-repo-wsl-ubuntu-11-6-local_11.6.0-1_amd64.deb
      sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-6-local/7fa2af80.pub
      sudo apt-get update
      sudo apt-get -y install cuda
      
  • 6)查看是否安装成功
    最好先重启一下wsl。
    dpkg -l cuda 
    #或 
    nvcc --version
    
  • 7)安装完成可以删除掉.deb文件以释放存储空间
    sudo rm cuda-repo-wsl-ubuntu-11-6-local_11.6.0-1_amd64.deb
    
  • CUDA默认安装路径为 /usr/local/cuda/

6.3 安装 cuDNN

  • 0)准备工作

    • 安装显卡驱动:在wsl2中不需要这步;
    • 安装CUDA Toolkit:在上一节中已安装;
    • 安装Zlib
      sudo apt-get install zlib1g
      
  • 1)下载和已安装的cuda相兼容的cuDNN安装文件:cuDNN Archive.
    在这里插入图片描述

  • 2)选择一个符合您环境的安装方法:tar文件安装适用于所有Linux平台;Deb文件安装适用于Debian 11、Ubuntu 18.04、Ubuntu 20.04和22.04;RPM文件安装适用于RHEL7、RHEL8和RHEL9;包管理工具(如apt)安装方式,适合联网条件下安装。
    在这里插入图片描述

  • 3)以apt-get安装方式为例,为wsl2-Ubuntu安装 cuDNN v8.4.1:
    sudo apt-get install libcudnn8=8.4.1.*-1+cuda11.6
    sudo apt-get install libcudnn8-dev=8.4.1.*-1+cuda11.6
    sudo apt-get install libcudnn8-samples=8.4.1.*-1+cuda11.6

  • 4)验证安装是否成功
    如果出现版本号则安装成功

    cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
    
  • 参考文献
    官网:cuDNN installation Guide on Linux
    博客:https://blog.csdn.net/qq_43515934/article/details/123897435

6.4 安装TensorRT

  • 1)下载
    查看与已安装的CUDA Toolkit、cuDNN版本相互兼容的TensorRT版本,并下载安装文件,以deb安装方式为例。
  • 2)安装tensorrt,以TensorRT 8.4 EA、cuda11.6.0、cuDNN8.4.1为例
    sudo dpkg -i nv-tensorrt-repo-ubuntu2004-cuda11.6-trt8.4.0.6-ea-20220212_1-1_amd64.deb
    
  • 3)添加第三方仓库秘钥
    sudo apt-key add /var/nv-tensorrt-repo-ubuntu2004-cuda11.6-trt8.4.0.6-ea-20220212/*.pub
    #或:
    sudo cp /var/nv-tensorrt-repo-ubuntu2004-cuda11.6-trt8.4.0.6-ea-20220212/*.gpg /usr/share/keyrings/
    
  • 4)更新软件源,要保证运行后无错误提示
    sudo apt-get update
    
  • 5)安装tensorrt的依赖
    TensorRT 提供三种安装模式:完整安装、lean runtime 安装、dispatch runtime安装,根据具体需要来进行安装!了解更多请参考:TensorRT Documentation
    以完整安装为例:
    sudo apt-get install tensorrt -y
    python3 -m pip install numpy
    sudo apt-get install python3-libnvinfer-dev
    
  • 6)验证是否安装成功
    dpkg-query -W tensorrt
    
    显示如 tensorrt 8.6.1.x-1+cuda12.0 则表明安装成功!
  • 7)安装完毕后可以删除安装文件 *.deb 以释放空间。
  • 参考文献
    NVIDIA Deep Learning TensorRT Documentation
    阿木实验室SpireCV安装脚本

6.5 卸载

  • 卸载CUDA
    # To remove CUDA Toolkit:
    sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \
     "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
    # To remove NVIDIA Drivers:
    sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"
    # To clean up the uninstall:
    sudo apt-get autoremove
    
  • 卸载cuDNN
     sudo apt-get --purge remove "*cuDNN*"
     sudo apt-get autoremove
    
  • 卸载TensorRT
    Uninstalling TensorRT

6.6 Troubleshooting

  • 1) the public key is not available: NO_PUBKEY F60F4B3D7FA2AF80 Hit:4 https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64 InRelease
    原因:key不正确!!
    解决办法:找到该源,为它重新配置一个正确的key(无效的源就删掉!)
    在这里插入图片描述

  • 2)W: GPG error: https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4B469963BF863CC
    E: The repository 'https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64 InRelease' is not signed.
    原因:缺少公钥
    解决办法:https://blog.csdn.net/A15130402745/article/details/131643433
    https://keyserver.ubuntu.com/

  • 3)Version '8.4.1-1+cuda11.6' for 'libcudnn8' was not found
    在这里插入图片描述
    解决办法:sudo apt-get install libcudnn8=8.4.1.*-1+cuda11.6

  • 4)安装libcudnn8-samples出现:Version '8.4.1.*-1+cuda11.6' for 'libcudnn8-samples' was not found
    解决办法:sudo apt-get install libcudnn8-samples

  • 5)Processing triggers for libc-bin (2.31-0ubuntu9.14) ... /sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link
    在安装完cuda或tensorRT后出现该问题。
    解决办法:重新建立软连接,它们正确的关系应该是:libcuda.so -> libcuda.so.1 -> libcuda.so.1.1。步骤:
    在windows Powershell中:

    cd C:\Windows\System32\lxss\lib
    rm libcuda.so
    rm libcuda.so.1
    

    在wsl中:

    cd /usr/lib/wsl/lib/
    ln -s libcuda.so.1.1 libcuda.so.1
    ln -s libcuda.so.1.1 libcuda.so
    
  • 6)export: bad variable name
    待解决…

7. nvidia 官网使用指南

官网:https://www.nvidia.cn/

8. Gstreamer

官方文档:GStreamer: a flexible, fast and multiplatform multimedia framework

8.1 在Ubuntu上安装gstreamer

apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

8.2 一些概念

  • 什么是视频流Stream
    Playing media straight from the Internet without storing it locally is known as Streaming
  • GStreamer是一个用于处理多媒体流的框架。媒体从“source”元素(媒体数据来源)传播到“sink”元素(媒体数据使用者),通过一系列执行各种任务的中间元素element。所有相互连接的元素的集合被称为“管道”pipeline。除了source元素和sink元素,其他元素统称为 filter 元素。
  • playbin是一个特殊的element
    playbin它既是source元素,又是sink元素,是一个完整的管道。在内部,它会自动创建并连接了播放媒体所需的所有元素,因此您手动配置element。
  • bin是一个容器元素。你可以将多个元素添加到bin中。由于bin本身就是一个元素,所以可以像处理其他元素一样处理bin,Bin允许您将一组已链接好的elements组合为一个logical element,这样你可以不再处理单个元素,只处理一个元素,即bin。我们将看到,当你要构建复杂的管道时,这是非常强大的,因为它可以将管道分解成更小的块。
    在这里插入图片描述

8.3 解析

  • gst-launch-1.0是调试工具,一般在shell中使用;构建程序时候一般使用gst_parse_launch()函数;

  • 一个特殊的element:playbin
    playbin它既是source元素,又是sink元素,是一个完整的管道。在内部,它会自动创建并连接了播放媒体所需的所有元素,因此您手动配置element。playbin支持所有可以的媒体数据来源,包括本地文件file、http、https、rtsp流等等。例如:

  • 自动配置一个完整的pipeline就使用playbin元素,那么如何手动配置一个完整的pipeline呢?
    通过实例化每个元素并将它们全部链接在一起,手动构建一个管道。
    通过这个过程可以了解以下知识点:

    • 什么是GStreamer element以及如何创建它。
    • 如何将element相互连接(link)。
    • 如何自定义element的行为。
  • 如何监视管道的错误情况并从GStreamer消息中提取信息。

  • pipeline的基本结构
    在这里插入图片描述
    example:
    在这里插入图片描述

  • 创建一个元素,如:
    source = gst_element_factory_make (“videotestsrc”, “source”);
    sink = gst_element_factory_make (“autovideosink”, “sink”);
    第一个参数是 element 的类型,
    一些常用的element类型:basic-tutorial-14-handy-elements
    所有可用的element:plugins
    第二个参数是element实例的名称;

  • pipeline是一个特殊的bin,所有适用于bin的用法都适用于pipeline

  • 向pipeline添加element
    逐个添加:gst_bin_add()
    添加多个:gst_bin_add_many()

  • 将pipeline中的所有element一次连接起来:gst_element_link()

  • element本质上是一个GObject(C++对象?),具有属性property
    对于可写属性,可以自定义这些property的值;对于可读属性可以读取:
    g_object_set() 如:g_object_set (source, “pattern”, 0, NULL);
    g_object_get()
    查看某元素的所有属性名称和值,可以使用调试工具:gst-inspect-1.0
    或者在element的所属文档介绍中查看,如videotestsrc元素的文档doc_videotestsrc就可以查看它所有的属性。

  • bus、pad、capabilities、Buffers、Events
    参考:Building an Application

  • 元素支持哪些媒体格式?元素的Pad Capabilities有什么作用?
    Pad Capabilities简称pad caps;
    简而言之:pad caps 是决定了哪些格式的媒体数据可以流经某element
    pads 是根据Pad templates创建的,Pad templates有助于创建几个类似的pad,由相同Pad templates创建的两个pad才可以链接起来,不然后链接失败。
    Capabilities examples:
    在这里插入图片描述

  • 如何将应用程序的数据注入管道?如何将数据从管道中提取回应用程序?
    注入:appsrc
    提取:appsink

  • GStreamer工具
    GStreamer提供了一套工具,方便且绝对必要。

    • 创建、调试管道:
      gst-launch-1.0
    • 查看元素、pad、caps:
      gst-inspect1.0
    • 查看某个文件、rtsp视频流、http文件包含哪些媒体类型,需要哪些元素,了解哪些容器和编解码器被用于制作媒体,以及需要在管道中放入哪些元素才能播放媒体:
      gst-discoverer-1.0
      discoverer tool
  • 常用的element
    handy-elements

待续…




在这里插入图片描述

点赞、收藏、关注哟!
  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值