V4L2&&Gstreamer媒体控制工具(五)

Wesley13
• 阅读 2522

媒体控制器

现代的片上系统(SoC)设备以内部硬件模块的方式支持广泛的功能,这导致采用多种方式互连SoC中的功能,从而改变了V4L设备的内容。

媒体控制器内核API旨在将有关媒体设备和捕获设备的详细信息公开给用户空间,以使它们可以在运行时以动态和复杂的方式互连。

媒体控制器设备将实体公开给媒体控制器框架。每个实体具有一个或多个源极焊盘和一个或多个汇聚焊盘。您可以使用媒体控制器内核API(即通过media-ctl)来查询实体,将源填充链接到接收填充,以及设置填充格式。

请注意,IMX6媒体控制器驱动程序是在4.13内核中添加到Linux的。此页面适用于Linux 4.13及更高版本。如果您使用的内核早于基于Ventana IMX6的主板的内核(例如Gateworks 3.14内核),则需要使用Yocto GStreamer页面:

media-ctl(v4l-utils软件包)

media-ctl从为v41-utils软件包的应用程序是使用Linux的媒体控制器API来配置管道用户空间应用程序。

media-ctl 没有帮助页,但查看源代码:

  • --device (默认为/ dev / media0)
  • --entity <名称>打印与给定实体关联的设备名称
  • --set-v4l2 逗号分隔要设置的格式列表
  • --get-v4l2 在给定的pad上打印活动格式
  • --set-dv 在给定的打击垫上配置DV时序
  • --interactive交互式修改链接
  • --links 逗号分隔要设置的链接描述符列表
  • --known-mbus-fmts列出已知格式及其数值
  • --print-topology打印设备拓扑
  • --reset将所有链接重置为非活动状态

可视化可用于互连的硬件组件的最佳方法是使用打印拓扑并将其转换为图形图像:

media-ctl --print-topology
media-ctl --print-dot> graph.dot
点-Tpng graph.dot> graph.png
  • 虚线表示可能的连接;用这些来确定可能性
  • 实线表示活动连接
  • 绿色框显示媒体实体
  • 黄色框显示video4linux端点

例如,以下是GW5404的图形:

V4L2&&Gstreamer媒体控制工具(五)

你可以找到视频捕获设备存在各种gateworks板在图表http://dev.gateworks.com/docs/linux/media/

用于media-ctl --links将实体源填充板链接到实体接收板:

media-ctl --links “ <实体>:<srcpadn>-> <实体b>:<sinkpadn> [<flags>]
  • 标志:0 =无效1 =有效

硬件媒体管道的基本配置步骤为:

  • 重置所有链接 media-ctl --reset
  • 配置链接 media-ctl --links
  • 配置填充格式 media-ctl --set-v4l2
  • 用以下命令配置subdev属性 v4l2-ctl
  • 捕获/dev/video*设备 上的帧

有关Video4Linux2的更多信息,请参见此处

IMX6媒体捕获

IMX媒体控制器文件在Linux内核可能用于解释什么是SoC中的哪些每个组件都可以做的最好的文档:

飞思卡尔i.MX5 / 6包含一个图像处理单元(IPU),用于处理往返于捕获设备和显示设备的图像帧。

对于图像捕获,IPU包含以下内部子单元:

  • 图像DMA控制器(IDMAC)
  • 相机串行接口(CSI)
  • 图像转换器(IC)
  • 传感器多FIFO控制器(SMFC)
  • 图像旋转器(IRT)
  • 视频去隔行或合并块(VDIC)

IDMAC是DMA控制器,用于在内存之间传输图像帧。存在用于视频捕获和显示路径的各种专用DMA通道。在传输过程中,IDMAC还能够在相同的颜色空间内进行垂直图像翻转,8x8块传输(请参阅IRT描述),像素分量重排序(例如,从UYVY到YUYV)以及打包的<->平面转换。IDMAC还可以通过在传输过程中对偶数行和奇数行进行交织来执行简单的去隔行(无需运动补偿,这需要VDIC)。

CSI是后端捕获单元,可通过Parallel,BT.656 / 1120和MIPI CSI-2总线直接与摄像机传感器连接。

该IC可处理色彩空间转换,调整大小(缩小和放大),水平翻转和90/270度旋转操作。

IC中有三个独立的“任务”可以同时执行转换:预处理编码,预处理取景器和后处理。在每个任务中,转换分为三个部分:缩小部分,主要部分(放大,翻转,色彩空间转换和图形平面合并)和旋转部分。

IPU分时执行IC任务操作。时间片粒度是在缩小区域中的八个像素的一连串,在主处理部分中的一图像线,在旋转部分中的一图像帧。

SMFC由四个独立的FIFO组成,每个FIFO可以同时通过四个IDMAC通道将捕获的帧从传感器直接直接传输到内存。

IRT执行90度和270度图像旋转操作。旋转操作一次在8x8像素块上执行。IDMAC支持此操作,它与垂直翻转配合处理8x8块传输以及块重新排序。

VDIC支持将隔行视频转换为逐行视频,并支持不同的运动补偿模式(低,中和高运动)。VDIC的去隔行输出帧可以发送到IC预处理取景器任务,以进行进一步的转换。VDIC还包含一个组合器,该组合器通过alpha混合和色彩键组合两个图像平面。

除了IPU内部子单元外,IPU之外还有两个单元也参与i.MX上的视频捕获:

  • MIPI CSI-2接收器,用于带有MIPI CSI-2总线接口的摄像机传感器。这是Synopsys DesignWare的核心。
  • 两个视频多路复用器,用于在多个传感器输入中进行选择以发送到CSI。

这些实体将根据处理器而有所不同:IMX6D / Q具有两个IPU,而IMX6S / DL仅具有一个IPU,因此实体和焊盘的数量不同。另外,某些实体将具有基于设备树端点的固定配置。adv7180模拟媒体控制器驱动程序还与tda1997x HDMI接收器媒体控制器驱动程序一样,提供了一个实体。

参考文献:

内核驱动程序

需要为IMX6捕获启用以下内核驱动程序:

  • CONFIG_MEDIA_CONTROLLER = y-用于媒体控制器驱动程序和框架
  • CONFIG_VIDEO_V4L2_SUBDEV_API = y-用于V4L2 subdev框架
  • CONFIG_VIDEO_IMX_MEDIA = y-用于IMX6媒体控制器
  • CONFIG_VIDEO_MUX = y-视频多路复用器
  • CONFIG_VIDEO_ADV7180 = m-用于Ventana模拟CVBS视频捕获(模块)
  • CONFIG_VIDEO_TDA1997X = m-用于Ventana Digital HDMI视频捕获(模块)

内核将显示如下消息:

root @ ventana:〜#dmesg | grep媒体
 [     0 .343835 ]媒体:Linux媒体接口:v0.10
 [     6 .189587 ] imx-media:已注册的subdev ipu2_csi1_mux
 [     6 .195114 ] imx-media:已注册的subdev ipu1_csi0_mux
 [     6 .200928 ] imx-media:已注册subdev ipu1_vdic
 [     6 .206251 ] imx-media:已注册的subdev ipu2_vdic
 [     6 .211493 ] imx-media:已注册的subdev ipu1_ic_prp
 [     6 .216580 ]IMX媒体:注册subdev ipu1_ic_prpenc
 [     6 0.230109 ] IMX媒体:注册subdev ipu1_ic_prpvf
 [     6 0.242937 ] IMX媒体:注册subdev ipu2_ic_prp
 [     6 0.248023 ] IMX媒体:注册subdev ipu2_ic_prpenc
 [     6 0.261065 ] imx-媒体:已注册的subdev ipu2_ic_prpvf
 [     6 .273972 ] imx-media:已注册的subdev ipu1_csi0
 [     6 .292605 ] imx-media:已注册的subdev ipu1_csi1
 [     6 .304263 ]imx-media:已注册的subdev ipu2_csi0
 [     6 .315870 ] imx-media:已注册的subdev ipu2_csi1
 [     6 .327352 ] imx-media:imx_media_create_link:ipu1_csi0:1-> ipu1_ic_prp:0
 [     6 .334307 ] imx-media:imx_media1_create_link :1-> ipu1_vdic:0
 [     6 .341128 ] imx-media:imx_media_create_link:ipu1_csi0_mux:2-> ipu1_csi0:0
 [     6 .348200 ] imx-media:imx_media_create_link:ipu1_csi1:1-> ipu1_ic_prp:0
 [     6 .355253 ]imx-media:imx_media_create_link:ipu1_csi1:1-> ipu1_vdic:0
 [     6 .362026 ] imx-media:imx_media_create_link:ipu2_csi0:1-> ipu2_ic_prp:0
 [     6 .368924 ] imx-media:imx_media_create_link:ipu2_csi0 :0
 [     6 .375717 ] imx-media:imx_media_create_link:ipu2_csi1:1-> ipu2_ic_prp:0
 [     6 .382661 ] imx-media:imx_media_create_link:ipu2_csi1:1-> ipu2_vdic:0
 [     6 .389419 ] imx-media:imx_media_create_link :ipu2_csi1_mux:2-> ipu2_csi1:0
 [     6 .396529 ]imx-media:imx_media_create_link:ipu1_vdic:2-> ipu1_ic_prp:0
 [     6 .403487 ] imx-media:imx_media_create_link:ipu1_ic_prp:1-> ipu1_ic_prpenc:0
 [     6 .410858 ] imx-media:imx_media_create_link- ipu1p :0
 [     6 .418104 ] imx-media:imx_media_create_link:ipu2_vdic:2-> ipu2_ic_prp:0
 [     6 .425095 ] imx-media:imx_media_create_link:ipu2_ic_prp:1-> ipu2_ic_prpenc:0
 [     6 .432764 ] imx-media:imx :ipu2_ic_prp:2-> ipu2_ic_prpvf:0
  • /dev/media设备受媒体控制器框架作用-即使imx-media驱动程序注册了子/dev/media设备,设备也要等到端点(adv7180,tda1997x)驱动程序加载后才会显示,因为那是devicetree中的端点(两个端点都必须存在才可以显示)可用)

媒体控制器管道

通过以Linux v4l2捕获芯片开始并以Linux v4l2捕获节点(即/ dev / video4)结束的方式将它们链接在一起,可以创建各种媒体控制器实体管道。

您创建的媒体管道取决于:

  • 主板型号和CPU
  • 您追求的功能和性能

Ventana底板具有以下视频捕获功能:

  • GW54xx:
    • CVBS(模拟)视频捕获(ADV7180)
    • HDMI(数字)视频捕获(TDA1997X)
  • GW551x:
    • HDMI(数字)视频捕获(TDA1997X)
  • GW51xx / GW52xx / GW53xx / GW553x:
    • CVBS(模拟)视频捕获(ADV7180)

每个捕获设备的IPU和CSI端口不仅取决于电路板型号,而且还取决于IMX6 SoC型号。

下表显示了每个板和SoC的每个捕获设备的各种IPU / CSI组合:

片上系统

ADV7180模拟CVBS

TDA1997x数字HDMI

GW5404

IMX6Q

IPU2_CSI1

IPU1_CSI0

GW5304 / GW5204

IMX6Q

IPU2_CSI1

不适用

GW5300 / GW5200

IMX6DL

IPU1_CSI1

不适用

GW5104 / GW5534

IMX6Q

IPU1_CSI0

不适用

GW5100 / GW5530

IMX6DL

IPU1_CSI0

不适用

GW5514

IMX6Q

不适用

IPU1_CSI0

GW5510

IMX6S

不适用

IPU1_CSI0

您构造的管道media-ctl会有所不同,这取决于您要完成的工作,因为不同的硬件块(在媒体控制器图中转换为实体)可以执行不同的转换,例如色彩空间转换,缩放,旋转或逐行扫描。在某些情况下,可以通过多种折衷来实现某种翻译。

该IMX6媒体驱动寄存器,采取IMX6硬件的优势几个实体(见文档/媒体/ V4L司机/ IMX):

  • ipu_csi_mux-IPU CSI多路复用器:将并行捕获总线和MIPI捕获总线复用到摄像机传感器接口(CSI)
  • ipu_csi-IPU捕获传感器接口(IDMAC)(在总线上锁存并行数据,或从总线反序列化MIPI数据)。除了原始帧捕获外,它还支持:
    • 使用作物选择subdev API进行作物
    • 使用compose selection subdev API在宽度和高度上固定固定的二分之一缩小比例
    • 通过设置接收器和源极垫上的帧间隔来指定跳帧
    • 无需运动补偿的简单去隔行扫描(如果接收盘焊盘的场类型是隔行类型且源极盘场类型设置为无,则激活)
    • 同一颜色空间内的像素重新排序:即:UYVY2X8-> YUYV2X8
    • 像素平面转换:YUV-> YUV420(平面)
    • 帧间隔监视器:对于诸如adv718x之类的解码器,在NTSC / PAL信号重新同步期间(视频行太少或太多),偶尔发送损坏的字段,IPU可以触发一种机制,方法是在每一次添加一条虚拟行时重新建立垂直同步帧导致图像到图像甚至永久性分割图像的滚动效果。此机制可用于检测损坏的字段并发送V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR,可以捕获该错误以发出重新启动以更正滚动/分割图像。ipu_csi子开发程序包含用于配置此“帧间隔监视器”或FIM的自定义控件。V4L FIM控件是V4L2_CID_IMX_FIM_NUM_SKIP,V4L2_CID_IMX_FIM_ICAP_CHANNEL和V4L2_CID_IMX_FIM_ICAP_EDGE。
  • ipu_vdic-将隔行视频转换为逐行视频,并支持不同的运动补偿模式(低/中/高运动)。该模式由V4L2_CID_DEINTERLACING_MODE菜单控件指定。该实体具有来自ipu_csi实体的直接连接垫(只能使用高速模式),但是具有可以与其他输出或mem2mem设备节点(其中高,低或中等运动模式可以使用)一起使用的附加源极板。使用)。
  • ipu_ic_prp-IC预处理实体:充当在源焊盘和宿焊盘之间路由数据的路由器。如果该实体从ipu1_vdic下沉,则它可以向ipu_ic_prpenc或ipu_ic_prpvff供电,或者可以直接从ipu_csi下沉并同时提供两个输出焊盘。
  • ipu_ic_prpenc-IC预处理编码实体提供:
    • 色彩空间转换
    • 调整大小(缩小和放大)
    • 使用标准V4L2控件进行水平和垂直翻转以及90/270度旋转
    • 无需运动补偿的简单去隔行
    • 像素重新排序
  • ipu_ic_prpvf-IC预处理取景器实体:这与ipu_ic_prpenc实体相同,支持:
    • 色彩空间转换
    • 使用标准V4L2控件进行水平和垂直翻转以及90/270度旋转
    • 无需运动补偿的简单逐行扫描(除非管道中包含了ipu_vdic,因为具有运动补偿的vdic已经完成了逐行扫描)
    • 像素重新排序

忽略输入和输出填充编号以及IPU和CSI索引,以下伪管道很有用:

  • 输入分辨率的原始捕获:

    传感器-> ipu_csi_mux-> ipu_csi-> ipu_csi捕获
    
    • 使用tda19971数字HDMI的adv7180源和模拟CVBS的源
    • 在上面的IPU和CSI上使用正确的索引,具体取决于板/ SOC /输入(请参见上表)
    • 通过在ipu_csi_mux和ipu_csi实体上使用'field:seq-tb'指定格式,可以将IDMAC用于从源开始的隔行视频的简单去隔行。
  • 通过VDIC高速补偿去隔行:

    传感器-> ipu_csi_mux-> ipu_csi-> ipu_vdic-> ipu_ic_prp-> ipu_ic_prpvf-> ipu_ic_prpvf捕获
    
    • 使用tda19971数字HDMI的adv7180源和模拟CVBS的源
    • 在上面的IPU和CSI上使用正确的索引,具体取决于板/ SOC /输入(请参见上表)
    • 在ipu_ic_prp和ipu2_ic_prpvf的ipu_csi_mux,ipu_csi,ipu_vdic和'field:none'的格式上指定“ field:interlaced”(因为ipu_ic_prp是可以与IDMAC进行去隔行的实体)
  • IC直接转换:

    • 使用预处理编码实体将帧直接从CSI路由到IC,以进行最大1024x1024分辨率,CSC,翻转和图像旋转的缩放:

      传感器-> ipu_csi_mux-> ipu_csi-> ipu_ic_prp-> ipu_ic_prpenc-> ipu_ic_prpenc捕获
      
  • 运动补偿去隔行:

    • 将帧从CSI直接路由到VDIC,以进行运动补偿(高模式)去隔行,缩放至1024x1024,CSC,翻转和旋转:

      传感器-> ipu_csi_mux-> ipu_csi-> ipu_vdic-> ipu_ic_prp-> ipu_ic_prpvf-> ipu_ic_prpvf捕获
      

请注意,为了帮助使用控件的V4L2应用程序进行配置并向后兼容,捕获设备接口将从当前管道中的活动实体继承控件,因此可以通过实体子开发人员或活动的捕获设备接口访问这些控件。例如,可以从ipu_csi子开发工具或活动的捕获设备获得FIM控件。

安装脚本

由于传感器,cpu和电路板的组合很多,因此我们创建了一种创建适当的管道配置脚本的方法,该脚本只需要知道您要使用的传感器即可。

安装:

以下脚本要求安装GStreamer,有关说明,请参见此处

脚本下载:

wget https://raw.githubusercontent.com/Gateworks/media-ctl-setup/master/media-ctl-setup
chmod + x media-ctl-setup

例子:

  • 模拟CVBS NTSC捕获

    v4l2-ctl --device / dev / v4l-subdev14-设置标准NTSC
    ./media-ctl-setup adv7180>设置
    源 ./setup
    
  • 模拟CVBS PAL捕获

    v4l2-ctl --device / dev / v4l-subdev14-设置标准PAL
    ./media-ctl-setup adv7180>设置
    源 ./setup
    
  • 数字HDMI捕获

    ./media-ctl-setup tda1997x>设置
     源 ./setup
    

请注意,在以上示例中,我们“获取”设置脚本而不是执行该脚本,以便它可以将诸如视频捕获设备之类的变量导出到DEVICE env变量,该变量可在下面的其他示例中使用。

请注意,media-ctl-setup每当输入源发生变化(即模拟NTSC-> PAL或HDMI输入格式(分辨率/色彩空间/帧速率))时,都需要重新运行脚本及其生成的输出命令。

请注意,对于许多模拟解码器芯片(例如Ventana上使用的adv7180),如果丢失或获得信号锁定(例如,在流开始后模拟视频输入已断开连接并重新连接或只是连接),则必须停止并重新启动流。这是因为许多模拟视频解码器在锁定后立即产生一些不完整的帧,因此必须丢弃这些帧,否则它们会使IMX6感到困惑。还有在这个时候放弃在主流Linux前几帧不支持,但是你可以使用包含在Gateworks媒体内核下面的补丁:https://github.com/Gateworks/linux-imx6/commit/fcab532

为了检测当捕获源输入的变化,你可以赶上V4L2_EVENT_SOURCE_CHANGE通过事件VIDIOC_DQEVENT的ioctl -见https://www.linuxtv.org/downloads/v4l-dvb-apis-old/vidioc-dqevent.html

IMX6 IPU MEM2MEM(硬件CSC /缩放/裁剪/旋转/翻转)

存在一个Linux V4L2 MEM2MEM imx-media驱动程序,该驱动程序允许利用IMX6 IPU图像转换器硬件模块(IC)执行硬件色彩空间转换(CSC),缩放,裁剪,旋转和翻转操作。

GStreamer video4linux2插件提供了一个元素,该元素使用此驱动程序将这些功能公开给GStreamer应用程序。

笔记:

  • 对于GStreamer-1.14,元素的名称取决于驱动程序向内核注册的视频设备(即,如果mem2mem驱动程序注册了/ dev / video8,则v4l2video8convert)
  • 对于GStreamer主设备(正在开发中),元素的名称始终为“ v4l2videoconvert”
  • kmssink下面的示例需要一个can-scale=false属性来告诉GStreamer不要通过KMS驱动程序进行缩放(因为IMX6 KMS驱动程序不支持缩放)
  • 确保输入格式与输出格式不同,否则GStreamer将完全绕过转换;请注意,GStreamer无法将翻转或旋转理解为格式的一部分。Gstreamer主设备(正在开发中)向v4l2videoconvert实体添加了“禁用直通”属性,该属性可以设置为强制进行转换,而与输入和输出格式无关
  • 使用imx实体(即捕获,编码/解码,mem2mem,显示)时,您可以指定“ output-io-mode = dmabuf-import”以共享零拷贝管道的dmabuf指针,但是如果使用非imx实体(即videotestsrc)您必须忽略这些,因为您不能确保缓冲区共享共享dmabuf指针所需的对齐方式/跨度

例子:

  • 确保mem2mem在您的内核中:

    〜#dmesg | grep mem2mem
     [    18 .356023 ] imx-media:将ipu_ic_pp mem2mem注册为/ dev / video8
    

请参阅下面的Gstreamer示例

IMX6尾随编码/解码驱动程序

Linux CODA驱动程序提供对IMX6硬件编码/解码编解码器的访问,而GStreamer video4linux2插件提供了可利用此功能的编码/解码元素。

例子:

  • 确保CODA在您的内核中:

    〜#dmesg | grep的结尾    
     [    16 0.721698 ]结尾2040000 .vpu:直接固件负载为 vpu_fw_imx6q.bin失败,错误-2
     [    16 0.721724 ]结尾2040000 .vpu:落回syfs回退为:vpu_fw_imx6q.bin
     [    18 0.381136 ]尾2040000 .vpu:使用备用固件vpu / vpu_fw_imx6q.bin
     [    18 .433648 ]尾码2040000 .vpu:固件代码修订版:570363 
    [    18 .433683] coda 2040000 .vpu:已初始化的CODA960。
    [    18 .433706 ] coda 2040000 .vpu:固件版本:3 .1.1
     [    18 .442312 ] coda 2040000 .vpu:编解码器注册为/ dev / video [ 9 -10 ]
    

请参阅下面的Gstreamer示例

捕获的例子

假设您已经配置了捕获设备(请参见上文),并将其设置为DEVICEenv变量,则以下示例对于捕获和流传输非常有用:

例子:

  • 基本原始帧捕获v4l2-ctl

    #1个捕捉帧
    用v412-CTL --device的/ dev / VIDEO4 --stream-MMAP --stream到= x.raw --stream计数= 1个
    #转换与ImageMagick的(假设你捕获的480p的YUV帧)
    转换-尺寸720x480-深度16 uyvy:x.raw frame.png
    

GStreamer捕获,显示和流示例

假设您已经配置了捕获设备(请参阅上文),并将其设置为DEVICEenv变量,以下示例是使用GStreamer进行捕获和流传输的有用示例。有关更明确的示例,请参见我们的GStreamer页面。

首先,请确保您已安装gstreamer。您可以选择所需的内容,但是以下内容将在Ubuntu系统上安装几乎所有内容:

#安装gstreamer:
 apt-get install libgstreamer1.0-0 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

捕获/显示

  • 显示捕获源:

    #显示kmssink
     gst-launch-1.0 v4l2src 设备= $ DEVICE!kmssink
     #display fbdevsink
     gst-launch-1.0 v4l2src 设备= $ DEVICE!v4l2video10convert output-io-mode = dmabuf-import!fbdevsink
    

捕获/编码

  • 确保GStreamer编码元素存在:

    〜#gst-inspect-1.0 | grep -e “ v4l2。* enc”
    video4linux2:v4l2h264enc:V4L2 H.264编码器
    video4linux2:v4l2mpeg4enc:V4L2 MPEG4编码器
    
  • 编码为JPEG(基于软件的编码)并通过RTP / UDP进行流传输:

    #stream JPEG / RTP / UDP
     gst-launch-1.0 v4l2src 设备= $ DEVICE!jpegenc!rtpjpegpay!udpsink 主机= $ SERVER  端口= $ PORT 
    #$ SERVER上的客户端:$ PORT可以通过'gst-launch-1.0 udpsrc port = 5000查看!application / x-rtp,payload = 96!rtpjpegdepay!jpegdec!autovideosink'
    
  • 编码为H264(基于硬件的编码)并通过RTP / UDP进行流传输:

    #流H264 / RTP / UDP
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
             v4l2video10convert output-io-mode = dmabuf-import!\
             v4l2h264enc output-io-mode = dmabuf-import!\
             rtph264pay!udpsink 主机= $ SERVER  端口= $ PORT 
    #$ SERVER上的客户端:$ PORT可以通过'gst-launch-1.0 udpsrc port = 5001 caps = application / x-rtp,payload = 96查看!rtph264depay!解码器!autovideosink'
    

  • “GST-cariable-RTSP服务器”是使用流媒体视频推荐的方法,你可以从我们的下载PPA

    add-apt-repository ppa:gateworks-软件/软件包
    apt-get安装gst-gateworks-apps
    
  • 使用以下命令安装此测试:

    #on SBC
     gst-variable-rtsp-server -p 9001 -u   “ videotestsrc!jpegenc!rtpjpegpayname = pay0 pt = 96”#在
    此示例中,使用测试源,该源可以是任何源。也可以使用其他编码方法。  
    
    
    #on工作站
     gst-launch-1.0 rtspsrc 位置= rtsp://192.168.1.1:9001 / stream 延迟= 10!解码器!自动视频接收器
    
    • 注意:gst-variable-rtsp-server启动时将显示IP 127.0.0.1,该IP被硬编码到程序中的print语句中,并且完全是任意的-忽略它。

转换

GStreamer video4linux2插件提供了一个元素,该元素使用此驱动程序将这些功能公开给GStreamer应用程序。

笔记:

  • 对于GStreamer-1.14,元素的名称取决于驱动程序向内核注册的视频设备(即,如果mem2mem驱动程序注册了/ dev / video8,则v4l2video8convert)
  • 对于GStreamer主设备(正在开发中),元素的名称始终为“ v4l2videoconvert”
  • kmssink下面的示例需要一个can-scale=false属性来告诉GStreamer不要通过KMS驱动程序进行缩放(因为IMX6 KMS驱动程序不支持缩放)
  • 确保输入格式与输出格式不同,否则GStreamer将完全绕过转换;请注意,GStreamer无法将翻转或旋转理解为格式的一部分。Gstreamer主设备(正在开发中)向v4l2videoconvert实体添加了“禁用直通”属性,该属性可以设置为强制进行转换,而与输入和输出格式无关
  • 使用imx实体(即捕获,编码/解码,mem2mem,显示)时,您可以指定“ output-io-mode = dmabuf-import”以共享零拷贝管道的dmabuf指针,但是如果使用非imx实体(即videotestsrc)您必须忽略这些,因为您不能确保缓冲区共享共享dmabuf指针所需的对齐方式/跨度

例子:

  • 确保mem2mem在您的内核中:

    〜#dmesg | grep mem2mem
     [    18 .356023 ] imx-media:将ipu_ic_pp mem2mem注册为/ dev / video8
    
  • 确保GStreamer元素存在:

    〜#gst-inspect-1.0 | grep -e “ v4l2。* convert”
    video4linux2:v4l2video8转换:V4L2视频转换器
    
    • 请注意,对于GStreamer-1.14,该元素的名称取决于驱动程序向内核注册的视频设备(上例中为video8)。这会在GStreamer-1.16中更改为始终为“ v4l2videoconvert”
  • 缩放/旋转/翻转使用videotestsrc(不能使用dmabufs,因为它是非imx实体)

    #高档
     gst-launch-1.0 videotestsrc!video / x-raw,宽度= 320,高度= 240!\
         v4l2video8convert!\
         video / x-raw,宽度= 640,高度= 480!kmssink can-scale = false 
    #缩减
     gst-launch-1.0 videotestsrc!video / x-raw,宽度= 640,高度= 480!\
         v4l2video8convert!\
         video / x-raw,宽度= 320,高度= 240!kmssink可以大规模= 假
    #旋转
     gst-launch-1.0 videotestsrc!video / x-raw,宽度= 320,高度= 240!\
         v4l2video8convert extra-controls = cid,rotate = 90!\
         video / x-raw,宽度= 240,高度= 320!kmssink can-scale = false 
    #hflip
     gst-launch-1.0 videotestsrc!video / x-raw,宽度= 320,高度= 240!\
         v4l2video8convert extra-controls = cid,horizo​​ntal_flip = 1!\
         video / x-raw,宽度= 640,高度= 480!kmssink can-scale = false 
    #vflip
     gst-launch-1.0 videotestsrc!video / x-raw,宽度= 320,高度= 240!\
         v4l2video8convert extra-controls = cid,vertical_flip = 1!\
         video / x-raw,宽度= 640,高度= 480!kmssink可以大规模= 假
    
    • 请注意,上面的示例会强制输入格式(在这种情况下为分辨率)不同于输出格式,否则gstreamer会认为v不必要的是v4l2convert实体,因为gstreamer不了解翻转/旋转属性。GStreamer主机(正在开发中)添加了“ disable-passthrough”属性,可以启用该属性来强制禁用passthrough
  • 使用imx-media捕获设备和KMS显示驱动程序缩放/旋转/翻转(可以使用dmabufs,因为它们都是imx硬件实体):

    #比例传感器输入到720p显示屏
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import!\
          video / x-raw,宽度= 1280,高度= 720!\
          kmssink can-scale = false 
    #比例传感器输入到1080p显示屏
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import!\
          video / x-raw,width = 1920,height= 1080!\
          kmssink can-scale = false 
    #缩放/翻转
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,horizo​​ntal_flip = 1!\
          video / x-raw,宽度= 1920,高度= 1080!\
          kmssink can-scale = false 
    #缩放/旋转
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
         v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,rotate = 90!\
          video / x-raw,宽度= 720,高度= 1280!\
          kmssink可以大规模= 假
    
  • 使用imx媒体捕获设备mem2mem设备和coda设备捕获,缩放,旋转,翻转和编码(可以使用dmabufs进行零复制)

    #编码
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import!\
          v4l2h264enc output-io-mode = dmabuf-import!\
          rtph264pay!udpsink host = $ SERVER  端口= $ PORT 
    #缩放/编码
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import!\
          video / x-raw,width = 1440,height =960!\
          v4l2h264enc output-io-mode = dmabuf-import!\
          rtph264pay!udpsink host = $ SERVER  端口= $ PORT 
    #scale / flip / encode
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,horizo​​ntal_flip = 1!\
          video / x-raw,宽度= 1440,高度= 960!\
          v4l2h264enc output-io-mode =dmabuf-import!\
          rtph264pay!udpsink host = $ SERVER  端口= $ PORT 
    #缩放/旋转/编码
     gst-launch-1.0 v4l2src 设备= $ DEVICE!\
          v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,rotate = 90!\
          video / x-raw,宽度= 1440,高度= 960!\
          v4l2h264enc output-io-mode = dmabuf-import!\
          rtph264pay!udpsink 主机=$ SERVER  端口= $ PORT
    

EDID

HDMI源要求HDMI接收器(即监视器/捕获设备)提供EDID,以了解允许的格式。这是在v4l2捕获设备(例如tda1997x)上完成的,方法是在捕获设备的子设备上使用'v4l2-ctl --set-edid'。然后,捕获设备会将其提供给HDMI源(它摆动其HPD线,相当于热插拔),然后HDMI源将向接收器(捕获设备)提供兼容的内容,然后您可以进行查询。您可以提供原始的EDID二进制文件,也可以提供一种类型,它将导致内核从中自动生成兼容的EDID。

例子:

  • 显示设置edid的选项:

    v4l2-ctl --help-edid
    
  • 通过描述向tda1997x提供EDID:

    v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) -- set -edid = 类型= hdmi
    
  • 通过二进制文件提供EDID

    v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) -- set -edid = file = edid.hex #hex
     v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) -- set -edid = file = edid.bin,format = raw #二进制
    
  • 清除EDID:

    v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” )-- clear-edid
    
  • 急躁

    #以十六进制格式显示它
     v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) -- get -edid = format = hex
     #将其保存到文件
     v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) -- get -edid pad = 0,file = edid.hex,format = hex #hex
     v4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) - get-edid 文件= edid.bin,格式=原始#二进制
    

笔记:

  • 上面的命令没有提供可选的'pad'参数,因为它默认为pad 0,这是tda1997x的唯一pad
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这