在IMX6平台上基于gstreamer实现WIFI摄像头功能

最近在imx6上实现了WIFI摄像头功能。摄像头采集的视频数据,可以通过WIFI传输到PC机上进行实时直播。下面分别对Gstreamer和它的使用进行简单介绍。

一、Gstreamer简介:

Gstreamer是一个基于Pipeline的多媒体框架,基于Gobject,用C语言写成,是目前嵌入式Linux最为常用的多媒体应用框架。元件(Element)是Gstreamer最重要和基本的对象类,通过插件(Plugin)的形式提供,多个Element可以组合为箱柜(bin),并进行进一步聚合成一个管道(Pipeline)完成一个多媒体应用处理。

  1. 元件(Element) 
    元件(Element)是GStreamer中很重要的概念。元件相当于一个可以执行特定功能的黑盒子,数据流从元件的sink端流入,经过元件的处理,从src端流出。你可以创建你所需要功能的元件,将其按照你所想处理数据流的步骤顺序连接起来,从而完成你所想要实现的功能。 
    例如helloworld.c中创建了6个元件,分别是管道pipeline、源元件source、分析器parser、解码器decoder、转换器converter和接收元件sink,每个元件都有自己的特定的功能。GStreamer已经默认安装了很多有用的元件,当然如果有需要,也可以自己写一个新的元件来使用。把这些元件连接在一起就可以执行你所指定的特殊任务了。
  2. 箱柜(Bin)和 管道(Pipeline) 
    箱柜(Bin)也是一个元件!它是一种可以来装载其他元件的元件。相当于一个大的容器,把你所连接起来的元件装在这个容器中,就可以通过改变一个箱柜的状态改变在这个箱柜中所有元件的状态。 
    管道(Pipeline)是一种特殊的箱柜,通常我们都将元件放入管道中,数据流的流动状态可以通过设定管道的状态来实现。 
    箱柜可以发送总线消息(bus message)给它的内部元件,这些消息包括:错误消息(error messages),标签消息(tag messages),EOS消息(EOS messages)。根据这些消息,我们可以对总线做出相应的处理。
  3. 衬垫(Pad) 
    衬垫(Pad)相当于一个元件的插口,各个元件通过这个插口进行连接,这样数据流就可以在这些元件中进行传输。衬垫会限制特定的数据流类型通过,所以只有当两个衬垫的数据类型一致时,才能建立连接。 
    数据流的流向都是从一个元件的源衬垫(src)到另一个元件的接收衬垫(sink)。 
    一个完整管道的形象描述
  4. 功能(Cap) 
    衬垫有限制特定的数据流流过的功能,那这个功能就是通过功能(Cap)来描述的。功能(Cap)描述了能够通过衬垫或当前通过衬垫的数据流。我们可以
  5. 总线(Bus) 
    每一个管道默认包含一个总线,应用程序不需要再创建总线。应用程序在总线上设置一个消息处理器。当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务。
  6. 缓冲区(Buffer) 
    缓冲区包含了你创建的管道里的数据流。通常一个源元件会创建一个新的缓冲区,同时元件还将会把缓冲区的数据传递给下一个元件。元件会自动处理缓冲区,不需要自己来处理。
  7. 事件(Events) 
    事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。下游事件通知流状态相同的元件,可能的事件包括中断,flush,流的终止信号等等。

二、使用Gstreamer实现视频采集传输和接收:

imx6端:

    采集并发送:gst-launch -v mfw_v4lsrc fps-n=30 ! video/x-raw-yuv, width=(int)640, height=(int)480, framerate=(fraction)30/1, format=(fourcc)I420 ! vpuenc codec=6 ! queue ! rtph264pay ! udpsink host=192.168.xx.xx port=5000 sync=false

    注:host=192.168.xx.xx 是接收端的IP

Ubuntu端:

    接收:gst-launch-0.10 gstrtpbin name=rtpbin latency=100 udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, \
encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z0JAHqaAoD2QAA\\=\\=\\,aM4wpIAA\", payload=(int)96, ssrc=(uint)2265043962, \
clock-base=(uint)1509100221, seqnum-base=(uint)31542" port=5000 ! rtph264depay ! decodebin ! ffmpegcolorspace ! videoscale ! ximagesink sync=false

参考:https://blog.csdn.net/ckx20/article/details/53214048

猜你喜欢

转载自blog.csdn.net/bhj1119/article/details/80067997