用GStreamer 简化 Linux 多媒体开发

上传人:gh****f 文档编号:156593817 上传时间:2022-09-27 格式:DOCX 页数:23 大小:76.62KB
收藏 版权申诉 举报 下载
用GStreamer 简化 Linux 多媒体开发_第1页
第1页 / 共23页
用GStreamer 简化 Linux 多媒体开发_第2页
第2页 / 共23页
用GStreamer 简化 Linux 多媒体开发_第3页
第3页 / 共23页
资源描述:

《用GStreamer 简化 Linux 多媒体开发》由会员分享,可在线阅读,更多相关《用GStreamer 简化 Linux 多媒体开发(23页珍藏版)》请在装配图网上搜索。

1、GStreamer 是 GNOME 桌面环境下用来构建流媒体应用的编程框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3、Ogg、MPEG1、MPEG2、AVI、Quicktime 等多种格式的多媒体数据。一、基本概念GStreammer 作为 GNOOME 桌面面环境推荐的的流媒体应用用框架,采用用了基于插件件(pluggin)和管管道(pippelinee)的体系结结构,框架中中的所有的功功能模块都被被实现成可以以插拔的组件件(compoonent),并并且在需要的的时候能够很很方便地安装装到任意一个个管道上,由由于所有插件件都通过管道道机制

2、进行统统一的数据交交换,因此很很容易利用已已有的各种插插件“组装”出出一个功能完完善的多媒体体应用程序。 1.1 元件处处理对于需要应用 GStreeamer 框架的程序序员来讲,GGstEleement 是一个必须须理解的概念念,因为它是是组成管道的的基本构件,也也是框架中所所有可用组件件的基础,这这也难怪 GStreeamer 框架中的大大部分函数都都会涉及到对对 GstEllementt 对象的操作作。从 GStreeamer 自身的观点点来看,GsstElemment 可以描述为为一个具有特特定属性的黑黑盒子,它通通过连接点(link point)与外界进行交互,向框架中的其余部分表征

3、自己的特性或者功能。按照各自功能上上的差异,GGStreaamer 又将 GstEllementt 细分成如下下几类:Source Elemeent 数据据源元件只只有输出端,它它仅能用来产产生供管道消消费的数据,而而不能对数据据做任何处理理。一个典型型的数据源元元件的例子是是音频捕获单单元,它负责责从声卡读取取原始的音频频数据,然后后作为数据源源提供给其它它模块使用。 Filter Elemeent 过滤滤器元件既既有输入端又又有输出端,它它从输入端获获得相应的数数据,并在经经过特殊处理理之后传递给给输出端。一一个典型的过过滤器元件的的例子是音频频编码单元,它它首先从外界界获得音频数数据,然

4、后根根据特定的压压缩算法对其其进行编码,最最后再将编码码后的结果提提供给其它模模块使用。 Sink Ellementt 接收器元元件只有输输入端,它仅仅具有消费数数据的能力,是是整条媒体管管道的终端。一一个典型的接接收器元件的的例子是音频频回放单元,它它负责将接收收到的数据写写到声卡上,通通常这也是音音频处理过程程中的最后一一个环节。 图1将有助于你你更好地理解解数据源元件件、过滤器元元件和接收器器元件三者的的区别,同时时也不难看出出它们是如何何相互配合形形成管道的: 图1需要注意的是,过过滤器元件的的具体形式是是非常灵活的的,GStrreamerr并没有严格格规定输入端端和输出端的的数目,事

5、实实上它们都可可以是一个或或者多个。图图2是一个 AVVI分离器的的基本结构,它它能够将输入入数据分离成成单独的音频频信息和视频频信息,用于于实现该功能能的过滤器元元件很明显只只具有一个输输入端,但却却需要有两个个输出端。 图2要想在应用程序序中创建GsstElemment对象象,唯一的办办法是借助于于工厂对象GGstEleementFFactorry。由于GSttreameer框架提供供了多种类型型的GstEElemennt对象,因因此对应地提提供了多种类类型的GsttElemeentFacctory对对象,它们是是通过特定的的工厂名称来来进行区分的的。例如,下下面的代码通通过gst_ele

6、meent_faactoryy_findd()函数获得得了一个名为为mad的工厂厂对象,它之之后可以用来来创建与之对对应的MP33解码器元件件: GstEleementFFactorry *faactoryy;factorry = gstt_elemment_ffactorry_finnd (mmad); 成功获得工厂对对象之后,接接下来就可以以通过gstt_elemment_ffactorry_creeate()函数来创建建特定的GsstElemment对象象了,该函数数在调用时有有两个参数,分分别是需要用用到的工厂对对象,以及即即将创建的元元件名称。元元件名称可以以用查询的办办法获得,也也

7、可以通过传传入空指针(NULL)来生成工厂对象的默认元件。下面的代码示范了如何利用已经获得的工厂对象,来创建名为decoder的MP3解码器元件:GstElemment *elemeent;elementt = gstt_elemment_ffactorry_creeate (factoory, decodder); 当创建的GsttElemeent不再使使用的时候,还还必须调用ggst_ellementt_unreef()函数释放放其占用的内内存资源: gst_eleement_unreff (eleement); GStreammer使用了了与GObjject相同同的机制来对对属性(prr

8、opertty)进行管管理,包括查查询(queery)、设设置(sett)和读取(gget)等。所所有的 GstEllementt对象都需要要从其父对象象GstObbject那那里继承名称称(namee)这一最基基本的属性,这这是因为像 gst_eelemennt_facctory_make()和gst_eelemennt_facctory_creatte()这样的函函数在创建工工厂对象和元元件对象时都都会用到名称称属性,通过过调用gstt_objeect_seet_namme()和gst_oobjectt_get_name()函数可以以设置和读取取 GstEllementt对象的名称称属性。

9、 1.2 衬垫处处理衬垫(pad)是是GStreeamer框框架引入的另另外一个基本本概念,它指指的是元件(element)与外界的连接通道,对于框架中的某个特定元件来说,其能够处理的媒体类型正是通过衬垫暴露给其它元件的。成功创建GstElement对象之后,可以通过gst_element_get_pad()获得该元件的指定衬垫。例如,下面的代码将返回element元件中名为src的衬垫: GstPad *srcppad;srcpad = gstt_elemment_gget_paad (ellementt, srrc); 如果需要的话也也可以通过ggst_ellementt_get_pad_

10、llist()函数,来查查询指定元件件中的所有衬衬垫。例如,下下面的代码将将输出eleement元元件中所有衬衬垫的名称: GList *pads;pads = gst_eelemennt_gett_pad_list (elemment);while (pads) GstPaad *paad = GGST_PAAD (paads-ddata); g_priint (pad nname iis: %ssn, gst_ppad_geet_namme (paad); pads = g_llist_nnext (pads); 与元件一样,衬衬垫的名称也也能够动态设设置或者读取取,这是通过过调用gstt

11、_pad_get_nname ()和gst_ppad_seet_namme()函数来完完成的。所有有元件的衬垫垫都可以细分分成输入衬垫垫和输出衬垫垫两种,其中中输入衬垫只只能接收数据据但不能产生生数据,而输输出衬垫则正正好相反,只只能产生数据据但不能接收收数据,利用用函数gstt_pad_get_ddirecttion()可以获得指指定衬垫的类类型。 GStreeamer框框架中的所有有衬垫都必然然依附于某个个元件之上,调调用gst_pad_gget_paarent()可以获得得指定衬垫所所属的元件,该该函数的返回回值是一个指指向GstEElemennt的指针。衬衬垫从某种程程度上可以看看成是

12、元件的的代言人,因因为它要负责责向外界描述述该元件所具具有的能力。GStreamer框架提供了统一的机制来让衬垫描述元件所具有的能力(capability),这是借助数据结构_GstCaps来实现的: struct _GstCCaps gcharr *namme; /* the name of thhis caaps */ guintt16 idd; /* type id (mmajor type) */ guintt refcoount; /* caaps arre reffcountted */ GstPrrops *propeertiess; /* propeertiess for th

13、is capabbilityy */ GstCaaps *nnext; /* caaps caan be chainned toogetheer */; 以下是对madd元件的能力力描述,不难难看出该元件件中实际包含含sink和src两个衬衬垫,并且每每个衬垫都带带有特定的功功能信息。名名为sinkk的衬垫是maad元件的输输入端,它能能够接受 MMIME类型型为audiio/mp33的媒体数据据,此外还具具有layeer、bitraate和frameed三种属性性。名为srrc的衬垫是是mad元件的的输出端,它它负责产生MMIME类型型为audiio/raww媒体数据,此此外还具有fform

14、att、depthh、rate和channnels等多多种属性。 Pads: SINK templlate: sinkk Avaailabiility: Alwaays Cappabiliities: maad_sinnk: MMIME ttype: audiio/mp33: SRC ttemplaate: src Avaailabiility: Alwaays Cappabiliities: mad_ssrc: MIMEE typee: auudio/rraw: formmat: SStringg: intt endiiannesss: Inntegerr: 12334 widtth: In

15、ntegerr: 16 deptth: Inntegerr: 16 channnels: Inteeger rrange: 1 - 2 law: IIntegeer: 0 signned: BBooleaan: TRRUE ratee: Intteger rangee: 110025 - 480000 准确地说,GSStreammer框架中中的每个衬垫垫都可能对应应于多个能力力描述,它们们能够通过函函数gst_pad_gget_caaps()来获得。例例如,下面的的代码将输出出pad衬垫中中所有能力描描述的名称及及其MIMEE类型: GstCapss *capps;caps = gst_ppa

16、d_geet_capps (paad);g_printt (paad namme is: %snn, gsst_padd_get_name (pad);while (caps) g_priint ( Capaabilitty namme is %s, MMIME ttype iis %sn, gst_ccaps_gget_naame (ccap), gst_ccaps_gget_miime (ccap); caps = capps-neext; 1.3 箱柜箱柜(bin)是是GStreeamer框框架中的容器器元件,它通通常被用来容容纳其它的元元件对象,但但由于其自身身也是一个GGstElee

17、ment对对象,因此实实际上也能够够被用来容纳纳其它的箱柜柜对象。利用用箱柜可以将将需要处理的的多个元件组组合成一个逻逻辑元件,由由于不再需要要对箱柜中的的元件逐个进进行操作,因因此能够很容容易地利用它它来构造更加加复杂的管道道。在GSttreameer框架中使使用箱柜还有有另外一个优优点,那就是是它会试着对对数据流进行行优化,这对对于多媒体应应用来讲是很很具吸引力的的。 图3描述了箱柜柜在GStrreamerr框架中的典典型结构: 图3在GStreaamer应用用程序中使用用的箱柜主要要有两种类型型:GstPipeeline 管道是最常常用到的容器器,对于一个个GStreeamer应应用程序

18、来讲讲,其顶层箱箱柜必须是一一条管道。 GstThreead 线程的作用用在于能够提提供同步处理理能力,如果果GStreeamer应应用程序需要要进行严格的的音视频同步步,一般都需需要用到这种种类型的箱柜柜。 GStreammer框架提提供了两种方方法来创建箱箱柜:一种是是借助工厂方方法,另一种种则是使用特特定的函数。下下面的代码示示范了如何使使用工厂方法法创建线程对对象,以及如如何使用特定定函数来创建建管道对象:GstElemment *threaad, *ppipeliine;/ 创建线程程对象,同时时为其指定唯唯一的名称。thread = gstt_elemment_ffactorry_

19、makke (tthreadd, NUULL);/ 根据给出出的名称,创创建一个特定定的管道对象象。pipelinne = gstt_pipeeline_new (pipeeline_name); 箱柜成功创建之之后,就可以以调用gstt_bin_add()函数将已经经存在的元件件添加到其中中来了:GstElemment *elemeent;GstElemment *bin;bin = ggst_biin_neww (binn_namee);elementt = gstt_elemment_ffactorry_makke (mmpg1233, ddecodeer);gst_binn_add (

20、GST_BIN (bin), elemment); 而要从箱柜中找找到特定的元元件也很容易易,可以借助助gst_bbin_geet_by_name()函数实现现: GstElemment *elemeent;elementt = gstt_bin_get_bby_namme (GSST_BINN (binn), ddecodeer); 由于GStreeamer框框架中的一个个箱柜能够添添加到另一个个箱柜之中,因因此有可能会会出现箱柜嵌嵌套的情况,gst_bin_get_by_name()函数在查找元件时会对嵌套的箱柜作递归查找。元件有添加到箱柜之中以后,在需要的时候还可以从中移出,这是通过调用

21、gst_bin_remove()函数来完成的:GstElemment *elemeent;gst_binn_remoove (GGST_BIIN (biin), eelemennt); 如果仔细研究一一下图3中描述的箱箱柜,会发现现它没有属于于自己的输入入衬垫和输出出衬垫,因此此显然是无法法作为一个逻逻辑整体与其其它元件交互互的。为了解解决这一问题题,GStrreamerr引入了精灵灵衬垫(ghhost ppad)的概概念,它是从从箱柜里面所所有元件的衬衬垫中推举出出来的,通常常来讲会同时时选出输入衬衬垫和输出衬衬垫,如图44所示: 图4具有精灵衬垫的的箱柜在行为为上与元件是是完全相同的的,所

22、有元件件具有的属性性它都具有,所所有针对元件件能够进行的的操作也同样样能够针对箱箱柜进行,因因此在GSttreameer应用程序序中能够像使使用元件一样样使用这类箱箱柜。下面的的代码示范了了如何为箱柜柜添加一个精精灵衬垫:GstElemment *bin;GstElemment *elemeent;elementt = gstt_elemment_ffactorry_creeate (mad, deecoderr);bin = ggst_biin_neww (binn_namee);gst_binn_add (GST_BIN (bin), elemment);gst_eleement_add_

23、gghost_pad (bin, gst_eelemennt_gett_pad (elemment, sinkk), sink); 二、元件连接在引入了元件和和衬垫的概念念之后,GSStreammer对多媒媒体数据的处处理过程就变变得非常清晰晰了:通过将将不同元件的的衬垫依次连连接起来构成成一条媒体处处理管道,使使数据在流经经管道的过程程能够被各个个元件正常处处理,最终实实现特定的多多媒体功能。图就描述了一一条很简单的的管道,它由由三个基本元元件构成:数数据源元件只只负责产生数数据,它的输输出衬垫与过过滤器元件的的输入衬垫相相连;过滤器器元件负责从从自己的输入入衬垫中获取取数据,并在在经过特定

24、的的处理之后,将将结果通过输输出衬垫传给给与之相连的的接收器元件件;接收器元元件只负责接接收数据,它它的输入衬垫垫与过滤器元元件的输出衬衬垫相连,负负责对最终结结果进行相应应的处理。 GStreammer框架中中的元件是通通过各自的衬衬垫连接起来来的,下面的的代码示范了了如何将两个个元件通过衬衬垫连接起来来,以及如何何在需要的时时候断开它们们之间的连接接:GstPad *srcppad, *sinkppad;srcpad = gstt_elemment_gget_paad (ellementt1, ssrc);sinpad = gstt_elemment_gget_paad (ellement

25、t2, ssink);/ 连接gst_padd_linkk (srcppad, sinkkpad);/ 断开gst_padd_unliink (srcppad, sinkkpad); 如果需要建立起起连接的元件件都只有一个个输入衬垫和和一个输出衬衬垫,那么更更简单的做法法是调用gsst_eleement_link()函数直接接在它们之间间建立起连接接,或者调用用gst_eelemennt_unllink()函数断开它它们之间的连连接:/ 连接gst_eleement_link (elemment1, elemment2);/ 断开gst_eleement_unlinnk (ellementt1

26、, ellementt2);三、元件状态当GStreaamer框架架中的元件通通过管道连接接好之后,它它们就开始了了各自的处理理流程,期间间一般会经历历多次状态切切换,其中每每个元件在特特定时刻将处处于如下四种种状态之一:NULL 这是是所有元件的的默认状态,表表明它刚刚创创建,还没有有开始做任何何事情。 READY 表表明元件已经经做好准备,随随时可以开始始处理流程。 PAUSED 表明元件因因某种原因暂暂时停止处理理数据。 PLAYINGG 表明元件件正在进行数数据处理。 所有的元件都从从NULL状态态开始,依次次经历NULLL、READYY、PAUSEED、PLAYIING等状态态间的转

27、换。元元件当前所处处的状态可以以通过调用ggst_ellementt_set_statee()函数进行行切换:GstElemment *bin;/* 创建元件件,并将其连连接成箱柜bbin */gst_eleement_set_sstate (bin, GST_STATEE_PLAYYING); 默认情况下,管管道及其包含含的所有元件件在创建之后后将处于NUULL状态,此此时它们不会会进行任何操操作。当管道道使用完毕之之后,不要忘忘记重新将管管道的状态切切换回NULLL状态,让让其中包含的的所有元件能能够有机会释释放它们正在在占用的资源源。管道真正的处理理流程是从第第一次将其切切换到REAAD

28、Y状态时时开始的,此此时管道及其其包含的所有有元件将做好好相应的初始始化工作,来来为即将执行行的数据处理理过程做好准准备。对于一一个典型的元元件来讲,处处于READDY状态时需需要执行的操操作包括打开开媒体文件和和音频设备等等,或者试图图与位于远端端的媒体服务务器建立起连连接。处于READYY状态的管道道一旦切换到到PLAYIING状态,需需要处理的多多媒体数据就就开始在整个个管道中流动动,并依次被被管道中包含含的各个元件件进行处理,从从而最终实现现管道预先定定义好的某种种多媒体功能能。GStrreamerr框架也允许许将管道直接接从NULLL状态切换到到PLAYIING状态,而而不必经过中中

29、间的REAADY状态。正处于播放状态态的管道能够够随时切换到到PAUSEED状态,暂暂时停止管道道中所有数据据的流动,并并能够在需要要的时候再次次切换回PLLAYINGG状态。如果果需要插入或或者更改管道道中的某个元元件,必须先先将其切换到到PAUSEED或者NULLL状态,元件件在处于PAAUSED状状态时并不会会释放其占用用的资源。四、实现MP33播放器在理解了一些基基本概念和处处理流程之后后,下面来看看看如何利用用GStreeamer框框架提供的组组件,来实现现一个简单的的MP3播放器器。在图中中描述的结构构能够很容易易地映射成MMP3播放器器,其中数据据源元件负责责从磁盘上读读取数据,

30、过过滤器元件负负责对数据进进行解码,而而接受器元件件则负责将解解码后的数据据写入声卡。与其它众多GNNOME项目目一样,GSStreammer也是用用C语言实现的的。如果想要要在程序中应应用GStrreamerr提供的各种种功能,首先先必须在主函函数中调用 gst_iinit()来完成相应应的初始化工工作,以便将将用户从命令令行输入的参参数传递给GGStreaamer函数数库。一个典典型的GSttreameer应用程序序的初始化如如下所示:#includde int maiin (innt argc, char *argvv) gst_iinit (&argcc, &arggv); /* .

31、*/ 接下去需要创建建三个元件并并连接成管道道,由于所有有GStreeamer元元件都具有相相同的基类GGstEleement,因因此能够采用用如下方式进进行定义: GstEllementt *pippelinee, *fiilesrcc, *deecoderr, *auudiosiink; 管道在GStrreamerr框架中是用用来容纳和管管理元件的,下下面的代码将将创建一条名名为pipeeline的的新管道: /* 创建建用来容纳元元件的新管道道 */ pipelline = gst_pipelline_nnew (pipelline); 数据源元件负责责从磁盘文件件中读取数据据,它具有名

32、名为locaation的的属性,用来来指明文件在在磁盘上的位位置。使用标标准的GObbject属属性机制可以以为元件设置置相应的属性性:/* 创建数据据源元件 */filesrcc = gstt_elemment_ffactorry_makke (fillesrc, diisk_soource);g_objecct_sett (G_OOBJECTT (fillesrc), loocatioon, aargv1, NNULL); 过滤器元件负责责完成对MPP3格式的数数据进行解码码,最简单的的办法是安装装mad这一插插件,借助它它来完成相应应的解码工作作:/* 创建过滤滤器元件 */decode

33、rr = gstt_elemment_ffactorry_makke (mmad, decooder); 接收器元件负责责将解码后的的数据利用声声卡播放出来来:/* 创建接收收器元件 */audiosiink = gst_eelemennt_facctory_make (auddiosinnk, play_audioo); 已经创建好的三三个元件需要要全部添加到到管道中,并并按顺序连接接起来: /* 添加元件件到管道中 */gst_binn_add_many (GST_BIN (pipelline), fileesrc, decodder, aaudiossink, NULL);/* 通过衬垫

34、垫连接元件 */gst_eleement_link_many (fileesrc, decodder, aaudiossink, NULL); 所有准备工作都都做好之后,就就可以通过将将管道的状态态切换到PLLAYINGG状态,来启启动整个管道道的数据处理理流程:/* 启动管道道 */gst_eleement_set_sstate (pipeeline, GST_STATEE_PLAYYING); 由于没有用到线线程,因此必必须通过不断断调用gstt_bin_iteraate()函数的办办法,来判断断管道的处理理过程会在何何时结束:while (gst_bbin_itteratee (GSTT

35、_BIN (pipeeline); 只要管道内还会会继续有新的的事件产生,gst_bin_iterate()函数就会一直返回TRUE,只有当整个处理过程都结束的时候,该函数才会返回FALSE,此时就该终止管道并释放占用的资源了: /* 终止管道道 */gst_eleement_set_sstate (pipeeline, GST_STATEE_NULLL);/* 释放资源源 */gst_objject_uunref (GST_OBJECCT (piipelinne); 用GStreaamer实现现的MP3播放器器的源代码如如下所示:#includde int maiin (innt argc,

36、 char *argvv) GsttElemeent *ppipeliine, *filessrc, *decodder, *audioosink; gstt_initt(&argc, &argvv); if (argcc != 22) g_prrint (usagge: %ss n, argv0); exitt (-1); /* 创建一条新新的管道 */ pippelinee = gstt_pipeeline_new (pipeeline); /* 生成用于读读取硬盘数据据的元件 */ fillesrc = gstt_elemment_ffactorry_makke (fillesrc, d

37、iisk_soource); g_oobjectt_set (G_OBBJECT (fileesrc), loccationn, arrgv1, NNULL); /* 创建解码器器元件 */ deccoder = gstt_elemment_ffactorry_makke (mmad, decooder); /* 创建音频回回放元件 */ auddiosinnk = gstt_elemment_ffactorry_makke (ossssink, pllay_auudio); /* 将生成的元元件添加到管管道中 */ gstt_bin_add_mmany (GST_BBIN (ppipelii

38、ne), filessrc, ddecodeer, auudiosiink, NNULL); /* 连接各个元元件 */ gstt_elemment_llink_mmany (filessrc, ddecodeer, auudiosiink, NNULL); /* 开始播放 */ gstt_elemment_sset_sttate (pipelline, GST_SSTATE_PLAYIING); whiile (gst_bin_iiteratte (GSST_BINN (pippelinee); /* 停止管道处处理流程 */ gstt_elemment_sset_sttate (pipelline, GST_SSTATE_NULL); /* 释放占用的的资源 */ gstt_objeect_unnref (GST_OOBJECTT (pippelinee); exiit (0); 五、小结随着 GNOMME 桌面环环境的不断普普及,GSttreameer 作为一个强强大的多媒体体应用开发框框架,已经开开始受到越来来越多人的关关注。Gsttreameer在设计时时采用了非常常灵活的体系系结构,并且且提供了许多多预定义的媒媒体处理模块块,因此能够够极大简化在在Linuxx下开发多媒媒体应用的难难度。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!