Home
Categories
WIKI
Topic
User
LANGUAGE:
中文
English
GStreamer笔记
社区开发
4703
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 Ranking
Change
deepin donwloader don't catch download launch from browsers
deepin 23 internal testing update on December 20, 2024
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将会创建,否则你可以传递一个字符串或者一个结构.