OpenHD改造实现廉价高清数字图传(树莓派+PC)—(五)gstreamer视频采集、传输和显示

2023-05-16

        图传的一个重要功能就是可以看视频。主要是采集树莓派zero摄像头的数据,经过编码打包,通过wifibroadcast发送到地面端的PC上,然后再通过解码显示出来。

        这里用到了视频采集和编解码相关的软件。

        在树莓派上,有自带的软件可以直接采集视频,很方便;地面端的解码可以使用gstreamer来做,因为涉及到显示窗口的问题,可能还需要跟X Window相关的库。

  1. 使用wifibroadcast作为数据传输的通道;
  2. 发送端:树莓派的摄像头使用raspivid命令行即可实现视频数据的采集和编码;
  3. 接收端:使用gstreamer进行解码和显示。

一、摄像头视频采集

        树莓派摄像头还是比较便宜的,使用自带的raspivid程序就可以采集视频,直接编码成H.264流。

        发送端的命令行:

raspivid -n  -ex fixedfps -w 1920 -h  1080 -b 4000000 -fps 30 -vf -hf -t 0 -o – | sudo ./tx_my.sh wlan1

-o 表示输出,最后的 - 表示输出到标准输出流,可以在后面接上wbf的发送命令,直接将流发出去;

-n 表示不进行视频的预览

-w -h 表示视频的宽度和高度

-b 表示视频码率,单位时bps

-fps 表示设置fsp帧速率

-vf -hf 表示纵向和横向视频反向

-t 表示采集时间,单位ms,0表示一直采集

后面的tx_my.sh脚本看上一篇文章的介绍。

OpenHD改造实现廉价高清数字图传(树莓派zero + ubuntu PC )——(二)Wifibroadcast Wifi广播通信_hoopertsau的博客-CSDN博客_openhd

通过这个就可以将视频流通过WiFibroadcast发出去了。

二、视频接收解码和显示

        视频的接收端使用gstreamer相关的库去做。

        安装相关的库命令行

sudo 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-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

        内容比较多,要安装一会的。

        gstreamer可以先用命令行工具进行解码测试,如果没什么问题可以对照相关命令行的内容,编写成C++代码和单独的应用程序。       

        接收端的命令行:

sudo ./rx_my.sh wlan0| gst-launch-1.0 -v fdsrc fd=0 ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink 

        这里首先用rx_my.sh接收数据,通过管道输入给gsteamer工具;

        然后使用gst-launch-1.0工具,这里的fdsrc就是从fd文件读取数据,fd=0 中的0 就是标准输入的fd编号,也就是从管道上过来的数据,接收到的视频数据。

        这样就能直接在PC上自动开启一个窗口进行显示了。通过这个命令行可以测试一下通信和编解码是否正常。

       

三、使用gstreamer API开发GUI显示程序

        但是这个工具是个单独的软件,如果要根据我们的OSD叠加就不好弄了,因此还是要用gstreamer的API进行开发,后面还要将OSD的显示整合进来。

        可以参考官方的这篇文章进行GUI的开发。Basic tutorial 5: GUI toolkit integration

        但我准备用的就是直接使用XWindow,略微有些不一样,但总体上的思路是相同的。

        使用streamer开发视频显示应用软件,主要就是创建合适的窗口,初始化gstreamer管道并连接相关插件,然后将gstreamer显示绑定到窗口上,就可以显示了。

        直接上一个最简单的代码看看。       

#include<X11/Xlib.h>
#include <glib.h>
#include <gst/gst.h>
#include <gst/video/videooverlay.h>
#include <stdio.h>

// 定义一个窗口
Window win;

void initGst()
{
	// 创建视频处理的管道,这里和使用命令行类似
	GstElement *pipeline = gst_pipeline_new ("xvoverlay");
	GstElement *src = gst_element_factory_make ("videotestsrc", NULL);
	GstElement *sink = gst_element_factory_make ("xvimagesink", NULL);
	gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
	gst_element_link (src, sink);

	// 绑定UI界面,这里的win就是我们创建的X Window
	gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), win);
	
	// 将状态设置为运行
	GstStateChangeReturn sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);  
}


int main(int argc, char *argv[]){

  /* 初始化GStreamer库 */
  gst_init (&argc, &argv);
  
  // 打开一个显示
  Display *dsp = XOpenDisplay( NULL );
  if( !dsp ){ return 1; }

  // 设置屏幕
  int screenNumber = DefaultScreen(dsp);
  unsigned long white = WhitePixel(dsp,screenNumber);
  unsigned long black = BlackPixel(dsp,screenNumber);

  // 创建窗体
  win = XCreateSimpleWindow(dsp,
                               DefaultRootWindow(dsp),
                               50, 50,   // origin
                               800, 600, // size
                               0, black, // border
                               white );  // backgd
							   
  XMapWindow( dsp, win );

  long eventMask = StructureNotifyMask;
  XSelectInput( dsp, win, eventMask );

  XEvent evt;
  do{
    XNextEvent( dsp, &evt );   // calls XFlush
  }while( evt.type != MapNotify );

  // 创建具体的视频处理管道,并绑定刚才的创建的窗口
  initGst();
  
  do
  {
    XNextEvent( dsp, &evt );   // calls XFlush()
  }while( evt.type != ButtonRelease );
  
  
  XDestroyWindow( dsp, win );
  XCloseDisplay( dsp );

  return 0;
}

这个代码就是一个最简单的gstreamer的GUI程序,保存成x11_gst_demo.cpp

编译一下:

g++ x11_gst_demo.cpp -o x11_gst_demo `pkg-config --cflags --libs gstreamer-video-1.0 gstreamer-1.0 x11`

这是一个简单的程序,使用videotestsrc显示一个测试画面

接下来就可以在这个基础上,将视频处理的部分进行变化,使用不同的插件组合使用,来接收显示我们摄像头传过来的画面。

主要是实现这句话:

gst-launch-1.0 -v fdsrc fd=0 ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink 

 主要是该initGst函数,将上面这条语句用C++代码来实现,代码不难,看一下就应该能看懂。如果有些不清楚可以上网查询相关的函数的定义。

void initGst2()
{	
	GstElement *gst_pipeline;
	GstElement *gst_src;
	GstElement *gst_parser;
	GstElement *gst_decoder;
	GstElement *gst_conv;
	GstElement *gst_sink;
	
	// 以下的效果与这条语句等同
	// gst-launch-1gst-launch-1.0 -v fdsrc fd=0 ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink 
	
	// 创建管道
	gst_pipeline = gst_pipeline_new ("xvoverlay");
	
	// 创建fdsrc,用来从标准输入接收视频流
	gst_src = gst_element_factory_make ("fdsrc", "source");
	// 设置属性fd=0
	g_object_set(G_OBJECT(gst_src), "fd", 0, NULL);
	
	// 创建h264解码器
	gst_parser = gst_element_factory_make("h264parse", NULL);
	gst_decoder = gst_element_factory_make("avdec_h264", NULL);
	
	// 创建视频转换插件
	gst_conv = gst_element_factory_make("videoconvert", NULL );
	
	// 创建sink显示插件
	gst_sink = gst_element_factory_make ("xvimagesink", "sink");
	
	// 将多个插件连接起来
	gst_bin_add_many(GST_BIN(gst_pipeline), gst_src, gst_parser,gst_decoder, gst_conv, gst_sink, NULL);
	if(gst_element_link_many(gst_src, gst_parser, gst_decoder, gst_conv, gst_sink, NULL) == 0 )
	{
		printf("gst_element_link_many error!\r\n");
	}
	
	// 绑定UI界面,这里的win就是我们创建的X
	gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (gst_sink), win);
	
	// 将状态设置为运行
	GstStateChangeReturn sret = gst_element_set_state (gst_pipeline, GST_STATE_PLAYING);  
	printf("set gst playing. sret=%d\r\n",sret);
}

重新编译运行,就可以实现从标准输入显示视频了

用这个软件直接替换刚才的gstreamer自带的工具即可

四、小结

        使用wifibroadcast作为底层通信,使用gstreamer来解码,使用X11窗口来进行显示。

        发送端:

raspivid -n  -ex fixedfps -w 1920 -h  1080 -b 4000000 -fps 30 -vf -hf -t 0 -o – | sudo ./tx_my.sh wlan1

        接收端:

使用gstreamer自带工具:

sudo ./rx_my.sh wlan0| gst-launch-1.0 -v fdsrc fd=0 ! h264parse ! avdec_h264 ! videoconvert ! xvimagesink 

使用自己开发的GUI程序

sudo ./rx_my.sh wlan0 | x11_gst_demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenHD改造实现廉价高清数字图传(树莓派+PC)—(五)gstreamer视频采集、传输和显示 的相关文章

  • 无法为 Android 教程构建 GStreamer

    我在尝试构建 GStreamer Android 教程时遇到了许多问题 我的环境是 Mac OS X 7 Android SDK 版本 17 安卓NDK 8d 我能够在 Eclipse 中和命令行中构建和运行 NDK 示例 我已经下载了ht
  • 尝试使用网络摄像头 python opencv 捕获视频时 gstreamer 出现严重错误

    我正在尝试使用 opencv 和 python 通过简单的代码通过网络摄像头拍摄视频 import numpy as np import cv2 cap cv2 VideoCapture 0 print cap isOpened if ca
  • 如何设置非标准 gstreamer 属性的类型?

    我正在尝试设置pattern财产为videotestsrc 按照正常逻辑 我尝试将变量设置为i32和一根绳子 两者都会失败并出现要求特定类型的错误 查看 gstreamer API 我找不到设置该属性的方法 如何强制变量的类型与预期匹配 l
  • Tkinter 中 GStreamer 的视频输出?

    有谁知道我将如何使用 tkinter 窗口作为 python 内的视频接收器 管道的输出 我已经找到了许多其他 GUI 系统的方法 但我不想必须同时使用 tkinter 和其他东西 xxx 预先感谢 x 这对我在 Windows 32 位上
  • 使用 gstreamer 1.12.2 将 MPEG-TS 分割为 MP4 文件

    我有一个 MPEG TS 文件 其中包含两个视频 音频流对 gst discoverer 1 0 Recorder Aug01 12 30 39 ts Analyzing Recorder Aug01 12 30 39 ts Done di
  • java上的rtsp流

    任何人都可以帮我提供有关如何使用 gstreamer 在 java 中实现 RTSP 流媒体服务器的教程 链接文本 RTSP建立过程Server 代码是用 C 编写的 但请查看我的客户端代码以了解如何使用 gstreamer java AP
  • gstreamer flvmux 和 rtmp 错误

    我尝试从 rasberrypi 流式传输 rtmp 顺便说一句 omx 硬件编码器工作得非常好 所以我正在运行 gst launch 1 0 v4l2src video x raw width 640 height 480 framerat
  • 在哪里可以获得实时视频流示例(GStreamer)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Gstreamer 提供 RTSP 流,寻求工作示例

    我们正在尝试让 Gstreamer 在 DM368 Leopardboard 上运行 我们已成功说服它创建测试视频 videotestsrc 对其进行编码并将其转储到文件中 有效的管道是 gst launch v videotestsrc
  • 使用gstreamer的appsrc和appsink修改视频

    我正在使用 GStreamer 构建我的第一个应用程序 我的任务是从互联网获取流 使用 CUDA 修改它 更改像素 以并行计算帧 并输出修改后的流 为了简单起见 现在我使用 MP4 视频在磁盘上读写 不使用 CUDA 我在这个网站上找到了一
  • gstreamer playbin - 在 Windows 上设置 uri

    我正在尝试使用此站点上的 CLI 示例播放一些音频文件 http pygstdocs berlios de pygst tutorial playbin html http pygstdocs berlios de pygst tutori
  • 如何使用 GStreamer 标记或添加元数据到视频文件?

    我想使用 GStreamer 将元数据添加到 MP4 视频文件 录制文件时如何进行 当文件已经录制时怎么办 是否可以使用 GStreamer 检查这些修改 例如 使用 FFmpeg 我可以使用以下命令行向视频添加标题 ffmpeg i in
  • gstreamer:如何改变从文件中获取的一个流的渲染时间

    我有两个媒体文件 例如 file0 和 file1 我想将它们合并成一个具有 画中画 效果的单个 file0 中的内容要显示在整个窗口上 并且 file1 中的内容将显示在左上角 较小的盒子 还有一点是 file1 中的内容应该被渲染 从基
  • Debian sid下RStudio安装失败:libgstreamer依赖问题

    我使用 Debian sid amd64 每周滚动更新一次 我最近从他们的官方网站下载了 RStudio 的桌面版本 0 99 902 并发布 当然 以 root 身份 dpkg i rstudio 0 99 902 amd64 deb 无
  • 使用 GStreamer 将视频转换为 WebM

    文档用于GStreamer令人困惑 这仍然不是诉诸的借口StackOverflow com 但仍然 是什么GStreamer命令行将任何视频文件 任何格式 转换为 WebM WebM 音频 这是我能找到的唯一带有示例的文档 http gst
  • 构建 Gstreamer 编辑服务失败

    I run autogen sh在克隆的存储库中 它无法显示以下内容 configure No package gstreamer plugins base 1 0 found configure error no gstreamer pl
  • 如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)?

    你好 我一直在寻找一种方法play and recordLinux 最好是 Ubuntu 系统上的音频 我目前正在开发一个前端语音识别工具包 https www launchpad net cmusphinx train这将自动执行调整语音
  • Gstreamer 中的图像幻灯片

    我想制作一个 GStreamer 应用程序 它采用 xml 文件处理其内容 提供图像 url 其重量以及在屏幕上显示的持续时间等信息 可以使用libxml在C中清楚地处理xml文件 但是我们如何使用 GStreamer 库创建图像的幻灯片
  • gstreamer gst-rtsp-server 是否接受 udpsrc (RTP)?

    我想将 RTP 流输入到 gstreamer gst rtsp server 中 对于初始测试 我使用来自 github 的 test launch c 示例 https github com GStreamer gst rtsp serv
  • gstreamer 中的无缝视频循环

    我正在尝试使用 gstreamer 循环播放视频 它是 python 绑定 第一次尝试是hook EOSmessage并为管道生成搜索消息 import gi gi require version Gst 1 0 from gi repos

随机推荐

  • Minix下的汇编

    Minix下的汇编 大多数的编译器 xff0c 如Turbo C C 43 43 xff0c Borland C C 43 43 xff0c M C C 43 43 xff0c GCC xff0c VC 43 xff0c 编译过程都是 xf
  • 解决Xshell 7 报错 “要继续使用此程序,您必须应用最新的更新或使用新版本”

    1 先创建一个文本文档 xff0c 同时把该文档名称和后缀改为xshell7 bat xff1b 2 打开编辑这个xshell7 bat文件 xff0c 并且把以下文字复制进去 xff0c 注意set XSHELL 61 这一项需要改成你自
  • 多任务操作系统的任务切换

    在学习OS时 xff0c 对于多任务操作系统的任务切换 xff0c 一直不能理解 xff1a 控制权是怎么么回到调度程序上的 xff1f 记得在描述任务切换时 xff0c 一般都是这么描述的 xff1a 在每一个时钟滴答 xff0c 都将检
  • Minix下的汇编2

    似乎minix平台并没有带一个真正的汇编编译器 xff0c 看看makefile xff0c 几乎都是清一色的用cc来编译汇编代码的 而且 xff0c 即使是一个最简单功能的汇编程序 xff0c 也少不了一个 main 标签 在minix的
  • 原来在/var/spool/mail中

    fetchmail会把从mail server收到的邮件投递到 var spool mail 中去 而mutt也会自动地到 var spool mail里取信 xff0c 解码 xff0c 并显示 但 xff0c fetchmail的速度不
  • 汉字编码标准与识别(一)代码页(Code Page)初识

    BBS水木清华站 精华区 发信人 yanglc 魂归燕园 别理我 xff0c 烦着呢 信区 Linux 标 题 汉字编码标准与识别 一 发信站 BBS 水木清华站 Sat Apr 29 17 19 05 2000 http www linu
  • 让xpdf支持中文(C++primer中文版)

    首先到http www linuxfans org nuke modules php name 61 Site Downloads amp op 61 geninfo amp did 61 2385下载一个打了补丁的xpdf 安装 xff0
  • Xpdf-3 for MDK

    http www linuxfans org nuke modules php name 61 Site Downloads amp op 61 geninfo amp did 61 2385 Xpdf 3 for MDK 类别 其它软件
  • 不同公司的牛

    本文转自 C 43 43 Builder 研究 http www ccrun com other go asp i 61 264 amp d 61 sgz5id 传统公司 xff1a 你有两头母牛 你卖掉一头 xff0c 买了一头公牛 你的
  • 从词法分析开始

    刚开始时 xff0c 用lex的确是很方便 xff0c 但是这样却不能将词法分析的思想实践出来 最好的方法还是自己写一个lex 当然龙书上写得很详细了 xff0c 但是写得再详细 xff0c 把它实现出来还是很难的 我的计划是 xff1a
  • Python 获取当前路径几种方法

    Python 获取当前路径的几种方法 绝对路径 1 os path 方法 span class token comment coding utf 8 span span class token comment usr bin python
  • [pixhawk笔记]2-飞行模式

    本文翻译自px4官方开发文档 xff1a https dev px4 io en concept flight modes html xff0c 有不对之处 xff0c 敬请指正 pixhawk的飞行模式如下 xff1a MANUAL xf
  • 扩展卡尔曼滤波详解

    Extened Kalman Filter 简单介绍 卡尔曼滤波详解讲解的基本的卡尔曼滤波算法是通过一个线性随机差分方程来估计当前状态 xff0c 但是如果状态估计关系以及测量关系使非线性的怎么办 xff0c 而且在实际使用中大部分的问题都
  • 关于PX4中的高度若干问题

    飞行的高度是如何测量的 xff1f 地面的高度和海平面的高度差别很大 xff0c 飞控又是如何有效判别进行降落的 xff1f 这是我脑子里的疑问 搜索的一圈发现很少有人讨论这方面的问题 xff0c 于是本次我就直接看一下源代码 xff0c
  • 基于4G网卡和树莓派zero实现低延时数字图传(250-300ms左右)

    方案本身并不复杂 xff0c 都是采用成熟的产品 xff0c 只需要几个命令行就能解决问题 0 准备工作 硬件 xff1a 树莓派zero 4G网卡 linux台式机 笔记本 虚拟机 软件 xff1a raspivid netcat nc
  • 树莓派zero w 使用AV接口连接电视机

    树莓派zero本身板子上有一个mini HDMI xff0c 但是我看到好像板子上还有一个小接口 xff0c 上面写着TV xff0c 感觉应该可以输出AV信号 xff0c 于是网上搜索了一番 xff0c 果然可以 首先 xff0c 手工做
  • OpenHD改造实现廉价高清数字图传(树莓派+PC)—(一)概述

    一 缘由 数字图传网上有开源的解决方案 xff0c 最为出名的应该就是OpenHD了 如果按照官方网站的内容 xff0c 构建起来也不是很复杂 xff0c 直接可以烧录两个TF卡就能完成 但是 xff0c 你需要用到两个树莓派板卡 xff0
  • OpenHD改造实现廉价高清数字图传(树莓派+PC)—(二)Wifibroadcast Wifi广播通信

    上一篇文章重点介绍了数字图传的整体构建思路 xff0c 以及主要的软件模块和最终效果 接下来几篇文章将针对其中的几个主要关键技术点进行阐述 一方面是为了将这些知识点做一个整理记录 xff0c 方便后续查阅 xff0c 另一方面也是将学习到知
  • OpenHD改造实现廉价高清数字图传(树莓派+PC )—(四)OSD数据传输和画面显示

    前面三篇文章分别讲了整体情况 xff0c wifibroadcast xff0c 以及OpenVG的移植等 OpenHD改造实现廉价高清数字图传 xff08 树莓派zero 43 ubuntu PC xff09 xff08 一 xff09
  • OpenHD改造实现廉价高清数字图传(树莓派+PC)—(五)gstreamer视频采集、传输和显示

    图传的一个重要功能就是可以看视频 主要是采集树莓派zero摄像头的数据 xff0c 经过编码打包 xff0c 通过wifibroadcast发送到地面端的PC上 xff0c 然后再通过解码显示出来 这里用到了视频采集和编解码相关的软件 在树