基于Gstreamer框架的ffmpeg流媒体编解码设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Software Development •

软件开发

Electronic Technology & Software Engineering 电子技术与软件工程• 43

【关键词】ffmpeg gstreamer 编解码 流媒体

把采集的yuv 格式通过ffmpeg 编解码库编码成h264格式,再通过网络传输到室内播放终端,在室内机终端设备再通过ffmpeg 解码器转换为yuv420p 格式,最终转换为RGB 格式,并在Linux 系统的ARM 平台上利用QT 图形化界面显示。最终实现了数字可视对讲系统功能实现的整个流程。

基于Gstreamer 框架的ffmpeg 流媒体编解码设计

文/王锋1 陆凯2

Gstreamer 是一个基于管道Pipeline 的多

媒体应用框架,采用C 语言编程,但是通过gObject ,将各插件封装成面向对象编程的工具。元件 Element 是Gstreamer 最重要和基本的对象类,通过插件Plugin 的形式提供,多个元件Elements 可以组合为箱柜bin ,并进一步聚合形成一个管道Pipeline 完成一个多媒体应用处理。目前是嵌入式Linux 最为常用的处理多媒体应用框架。我们主要是在ffmpeg 多媒体编解码的过程中加入Gstreamer 的应用框架。

1 基于gstreamer的流媒体可视对讲系统开发过程

Gstreamer 框架中使用gst-launch 命令进行流媒体播放,我们在开发过程中,主要使用gst-launch 在终端编译和运行一条pipeline 用于播放多媒体。gst-launch-0.10 或gst-launch-1.0一般ubuntu 系统自带,相关插件包可通过wget 下载opky 安装。由于是基于嵌入式ARM 芯片的流媒体开发,还需交叉编译相关

gstreamer 动态库移植到下位机平台,如glib 库、gstreamer 插件库libgstqt5videosink.so 、qt5lib 库libQt5GLib-2.0.so 、libQt5GStreamer-1.0.so 等。 开发过程中调用的gst 代码有gst-ffmpeg-0.11.2、gst-libav-1.14.4等。

1.1 用GStreamer作v4l2摄像头采集和输出到YUV文件

由于需要做摄像头的视频采集,所以首先在内核中添加视频采集模块Video4Linux2,它是一种内核设备驱动,主要为Linux 下的应用程序编程提供视频设备接口函数,同时,由于我们是基于GStreamer 框架开发,故在v4l2摄像头采集中加入GStreamer 插件的方式进行开发。其中 Video4Linux2插件是一个用于捕捉和播放视频的API 和驱动框架,支持一般的摄像头设备。

v4l2本身不仅仅是支持视频采集功能,它还支持其他的视频功能,元件v4l2src 属于Video4Linux2插件,用于读取Video4Linux2用户有更自由灵活的选择,丰富产品多样性满足需求;其次快捷支付扫码应用平台管理系统在传统微信支付、支付宝支付等第三方移动支付平台的安全保障的基础上,还提供了自己的一套安全保障措施,让用户享受更好用户体验的同时,给用户提供更好的资金安全保障;最后,快捷支付扫码应用平台管理系统还提供了支付分析、收入分析等统计和预测的功能,让用户可以简介明了地查阅相关收支记录与历史统计,方便用户对移动支付的整体控制与预期控制。

4 系统测试

经过内部测试和系统预发布测试,快捷支付扫码应用平台管理系统具有良好的系统适应性与兼容性,友好的操作界面,系统功能完善,操作直观方便,易学易用,能够与运用广泛的微信支付、支付宝支付无缝结合,实用性强,系统内拥有独立的安全检测机制,大大提高了系统的安全性,在保证用户体验的同时保障用户资金安全。

5 总结

<<上接42页

移动互联网的时代悄悄到来,智能手机及各式各样手持装置的日渐普及,消费者购物时使用的支付工具也面临着巨大改变,互联网到移动互联网,网络支付到移动支付,移动支付在短短数年间已经成为最火热的应用增长点。快捷支付扫码应用平台管理系统通过系统内后台模版配置和动态调整等为用户提供整合、高可用及动态弹性分配,能够快速部署和使用系统内数据存储信息,同时提升了传统资源下数据共享之间的关系,用来对快捷支付进行扫码应用,具体有支付分析、支付统计、支付保护等功能组成。经过内部测试和系统预发布测试表明,快捷支付扫码应用平台管理系统具有良好的系统适应性与兼容性,友好的操作界面,系统功能完善,操作直观方便,易学易用,安全可靠等优点,是一款值得推广实用的新型移动支付系统。

参考文献

[1]魏国强.移动运营商主导的移动电子商

务的支付模式研究[D].重庆:重庆大学,2012.

[2]马近朱.新城镇化与第三方支付机构

的移动支付业务[J].北京:中国信用卡,2013(09):52.

[3]王娜.对国内移动支付产业发展的思考

[J].北京:时代经贸:下旬,2016(01).89.[4]张海霞.我国移动支付商业模式探索[J].

山西:山西科技,2014(01):13.

[5]肖心怡.基于用户目标的以信息为中心的

手机交互设计[D].湖南:湖南大学,2014.[6]卢益清.中国移动支付现状与前景探析

[J].北京:卷宗,2015(09).143.[7]陈化南.NFC 成为移动支付主流技术[J].

上海:电信快报网络与通信,2015(09):43.

作者简介

石宸彬,曲阜师范大学信息科学与工程学院网络工程2018级二班。

作者单位

曲阜师范大学信息科学与工程学院网络工程2018级 山东省曲阜市 276826

软件开发 •Software Development 设备的视频帧,这里即为摄像头。v4l2src是

使用v4l2接口的视频源插件,只是用来做视

频采集的,支持多种格式的视频采集,例如

rgb格式和yuv格式。

在Linux系统中V4L2驱动的摄像头数据

采集我们采用内存映射方式(mmap)进行图像

采集。数据的采集从/dev/video0设备文件。

视频采集过程如下:

(1)创建一条名为pipe的新管

道 pipe=gst_pipeline_new("pipe");管道在GStreamer框架中是用来容纳和管理元件的。

(2)调用gst_element_factory_make函数,

创建v4l2src、jpegenc、filesink插件,分别作

为输入数据源元件、过滤器元件、输出数据源

元件,并调用g_object_set设置元件的属性,

输入源v4l2src的device属性设置一下,指定

采集设备的名称:并对输入源指定帧数量,最

后创建filesink插件后设置文件的保存路径。

如图1所示。

(3)判断管道与元件创建无问题,调用

gst_bin_add_many()函数添加已创建好的三个

元件到pipe管道中,并按顺序连接起来,可

以更好的让数据流动。如图2所示。

(4)调用gst_pipeline_get_bus()获取管

道的消息总线,并添加消息总线监视器,释放

线资源。如图3所示。

(5)在管道创建完成并添加消息监视器

后,切换管道状态PLAYING状态,来启动整

个管道的数据传输处理流程,处理完成停止管

道并释放占用的资源。在创建管道之前先创建

了一个 loop=g_main_loop_new(NULL,FALSE);

循环体,g_main_loop_run()则是进入主循环在

这里我们调用启动它。有事件时,它就处理事

件,没事件时就睡眠状态。如图4所示。

1.2 用GStreamer作Ffmpeg视频编码和解码

V4l2摄像头视频采集完成后生成的yuv格式数据量很大,便于传输我们需要把YUV422的像素数据编码为H.264的压缩编码

数据,传输完成后再进行数据的解码。在此采

取Gstreamer管道的方式进行Ffmpeg编解码,所以需要安装ffmpeg库、x264库之外,还需安装Gstreamer ffmpeg插件等。

1.2.1 插件的初始化

ffpmepg插件的初始化直接就是通过plugin_init()函数注册到Gstreamer中的,每个plugin都是在plugin_init()函数中通过gst_element_register()函数将plugin的相应信息注

册到gstreamer中。首先调用av_register_all()

函数注册编码器,该函数是所有使用编码器、

复用器的基础,在所有基于ffmpeg的应用程

序中几乎都是第一个被调用的。

接着调用ffmepeg编解码注册函数gst_

ffmpegenc_register (plugin); gst_ffmpegdec_

register (plugin)等。通过gst_element_register()

函数将plugin的相应信息注册到gstreamer中。

通过该函数,可以创建一个名称为name、优

先级为rank的type类型elementfactory,并将

elementfactory添加到registry。在我们自己编

写的插件中,将元件等级rank的值设置为比

GST_RANK_PRIMARY大即大于256就可,v4l2src=gst_element_factory_make("v4l2src","input");

g_object_set(G_OBJECT(v4l2src),"device", device_filename, NULL);

g_object_set(G_OBJECT(v4l2src),"num-buffers",1,NULL);

jpegenc=gst_element_factory_make("jpegenc","process");

filesink=gst_element_factory_make("filesink","output");

g_object_set(G_OBJECT(filesink),"location","test1.jpg",NULL);

g_object_set(G_OBJECT(v4l2src),"num-buffers",1,NULL);

图1

图2

图3

图4

图5

gst_bin_add_many(GST_BIN(pipe),v4l2src,jpegenc,filesink,NULL);

gst_element_link_many(v4l2src,jpegenc,filesink,NULL);

bus=gst_pipeline_get_bus(GST_PIPELINE(pipe));

gst_bus_add_watch(bus,busCallBack,loop);

gst_object_unref(bus);

gst_element_set_state(pipe,GST_STATE_PLAYING);

g_main_loop_run(loop);

gst_element_set_state(pipe,GST_STATE_NULL);

gst_object_unref(GST_OBJECT(pipe));

udpsink = gst_element_factory_make ("udpsink", "sink");

g_object_set( udpsink, "host", "127.0.0.1", NULL );

g_object_set( udpsink, "port", 6, NULL );

44 •电子技术与软件工程 Electronic Technology & Software Engineering

相关文档
最新文档