媒体控制器
现代的片上系统(SoC)设备以内部硬件模块的方式支持广泛的功能,这导致采用多种方式互连SoC中的功能,从而改变了V4L设备的内容。
媒体控制器内核API旨在将有关媒体设备和捕获设备的详细信息公开给用户空间,以使它们可以在运行时以动态和复杂的方式互连。
媒体控制器设备将实体公开给媒体控制器框架。每个实体具有一个或多个源极焊盘和一个或多个汇聚焊盘。您可以使用媒体控制器内核API(即通过media-ctl
)来查询实体,将源填充链接到接收填充,以及设置填充格式。
请注意,IMX6媒体控制器驱动程序是在4.13内核中添加到Linux的。此页面适用于Linux 4.13及更高版本。如果您使用的内核早于基于Ventana IMX6的主板的内核(例如Gateworks 3.14内核),则需要使用Yocto GStreamer页面:
- Yocto / gstreamer
- Yocto / gstreamer /合成
- Yocto / gstreamer / latency
- Yocto / gstreamer /多媒体
- Yocto / gstreamer /流媒体
- Yocto / gstreamer /视频
media-ctl(v4l-utils软件包)
在media-ctl
从为v41-utils软件包的应用程序是使用Linux的媒体控制器API来配置管道用户空间应用程序。
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将所有链接重置为非活动状态
可视化可用于互连的硬件组件的最佳方法是使用打印拓扑并将其转换为图形图像:
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/:
- GW5510
- GW5514
- GW540x
用于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接收器媒体控制器驱动程序一样,提供了一个实体。
参考文献:
- Linux的IMX媒体驱动程序文档
内核驱动程序
需要为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路由到IC,以进行最大1024x1024分辨率,CSC,翻转和图像旋转的缩放:
- 运动补偿去隔行:
- 将帧从CSI直接路由到VDIC,以进行运动补偿(高模式)去隔行,缩放至1024x1024,CSC,翻转和旋转:
传感器-> ipu_csi_mux-> ipu_csi-> ipu_vdic-> ipu_ic_prp-> ipu_ic_prpvf-> ipu_ic_prpvf捕获
- 将帧从CSI直接路由到VDIC,以进行运动补偿(高模式)去隔行,缩放至1024x1024,CSC,翻转和旋转:
请注意,为了帮助使用控件的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示例
捕获的例子
假设您已经配置了捕获设备(请参见上文),并将其设置为DEVICE
env变量,则以下示例对于捕获和流传输非常有用:
例子:
- 基本原始帧捕获
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捕获,显示和流示例
假设您已经配置了捕获设备(请参阅上文),并将其设置为DEVICE
env变量,以下示例是使用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
捕获/显示
- 显示捕获源:
#显示kmssinkgst-launch-1.0 v4l2src 设备= $ DEVICE!kmssink#display fbdevsinkgst-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 / UDPgst-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 / UDPgst-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 SBCgst-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 #hflipgst-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 #vflipgst-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 / encodegst-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 #hexv4l2-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 #hexv4l2-ctl -d $( media-ctl -e “ tda19971 2-0048” ) - get-edid 文件= edid.bin,格式=原始#二进制
笔记:
- 上面的命令没有提供可选的'pad'参数,因为它默认为pad 0,这是tda1997x的唯一pad