GStreamer笔记
Tofloor
poster avatar
z85525006
deepin
2012-09-18 23:40
Author
由于本人在使用和学习GStreamer,所以作了个笔记来翻查,请各位见谅,误喷.

   
'''
gst.Bin
是GStreamer框架中的容器元件,它通常被用来容纳其它的元件对象,
但由于其自身也是一个GstElement对象,因此实际上也能够被用来容纳其它的箱柜对象。
利用箱柜可以将需要处理的多个元件组合成一个逻辑元件,
由于不再需要对箱柜中的元件逐个进行操作,
因此能够很容易地利用它来构造更加复杂的管道。
在GStreamer框架中使用箱柜还有另外一个优点,那就是它会试着对数据流进行优化,
这对于多媒体应用来讲是很具吸引力的.
==================================================
在GStreamer应用程序中使用的箱柜主要有两种类型:
[] GstPipeline 管道是最常用到的容器,
   对于一个GStreamer应用程序来讲,其顶层箱柜必须是一条管道。
[] GstThread 线程的作用在于能够提供同步处理能力,
   如果GStreamer应用程序需要进行严格的音视频同步,一般都需要用到这种类型的箱柜。
===================================================
GStreamer框架提供了两种方法来创建箱柜:一种是借助工厂方法,另一种则是使用特定的函数。
下面的代码示范了如何使用工厂方法创建线程对象,以及如何使用特定函数来创建管道对象:

gst.Pipeline(\"pipeline_name\") # 创建管道对象

element = gst.element_factory_make(\"...\", ..) #
bin = gst.Bin(\"bin_name\")
bin.add(element)

# 这种方式是为了解决 Bin与其它带来的问题.
bin.add_pad() # 输入衬垫 和 输出衬垫
'''


代码分析:
  1. import gst
  2. import gobject
  3. class VideoFade(gst.Bin):
  4.     """
  5.     Simple video fade element
  6.     """
  7.     def __init__(self, position=0, duration=2 * gst.SECOND, fadefromblack=True):
  8.         gst.Bin.__init__(self)
  9.         self.incsp = gst.element_factory_make("ffmpegcolorspace", "incsp")
  10.         self.outcsp = gst.element_factory_make("ffmpegcolorspace", "outcsp")
  11.         self.alpha = gst.element_factory_make("alpha", "alpha")
  12.         self.vmix = gst.element_factory_make("videomixer", "videomix")
  13.         self.vmix.set_property("background", 1)
  14.         self.add(self.incsp, self.alpha, self.vmix, self.outcsp)
  15.         gst.element_link_many(self.incsp, self.alpha, self.vmix, self.outcsp)
  16.         self._sinkpad = gst.GhostPad("sink", self.incsp.get_pad("sink"))
  17.         self._sinkpad.set_active(True)
  18.         self._srcpad = gst.GhostPad("src", self.outcsp.get_pad("src"))
  19.         self._srcpad.set_active(True)
  20.         self.add_pad(self._sinkpad)
  21.         self.add_pad(self._srcpad)
  22.         self.startposition = position
  23.         self.duration = duration
  24.         self.fadefromblack = fadefromblack
  25.         self.alphacontrol = gst.Controller(self.alpha, "alpha")
  26.         self.alphacontrol.set_interpolation_mode("alpha", gst.INTERPOLATE_LINEAR)
  27.         self._resetControllerValues()
  28.     def setStartPosition(self, position):
  29.         """ Set the position at which the fade should start """
  30.         if position == self.startposition:
  31.             return
  32.         self.startposition = position
  33.         self._resetControllerValues()
  34.     def setDuration(self, duration):
  35.         """ Set the duration (in ns) of the fade """
  36.         if self.duration == duration:
  37.             return
  38.         self.duration = duration
  39.         self._resetControllerValues()
  40.     def setFadeFromBlack(self, fromblack):
  41.         """ Set which directio we should use.
  42.         True : From Black
  43.         False : To Black
  44.         """
  45.         if self.fadefromblack == fromblack:
  46.             return
  47.         self.fadefromblack = fromblack
  48.         self._resetControllerValues()
  49.     def _resetControllerValues(self):
  50.         self.alphacontrol.unset_all("alpha")
  51.         if self.fadefromblack:
  52.             start = 0.0
  53.             stop = 1.0
  54.         else:
  55.             start = 1.0
  56.             stop = 0.0
  57.         self.alphacontrol.set("alpha",
  58.                               self.startposition,
  59.                               start)
  60.         self.alphacontrol.set("alpha",
  61.                               self.startposition + self.duration,
  62.                               stop)
  63. gobject.type_register(VideoFade)
Copy the Code

1.输入型组件 source element. 这种组件会向管道提供媒体数据,比如文件访问组件,声音获取组件等。
2.过滤型组件 filter element, 它把输入型组件(souce element)中获取的媒体数据进行处理,比如格式转换,解复用 demuser, 复用muxer, 编解码codec等。
3.输出型组件 sink element, 这类组件负责媒体数据的最后的输出,比如输出到音频设备,视频设备,以及输出到文件,网络等。



读取XML文件:
  1. #coding:utf-8
  2. import xml.etree.ElementTree
  3. tree = xml.etree.ElementTree.parse("n900.xml")
  4. for child in tree.getroot().getchildren():
  5.     if child.tag == "make":   
  6.         print "%s" % child.text.strip()
  7.     elif child.tag == "version":
  8.         print "%s" % child.text.strip()
  9.     elif child.tag == "author":
  10.         for child in child.getchildren():
  11.             if child.tag == "name":
  12.                 print "%s:" % child.tag
  13.             elif child.tag == "email":
  14.                 print "%s:" % child.tag
Copy the Code


小例子:
  1. #coding:utf-8
  2. import gst
  3. # 创建用来容纳元件的新管道.
  4. pipeline = gst.Pipeline("pipeline")
  5. #
  6. # 依次创建各个元件,并将各个元件添加到管道中.
  7. #
  8. # 创建源元件用来从v412驱动中获取视频流.
  9. source = gst.element_factory_make("gconfvideosrc", "v412src")
  10. pipeline.add(source)
  11. # 创建过滤器元件, 解码视频流.
  12. ffmpeng1 = gst.element_factory_make("ffmpegcolorspace",
  13.                                     "ffmpegcolorspace")
  14. pipeline.add(ffmpeng1)
  15. # 创建过滤器元件, 解码视频流.
  16. ffmpeng2 = gst.element_factory_make("ffmpegcolorspace",
  17.                                     "ffmpegcolorspace2")
  18. pipeline.add(ffmpeng2)
  19. # 创建过滤器元件, 解码视频流.
  20. ffmpeng3 = gst.element_factory_make("ffmpegcolorspace",
  21.                                     "ffmpegcolorspace3")
  22. pipeline.add(ffmpeng3)
  23. # 依次连接各个组件.
Copy the Code

由于解码的文件比较多,可以对照一个表.
gstreamer使用进阶 - android_lee的专栏 - 博客频道 - CSDN.NET.html.tar.gz


      # 监视消息. 有点像 WINDOW写 SDK或者是XLIB的样子,在循环消息里面 进行类型判断,看是那种消息.
       bus = self.pipeline.get_bus() # pipeline get_bus() 得到一个管道的 gstBUS
       bus.add_watch(self.on_message)


      #
       self.fileoutput = gst.element_factory_make("filesink", "fileoutput")
       self.fileoutput.set_property("location", "文件路径名")


  1. { 'Ogg' : "application/ogg",
  2.         'Matroska' : "video/x-matroska",
  3.         'MXF' : "application/mxf",
  4.         'AVI' : "video/x-msvideo",
  5.         'Quicktime' : "video/quicktime,variant=apple",
  6.         'MPEG4' : "video/quicktime,variant=iso",
  7.         'MPEG PS' : "video/mpeg,mpegversion=2,systemstream=true",
  8.         'MPEG TS' : "video/mpegts,systemstream=true,packetsize=188",
  9.         'AVCHD/BD' : "video/mpegts,systemstream=true,packetsize=192",
  10.         'FLV' : "video/x-flv",
  11.         '3GPP' : "video/quicktime,variant=3gpp", \
  12.         'ASF' : "video/x-ms-asf, parsed=true", \
  13.         'WebM' : "video/webm", \
  14.         'No container' : False }
  15.   { 'Ogg' : ".ogg", \
  16.         'Matroska' : ".mkv", \
  17.         'MXF' : ".mxf", \
  18.         'AVI' : ".avi", \
  19.         'Quicktime' : ".mov", \
  20.         'MPEG4' : ".mp4", \
  21.         'MPEG PS' : ".mpg", \
  22.         'MPEG TS' : ".ts", \
  23.         'AVCHD/BD' : ".m2ts", \
  24.         'FLV' : ".flv", \
  25.         '3GPP' : ".3gp",
  26.         'ASF' : ".asf", \
  27.         'WebM' : ".webm", \
  28.         'No container' : ".null" }
  29.   { 'Ogg' : ".ogg", \
  30.         'Matroska' : ".mkv", \
  31.         'MXF' : ".mxf", \
  32.         'AVI' : ".avi", \
  33.         'Quicktime' : ".m4a",
  34.         'MPEG4' : ".mp4", \
  35.         'MPEG PS' : ".mpg", \
  36.         'MPEG TS' : ".ts", \
  37.         'FLV' : ".flv", \
  38.         '3GPP' : ".3gp", \
  39.         'ASF' : ".wma", \
  40.         'WebM' : ".webm" }
  41. {
  42.          'audio/mpeg, mpegversion=(int)1, layer=(int)3' : ".mp3", \
  43.          'audio/mpeg, mpegversion=(int)4, stream-format=(string)adts' : ".aac", \
  44.          'audio/x-flac' : ".flac" }
  45. { 'Vorbis' : "audio/x-vorbis", \
  46.         'FLAC' : "audio/x-flac", \
  47.         'mp3' : "audio/mpeg, mpegversion=(int)1, layer=(int)3", \
  48.         'AAC' : "audio/mpeg,mpegversion=4", \
  49.         'AC3' : "audio/x-ac3", \
  50.         'Speex' : "audio/x-speex",
  51.         'Celt Ultra' : "audio/x-celt", \
  52.         'ALAC' : "audio/x-alac", \
  53.         'Windows Media Audio 2' : "audio/x-wma, wmaversion=(int)2", \
  54.         'Theora' : "video/x-theora", \
  55.         'Dirac' : "video/x-dirac", \
  56.         'H264' : "video/x-h264", \
  57.         'MPEG2' : "video/mpeg,mpegversion=2,systemstream=false", \
  58.         'MPEG4' : "video/mpeg,mpegversion=4", \
  59.         'xvid' : "video/x-xvid", \
  60.         'Windows Media Video 2' : "video/x-wmv,wmvversion=2", \
  61.         'dnxhd' : "video/x-dnxhd", \
  62.         'divx5' : "video/x-divx,divxversion=5", \
  63.         'divx4' : "video/x-divx,divxversion=4", \
  64.         'AMR-NB' : "audio/AMR", \
  65.         'H263+' : "video/x-h263,variant=itu,h263version=h263p", \
  66.         'On2 vp8' : "video/x-vp8", \
  67.         'mp2' : "audio/mpeg,mpegversion=(int)1, layer=(int)2", \
  68.         'MPEG1' : "video/mpeg,mpegversion=(int)1,systemstream=false"}
Copy the Code

gst.Caps(*args, *kwargs)
如果没有参数传给构造函数,一个空的caps将会创建,否则你可以传递一个字符串或者一个结构.
Reply Favorite View the author
All Replies
z85525006
deepin
2012-09-19 10:55
#1
Reply View the author