gstreamer

gstreamer,第1张

Pads 分类:

永久型(always)

随机型(sometimes)

请求型 (on request)

如下:filsrc 衬垫类型为永久型

播放本地文件:

播放同时录制视频

通过make_element 生液孝成 插件文件:

修改src/Makefile.am

编译

将编译好的libgstexamplefilter.la libgstexamplefilter.so 复制到指定橘茄的运行闹伍稿目录下。

测试插件:

By Toradex胡珊逢

NXP i.MX8QM/QP处理器能够支持2路4 lane的MIPI CSI-2输入,每路最高为4K@30分辨率。文章接下来将使用Apalis iMX8QM计算机模块配合e-con提供的MIPI CSI-2摄像头AR0521进行演示。

E-con MIPI CSI-2摄像头 AR0521  最高像素2592 × 1944@28fps,模组集成ISP。摄像头可以直接连接 Ixora  底板,连接方式如下。线材的卡扣很精密,安装时请小心 *** 作。同时接触摄像头模组前,务必释放上手的静电,如触摸接地设备的金属机壳。

Apalis iMX8QM的Linux BSP对摄像头提供无缝集成,只需简单的设置即可使用。这里我们使用Toradex最新的 nightly image 。由于摄像头需要使用gstreamer组件,tdx-reference-multimedia-image参考镜像包含了常用多媒体软件,该镜像可以直接用于测试摄像头。使用 Toradex Easy Installer 进行镜像安装。

安装完毕后修改计算机模块上的/boot/overlays.txt文件,通过device tree overlay启动AR0521。在overlays.txt中添加apalis-imx8_ar0521_overlay.dtbo。

关闭tdx-reference-multimedia-image开机自启动的Qt演示程序。

重启后可以看到AR0521被正确识别。

l  查看摄像头支持的格式

l  预览摄像头画面

此时可能需要旋转摄像头上镜头进行对焦,直到清晰毕迟地看到拍摄物体。

l  录制摄像

可以将test.avi视频文件复制到电脑上,使手物李用mediainfo命令查看该文件的视频信息。

Gstreamer pipeline还可以支持zero-copy方式处理数据。借助zero-copy CPU能够使用一个element产生的数据而无需重新复制,从而有效降低CPU负荷。使用io-mode参数开启zero-copy,io-mode=dmabuf会使用硬件DMA。更多的说明请参考 i.MX 8 GStreamer User Guide 。

两种模式下CPU占用率从101.7%下降到10.6%。

l  播放视频文件

播放上面录制的avi视频文件

l  RTP网络传输

Apalis iMX8QM作为RTP服务器

Ubuntu电脑作为客户端查看视频。上面的PC_IP为电脑的IP地址。

总结

本文简要地介绍了在Apalis iMX8QM使用MIPI-CSI摄像头的方法。不同的摄像头通常需要对应的驱动,并蚂悔根据摄像头参数调整gstreamer pipeline配置,从而实现高效的采集、编解码、传输和存储。

Application Development Manual

Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。

GStreamer 的核心功能是为插件、数据备山流和媒体类型处理/协商提供框架。它还提供了一个 API 来使用各种插件编写应用程序。

GStreamer 提供

Gstreamer框架根据各个模块的成仿答中熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:

Element是Gstreamer中最重要的对象类型之一。一个element实现一个功能(读取文件,解码,输出等),程序需要创建多个element,并按顺序将其串连起来(使用管道 ! ),构成一个完整的pipeline。

官方Elements与Plugins Lists

element主要有三种:

pads 是元素与外界的接口,有两个属性定义:方向和可用性。两个element必须通过pad才能连接起来,在element通过pad连接成功后,数据会从上一举慎个element的src pad传到下一个element的sink pad然后进行处理。一个element可以同时拥有多个相同的pad。

bin 是一个容器元素,用于管理多个element。由于 bin 本身就是一个元素,因此可以以与任何其他元素相同的方式处理 bin。改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次 *** 作我们所使用的element。通过bin降低了应用的复杂度。

Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。

示例:通过下面的命令播放文件时,会创建如下pipeline:

这个pipeline由8个element构成,每个element都实现各自的功能:

filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出;theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。

参考 Installing on Linux

API reference

示例应用helloworld.c

编译应用


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12298393.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存