Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
GStreamer笔记
社区开发
4714
views ·
1
replies ·
To
floor
Go
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() # 输入衬垫 和 输出衬垫
'''
代码分析:
import gst
import gobject
class VideoFade(gst.Bin):
"""
Simple video fade element
"""
def __init__(self, position=0, duration=2 * gst.SECOND, fadefromblack=True):
gst.Bin.__init__(self)
self.incsp = gst.element_factory_make("ffmpegcolorspace", "incsp")
self.outcsp = gst.element_factory_make("ffmpegcolorspace", "outcsp")
self.alpha = gst.element_factory_make("alpha", "alpha")
self.vmix = gst.element_factory_make("videomixer", "videomix")
self.vmix.set_property("background", 1)
self.add(self.incsp, self.alpha, self.vmix, self.outcsp)
gst.element_link_many(self.incsp, self.alpha, self.vmix, self.outcsp)
self._sinkpad = gst.GhostPad("sink", self.incsp.get_pad("sink"))
self._sinkpad.set_active(True)
self._srcpad = gst.GhostPad("src", self.outcsp.get_pad("src"))
self._srcpad.set_active(True)
self.add_pad(self._sinkpad)
self.add_pad(self._srcpad)
self.startposition = position
self.duration = duration
self.fadefromblack = fadefromblack
self.alphacontrol = gst.Controller(self.alpha, "alpha")
self.alphacontrol.set_interpolation_mode("alpha", gst.INTERPOLATE_LINEAR)
self._resetControllerValues()
def setStartPosition(self, position):
""" Set the position at which the fade should start """
if position == self.startposition:
return
self.startposition = position
self._resetControllerValues()
def setDuration(self, duration):
""" Set the duration (in ns) of the fade """
if self.duration == duration:
return
self.duration = duration
self._resetControllerValues()
def setFadeFromBlack(self, fromblack):
""" Set which directio we should use.
True : From Black
False : To Black
"""
if self.fadefromblack == fromblack:
return
self.fadefromblack = fromblack
self._resetControllerValues()
def _resetControllerValues(self):
self.alphacontrol.unset_all("alpha")
if self.fadefromblack:
start = 0.0
stop = 1.0
else:
start = 1.0
stop = 0.0
self.alphacontrol.set("alpha",
self.startposition,
start)
self.alphacontrol.set("alpha",
self.startposition + self.duration,
stop)
gobject.type_register(VideoFade)
Copy the Code
1.输入型组件 source element. 这种组件会向管道提供媒体数据,比如文件访问组件,声音获取组件等。
2.过滤型组件 filter element, 它把输入型组件(souce element)中获取的媒体数据进行处理,比如格式转换,解复用 demuser, 复用muxer, 编解码codec等。
3.输出型组件 sink element, 这类组件负责媒体数据的最后的输出,比如输出到音频设备,视频设备,以及输出到文件,网络等。
读取XML文件:
#coding:utf-8
import xml.etree.ElementTree
tree = xml.etree.ElementTree.parse("n900.xml")
for child in tree.getroot().getchildren():
if child.tag == "make":
print "%s" % child.text.strip()
elif child.tag == "version":
print "%s" % child.text.strip()
elif child.tag == "author":
for child in child.getchildren():
if child.tag == "name":
print "%s:" % child.tag
elif child.tag == "email":
print "%s:" % child.tag
Copy the Code
小例子:
#coding:utf-8
import gst
# 创建用来容纳元件的新管道.
pipeline = gst.Pipeline("pipeline")
#
# 依次创建各个元件,并将各个元件添加到管道中.
#
# 创建源元件用来从v412驱动中获取视频流.
source = gst.element_factory_make("gconfvideosrc", "v412src")
pipeline.add(source)
# 创建过滤器元件, 解码视频流.
ffmpeng1 = gst.element_factory_make("ffmpegcolorspace",
"ffmpegcolorspace")
pipeline.add(ffmpeng1)
# 创建过滤器元件, 解码视频流.
ffmpeng2 = gst.element_factory_make("ffmpegcolorspace",
"ffmpegcolorspace2")
pipeline.add(ffmpeng2)
# 创建过滤器元件, 解码视频流.
ffmpeng3 = gst.element_factory_make("ffmpegcolorspace",
"ffmpegcolorspace3")
pipeline.add(ffmpeng3)
# 依次连接各个组件.
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", "文件路径名")
{ 'Ogg' : "application/ogg",
'Matroska' : "video/x-matroska",
'MXF' : "application/mxf",
'AVI' : "video/x-msvideo",
'Quicktime' : "video/quicktime,variant=apple",
'MPEG4' : "video/quicktime,variant=iso",
'MPEG PS' : "video/mpeg,mpegversion=2,systemstream=true",
'MPEG TS' : "video/mpegts,systemstream=true,packetsize=188",
'AVCHD/BD' : "video/mpegts,systemstream=true,packetsize=192",
'FLV' : "video/x-flv",
'3GPP' : "video/quicktime,variant=3gpp", \
'ASF' : "video/x-ms-asf, parsed=true", \
'WebM' : "video/webm", \
'No container' : False }
{ 'Ogg' : ".ogg", \
'Matroska' : ".mkv", \
'MXF' : ".mxf", \
'AVI' : ".avi", \
'Quicktime' : ".mov", \
'MPEG4' : ".mp4", \
'MPEG PS' : ".mpg", \
'MPEG TS' : ".ts", \
'AVCHD/BD' : ".m2ts", \
'FLV' : ".flv", \
'3GPP' : ".3gp",
'ASF' : ".asf", \
'WebM' : ".webm", \
'No container' : ".null" }
{ 'Ogg' : ".ogg", \
'Matroska' : ".mkv", \
'MXF' : ".mxf", \
'AVI' : ".avi", \
'Quicktime' : ".m4a",
'MPEG4' : ".mp4", \
'MPEG PS' : ".mpg", \
'MPEG TS' : ".ts", \
'FLV' : ".flv", \
'3GPP' : ".3gp", \
'ASF' : ".wma", \
'WebM' : ".webm" }
{
'audio/mpeg, mpegversion=(int)1, layer=(int)3' : ".mp3", \
'audio/mpeg, mpegversion=(int)4, stream-format=(string)adts' : ".aac", \
'audio/x-flac' : ".flac" }
{ 'Vorbis' : "audio/x-vorbis", \
'FLAC' : "audio/x-flac", \
'mp3' : "audio/mpeg, mpegversion=(int)1, layer=(int)3", \
'AAC' : "audio/mpeg,mpegversion=4", \
'AC3' : "audio/x-ac3", \
'Speex' : "audio/x-speex",
'Celt Ultra' : "audio/x-celt", \
'ALAC' : "audio/x-alac", \
'Windows Media Audio 2' : "audio/x-wma, wmaversion=(int)2", \
'Theora' : "video/x-theora", \
'Dirac' : "video/x-dirac", \
'H264' : "video/x-h264", \
'MPEG2' : "video/mpeg,mpegversion=2,systemstream=false", \
'MPEG4' : "video/mpeg,mpegversion=4", \
'xvid' : "video/x-xvid", \
'Windows Media Video 2' : "video/x-wmv,wmvversion=2", \
'dnxhd' : "video/x-dnxhd", \
'divx5' : "video/x-divx,divxversion=5", \
'divx4' : "video/x-divx,divxversion=4", \
'AMR-NB' : "audio/AMR", \
'H263+' : "video/x-h263,variant=itu,h263version=h263p", \
'On2 vp8' : "video/x-vp8", \
'mp2' : "audio/mpeg,mpegversion=(int)1, layer=(int)2", \
'MPEG1' : "video/mpeg,mpegversion=(int)1,systemstream=false"}
Copy the Code
gst.Caps(*args, *kwargs)
如果没有参数传给构造函数,一个空的caps将会创建,否则你可以传递一个字符串或者一个结构.
Reply
Like 0
Favorite
View the author
All Replies
z85525006
deepin
2012-09-19 10:55
#1
平面上的多点搜索算法。
http://zh.wikipedia.org/wiki/%E6%9C%80% ... C%E7%B4%A2
KD树算法。。哈哈哈
http://www.cnblogs.com/eyeszjwang/articles/2429382.html
Reply
Like 0
View the author
Please
sign
in first
New Thread
Popular Events
More
'''
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.输入型组件 source element. 这种组件会向管道提供媒体数据,比如文件访问组件,声音获取组件等。
2.过滤型组件 filter element, 它把输入型组件(souce element)中获取的媒体数据进行处理,比如格式转换,解复用 demuser, 复用muxer, 编解码codec等。
3.输出型组件 sink element, 这类组件负责媒体数据的最后的输出,比如输出到音频设备,视频设备,以及输出到文件,网络等。
读取XML文件:
小例子:
由于解码的文件比较多,可以对照一个表.
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", "文件路径名")
gst.Caps(*args, *kwargs)
如果没有参数传给构造函数,一个空的caps将会创建,否则你可以传递一个字符串或者一个结构.