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

媒体控制器

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

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

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

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

media-ctl(v4l-utils软件包)

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

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

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

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

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

例如,如下是GW5404的图形: 服务器

你能够找到视频捕获设备存在各类gateworks板在图表http://dev.gateworks.com/docs/linux/media/并发

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

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
相关文章
相关标签/搜索