版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Mplayer播放器Mplayer支持的格式MPlayer是一个LINUX下的视频播放器,它支持相当多的媒体格式,无论在音频播放还是在视频播放方面,可以说它支持的格式是相当全面的。视频格式支持:MPEG、AVI、ASF与WMV、QuickTime与OGG/OGM、SDP、PVA、GIF。音频格式支持:MP3、WAV、OGG/OGM文件(Vorbis)、WMA与ASF、MP4、CD音频、XMMS。Mplayer中头文件的功能分析config.h//各种本地配置宏定义头version.h//版本定义头#defineVERSION"1.0pre7try2-3.4.2"mp_msg.h//消息处理头help_mp.h//根据配置自动生成的帮助头#include"help/help_mpen.h"cfg-mplayer-def.h//Mplayer运行时的选项缺省值头文件char*default_config=sub_reader.h//拥有格式自动发现功能的字幕(subtitle)阅读器libvo/video_out.h//该文件包含libvo视频输出的公共函数、变量libvo/font_load.h//有关字体装载的例程libao2/audio_out.h//音频输出驱动程序相关结构定义和全局数据libmpcodecs/dec_audio.h//音频解码libmpcodecs/dec_video.h//视频解码libmpdemux/matroska.h//多路解复用,媒体容器格式matroska处理头libmpdemux/stream.h//流处理libmpdemux/demuxer.h//多路解复用头文件libmpdemux/stheader.h//媒体流头处理get_path.c//路径获取头文件spudec.h//SPU子画面单元头,DVD字幕流edl.h//剪辑控制清单m_option.h//选项类型处理头m_config.h//配置处理头文件MPlayer.main主流程简要说明intmain(){变量声明,电影信息movieinfo:初始化,消息系统„„-1-play_next_file:播放文件filename的循环gotoplay_next_file开始main:主处理main播放真正主循环2010~3541while(!eof)while(!eof){播放音频PLAYAUDIO2017~2064decode_audio(sh_audio,...);播放视频PLAYVIDEO,2068~2300decode_video(sh_video,...);处理暂停PAUSE处理EDL键盘事件处理,搜索2400~3216while(!brk_cmd&&(cmd=mp_input_get_cmd(0,0,0))!=NULL)时间寻道(秒)if(seek_to_sec)寻道3243~3306,if(rel_seek_secs||abs_seek_pos)处理GUI变更UpdateOSD找到字幕findsub处理X11窗口DVD字幕sub:}goto_next_file:播放结束,转到下个文件goto_next_file:}Mplayer源码分析从Mplayer.c的main开始处理参数mconfig=m_config_new();m_config_register_options(mconfig,mplayer_opts);//TODO:addsomethingtoletmodulesregistertheiroptionsmp_input_register_options(mconfig);parse_cfgfiles(mconfig);初始化mpctx结构体,mpctx应该是mplayercontext的意思,顾名思义是一个统筹全局的变量。staticMPContext*mpctx=&mpctx_s;//Notallfunctionsinmplayer.ctakethecontextasanargumentyetstaticMPContextmpctx_s={-2-.osd_function=OSD_PLAY,.begin_skip=MP_NOPTS_VALUE,.play_tree_step=1,.global_sub_pos=-1,.set_of_sub_pos=-1,.file_format=DEMUXER_TYPE_UNKNOWN,.loop_times=-1,#ifdefHAS_DVBIN_SUPPORT.last_dvb_step=1,#endif};原型typedefstructMPContext{intosd_show_percentage;intosd_function;ao_functions_t*audio_out;play_tree_t*playtree;play_tree_iter_t*playtree_iter;inteof;intplay_tree_step;intloop_times;stream_t*stream;demuxer_t*demuxer;sh_audio_t*sh_audio;sh_video_t*sh_video;demux_stream_t*d_audio;demux_stream_t*d_video;demux_stream_t*d_sub;mixer_tmixer;vo_functions_t*video_out;//Framesbufferedinthevoreadytoflip.Currentlyalways0or1.//Thisisreallyavovariablebutcurrentlythere'snosuitablevo//num_buffered_frames;//AVsync:thenextframeshouldbeshownwhentheaudioouthasthis//much(inseconds)buffereddataleft.Increasedwhenmoredatais-3-//writtentotheao,decreasedwhenmovingtothenextframe.//Intheaudio-onlycaseusedasatimersincethelastseek//bytheaudioCPUusagemeter.doubledelay;floatbegin_skip;///<starttimeofthecurrentskipwhileonedloutmode//audioismutedifeitherEDLoruseractivatesmuteshortedl_muted;///<StoreswhetherEDLiscurrentlyinmutedmode.shortuser_muted;///<Storeswhetheruserwantedmutedmode.intglobal_sub_size;//thisencompassesallsubtitlesourcesintglobal_sub_pos;//thisencompassesallsubtitlesourcesintset_of_sub_pos;intset_of_sub_size;intglobal_sub_indices[SUB_SOURCES];一些GUI相关的操作打开字幕流打开音视频流mpctx->stream=open_stream(filename,0,&mpctx->file_format);fileformat文件还是TV流DEMUXER_TYPE_PLAYLIST或DEMUXER_TYPE_UNKNOWNDEMUXER_TYPE_TVcurrent_module记录状态vobsubopen_streamhandle_playlistdumpstreamstream_reset(mpctx->stream);stream_seek(mpctx->stream,mpctx->stream->start_pos);f=fopen(stream_dump_name,”wb”);dump文件流stream->type==STREAMTYPE_DVD//============OpenDEMUXERS—DETECTfiletype======================Demux。分离视频流和音频流mpctx->demuxer=demux_open(mpctx->stream,mpctx->file_format,audio_id,video_id,dvdsub_id,filename);Demux过程demux_openget_demuxer_type_from_namempctx->d_audio=mpctx->demuxer->audio;mpctx->d_video=mpctx->demuxer->video;mpctx->d_sub=mpctx->demuxer->sub;mpctx->sh_audio=mpctx->d_audio->sh;-4-mpctx->sh_video=mpctx->d_video->sh;分离了之后就开始分别Playaudio和video这里只关心playvideo/*========================PLAYVIDEO============================*/vo_pts=mpctx->sh_video->timer*90000.0;vo_fps=mpctx->sh_video->fps;if(!mpctx->num_buffered_frames){doubleframe_time=update_video(&blit_frame);mp_dbg(MSGT_AVSYNC,MSGL_DBG2,”***ftime=%5.3f***\n”,frame_time);if(mpctx->sh_video->vf_inited<0){mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_NotInitializeVOPorVO);mpctx->eof=1;gotogoto_next_file;}if(frame_time<0)mpctx->eof=1;else{//mightreturnwith!eof&&!blit_frameif!correct_ptsmpctx->num_buffered_frames+=blit_frame;time_frame+=frame_time/playback_speed;//fornosound}}关键的函数是update_video根据pts是否正确调整一下同步并在必要的时候丢帧处理。最终调用decode_video开始解码(包括generate_video_frame里)。mpi=mpvdec->decode(sh_video,start,in_size,drop_frame);mpvdec是在main里通过reinit_video_chain的一系列调用动态选定的解码程序。其实就一结构体。它的原型是typedefstructvd_functions_s{vd_info_t*info;int(*init)(sh_video_t*sh);void(*uninit)(sh_video_t*sh);int(*control)(sh_video_t*sh,intcmd,void*arg,„);mp_image_t*(*decode)(sh_video_t*sh,void*data,intlen,intflags);}vd_functions_t;这是所有解码器必须实现的接口。-5-int(*init)(sh_video_t*sh);是一个名为init的指针,指向一个接受sh_video_t*类型参数,并返回int类型值的函数地址。那些vd_开头的文件都是解码相关的。随便打开一个vd文件以上几个函数和info变量肯定都包含了。mpi被mplayer用来存储解码后的图像。在mp_image.h里定义。typedefstructmp_image_s{unsignedshortflags;unsignedchartype;unsignedcharbpp;//bits/pixel.NOTdepth!forRGBitwillben*8unsignedintimgfmt;intwidth,height;//storeddimensionsintx,y,w,h;//visibledimensionsunsignedchar*planes[MP_MAX_PLANES];intstride[MP_MAX_PLANES];char*qscale;intqstride;intpict_type;//0->unknown,1->I,2->P,3->Bintfields;intqscale_type;//0->mpeg1/4/h263,1->mpeg2intnum_planes;/*theseareonlyusedbyplanarformatsY,U(Cb),V(Cr)*/intchroma_width;intchroma_height;intchroma_x_shift;//horizontalintchroma_y_shift;//vertical/*forprivateusebyfilterorvodriver(tostorebufferidordmpi)*/void*priv;}mp_image_t;图像在解码以后会输出到显示器,mplayer本来就是一个视频播放器么。但也有可能作为输入提供给编码器进行二次编码,MP附带的mencoder.exe就是专门用来编码的。在这之前可以定义filter对图像进行处理,以实现各种效果。所有以vf_开头的文件,都是这样的filter。图像的显示是通过v。,即vide。out来实现的。解码器只负责把解码完成的帧传给v。,怎样显示就不用管了。这也是平台相关性最大的部分,单独分出来的好处是不言而喻的,像在Windows下有通过direcx实现的vo,Linux下有输出到X的vo。vo_*文件是各种不同的vo实现,只是他们不都是以显示为目的,像vo_md5sum.c只是计算一下图像的md5值。在解码完成以后,即得到mpi以后,filter_video被调用,其结果是整个filter链上的所有filter都被调用了一遍,包括最后的V0,在vo的put_image里把图像输出到显示器。这个时候需要考虑的是图像存储的方法即用哪种色彩空间。五.MPlayerskin的格式MPlayer有没有内建的皮肤,因此为了能够使用GUI必须安装至少一种皮肤。目录skin的搜索目录(按顺序)是:$(DATADIR)/Skin/$(PREFIX)/share/mplayer/Skin/~/.mplayer/Skin/注意,第一个路径依赖于MPlayer的安装配置(见configure脚本的一prefix和一datadir的参数)。所有的skin被安装到上面列出的一个目录下的自己的目录中,例如:$(PREFIX)/share/mplayer/Skin/default/图像格式图像必须是真彩的(24或者32bpp)PNG图片。在主窗口(见下面)中你能使用包含“透明色”的图像:用颜色#FF00FF(深红)填充的区域在MPlayer看来是完全透明的。这意味着你甚至能改变窗口外形如果你的X服务器有XShape扩展。Skin的组成部分目前有三个要被修饰的窗口:主窗口,副窗口,播放条和Skin菜单(右键单击弹出)。主窗口和/或者播放条是控制MPlayer的地方。窗口的背景是图像,按钮、滑动条和标签可以(而且必须)放置在这里,对于每一个项目,都必须指定其位置和大小。一个按钮有三种状态(按下,释放,禁止),所以按钮图像必须垂直地划分成三部分。细节参见按钮项目。滑动条(主要用于搜寻条和音量/平衡控制)可以有任意多的状态,只要你把图像分成上下排列的足够多份。细节参见hpotmeter和potmeter标签有一点特殊:字符需要从图像文件中绘制,而图像中的字符用字体描述文件描述。后者一个纯文本文件规定图像中每一字符的x,y坐标和大小(图像文件和他的字体描述文件共同组成一个字体)。细节参见dlabel和slabel注意:所有图像都能像图像格式一节中说明的使用透明色。如果XServer不支持XShape扩展,透明的部分将显示为黑色。如果你想使用这个特性,主窗口背景图像的宽度应该能被8整除。subwindow是电影显示的地方。如果没有载入电影它将显示一个指定的图像,在这里不允许使用透明色。skin菜单仅仅是提供一个通过菜单控制MPlayer的方法。菜单需要两个图像:一个是基础图-7-像用来显示菜单的正常状态,另一个用来显示被选择的项目。当菜单弹出时,显示第一个图像。如果你把鼠标在菜单条目上移动,当前选择的项目从第二个图像中复制并覆盖到当前鼠标指针下面的菜单项目上。(第二个图像从来不作为整体来显示)。一个菜单选项用图像中的位置和大小定义(细节参见skin菜单)。为了使按钮,滑动条和菜单项工作,MPlayer必须知道如果他们被点击的话应该做什么。这是利用消息(事件)机制完成的。对于这些项目,你必须定义当他们被点击时将会产生的消息文件需要制作下列的文件构成一个skin:一个配置文件称为skin,告诉MPlayer如何将skin的不同部分放在一起,以及如果你在窗口中某处点击的话应该做什么。主窗口的背景图像。主窗口上代表物件的图像(包括一个或更多字体描述文件用来显示标签)。在副窗口中显示的图像(可选)。skin菜单的两个图像(仅当你想要创建菜单时才需要他们)。除了skin的配置文件之外,可以给其它文件起随便什么名字(但字体描述文件必须以fnt为扩展名)。2skin文件如上所述,这是skin的配置文件。它是基于行的;注释行必须以’;’开头(只有空格和tab可以放在';'之前)。文件由section组成。每一段描述一个程序的skin,使用下列的形式:section=sectionnameend目前只有一个程序,所以只需要一个section:它的名称是movieplayer。这个段中每个窗口用下列形式的块描述:window=windownameend其中windowname可以是下面各字串中的一项:main--对于主窗口sub--对于副窗口menu—对于skin菜单-8-playbar-播放条(副窗口和skin菜单块是可选的,不一定要创建菜单或者修饰副窗口)。在一个窗口的描述块内,用下列形式的一行定义窗口中的每一项目:item=parameter其中item是定义GUI项目的类型的字串,parameter是一个数字或者文字值(或者一组用逗号分开的值的列表)。把上述的放在一起,整个文件看起来就有点像这样:section=movieplayerwindow=main;...itemsformainwindow...endwindow=sub;...itemsforsubwindow...endwindow=menu;...itemsforskinmenu...endwindow=playbar;...itemsforplaybar...endend图像文件的名称必须不带目录名一图像在Skin目录中被搜索,可以(但是并不需要)规定扩展名。如果文件不存在,MPlayer将试图装载〈filename〉.〈ext〉文件,〈ext〉可以是png或者PNG(按这个顺序尝试),第一个匹配文件将被使用。最后是一些用来定位的语句。通过给定X和Y坐标主窗口和副窗口可以放置在屏幕的不同的角落。0代表顶端或左端,-1代表中心然后-2代表右边或底部:(0,0) (-1,0) (-2,0)||||||(0,-1) (-1,-1) (-2,-1)||||||-9-(0,-2) (-1,-2) (-2,-2)这里有个例子可以把这个搞清楚,假设有个叫main.png的图像用来做主窗口:base=main,-1,-1MPlayer将尝试装载main,main.png,main.PNG文件。主窗口和播放条下面是所有能用于'window=main'...'end'和'window=playbar'..'end'块中的项目的列表。base=image,X,Y指定用于主窗口的背景图像,窗口将显示在屏幕上的X,Y位置,窗口的大小与图像相同。注意:这些参数目前对显示窗口不起作用。警告:图像中的透明区域(彩色的#FFOOFF)在没有XShape扩展的X服务器上是黑色的。图像的宽度必须能被8整除。button=image,X,Y,width,height,message将一个大小为width*height的按钮放置在X,Y的位置,指定的message将在按钮被点击时产生。制定的图像必须有从上到下三个部分(根据按钮的可能状态),像这样:TOC\o"1-5"\h\z+ +|pressed|+ +|released|+ +|disabled|+ +decoration=enable|disable允许或禁止windowmanager修饰主窗口,缺省设定是禁止。注意:这对显示窗口无效。hpotmeter=button,bwidth,bheight,phases,numphases,default,X,Y,width,height,messagevpotmeter=button,bwidth,bheight,phases,numphases,default,X,Y,width,height,message在X,Y位置放置一个大小为width*height的水平滑动条。所用的图像可以划分成不同的部分用来显示滑动条的不同状态(例如,你能做一个音量滑动条,当音量从最小变到最大时,滑动条的颜色从绿色变成红色。)。hpotmeter可以有一个能被水平拖曳的按钮。参数是:button—用于按钮的图像(必须有从上到下三部分,跟button中一样)-10-bwidth,bheight--按钮的大小phases—用于hpotmeter的不同的状态的图像。如果你想不要这样的图像可以使用一个特殊的值NULL。图像必须像这样被垂直划分成numphases个部分:TOC\o"1-5"\h\z+ +|phase#1|+ +|phase#2|+ ++ +|phase#n|+ +numphases—phase图像中储存的状态的数量default—hpotmeter的缺省值(范围0到100)X,Y—hpotmeter的位置width,height—hpotmeter的宽度和高度message—当hpotmeter的值改变时产生的消息potmeter=phases,numphases,default,X,Y,width,height,message没有按钮的hpotmeter,描述参数参见hpotmeterfont=fontfile,fontid定义一个字体。fontfile是以.fnt为扩展名的字体描述文件的名字(不要加上扩展名)。fontid用来代表这种字体(见dlabel和slabel),可以定义25个字体。slabel=X,Y,fontid,"text"在X,Y位置放置一个静态的标签。text将用fontid代表的字体显示,text只能是无格式文本($x之类的变量不起作用)而且必须封在一对双引号中(但是〃字符不能是text的一部分)。标签由fontid代表的字体显示。dlabel=X,Y,length,align,fontid,"text"在X,Y位置放置一个动态的标签。标签被称为动态的,因为它的;ext周期性地刷新。标签的最大限度长度由leghth给定(它的高度是字符的高度)。如果将要显示的text比给定的宽度宽,它将滚动显示,否则它将在指定的空间之内按align参数的值对齐显示:0表示靠右对齐,1表示居中对齐,2表示靠左对齐。要显示的文本由text给定,text必须封在一对双引号中(但是"字符不能是text的一部分)。标签使用由fontid代表的字体显示。可以在文本中使用下列变量:VariableMeaning$1hh:mm:ss格式的播放时间$2mmmm:ss格式的播放时间-11-$3hh(小时)格式的播放时间$4mm(分)格式的播放时间$5ss(秒)格式的播放时间$6hh:mm:ss格式的电影长度$7mmmm:ss格式的电影长度$8h:mm:ss格式的电影长度$vxxx.xx%格式的音量$Vxxx.x格式的音量$bxxx.xx%格式的声道平衡$Bxxx.x格式的声道平衡$$$字符$a一个代表音频格式的字母(none:n,mono:m,stereo:t)$ttrack号(在播放列表中)$o文件名$f小写格式文件名$F大写格式文件名$T一个代表媒体流类型的字幕(文件:f,VideoCD:v,DVD:d,URL:u)$p"p"字符(如果电影正在播放并且字体中有"p"这个字符)$s"s"字符(如果电影停止播放并且字体中有"s"这个字符)$e"e"字符(如果playback被暂停并且字体中有"e"这个字符)$x电影宽度$y电影高度$C使用的编解码器的名字注意:$a,$T,$p,$$和$e变量都返回应该被显示作为特殊的符号(例如,"e"通常代表像||这样的暂停符号)的字符,更多信息参见符号部分。副窗口下列的项目能用于'window=sub'...'end'块。base=image,X,Y,width,height窗口将在屏幕给定的X,Y位置出现(0,0是左上角)。可以用-1指定中心-2指定右边(X)和底部(Y)。窗口将和图像一样大。width和height指定窗口的大小,他们是可选的(如果没有他们,窗口是与图像同样的大小)。background=R,G,B设置背景颜色,在图像小于窗口时有用。Skin菜单如前所述,菜单用两个图像显示。正常的菜单条目从base项指定的图像中获得,当前选择的条目则从selected项指定的图像中获得。必须通过nenu项定义每个菜单条目的位置和大小。这些是能用于'window=menu'...'end'之间的项目。base=image正常的菜单条目的图像。selected=image-12-所有条目都被选择的菜单的图像。menu=X,Y,width,height,essage定义图像中一个菜单条目的X,Y位置和大小。当鼠标在该条目上被释放时产生message消息。3字体字体由一个图像和一个描述文件定义。可以将字符放置在图像中的任何地方,但是必须确保他们的位置和大小被精确的提交给描述文件。字体描述文件随着(以fnt为扩展名)能有以’;’开始的注释行。文件必须有像这样的行image=image其中image是用于字体的图像文件的名字(不必制定扩展名)。"char"=X,Y,width,height这里X和Y指定char字符在图像中的位置(0,0表示左上角)。width和height是以象素为单位的字符的尺寸。下面例子中用font.png定义A,B,C三个字符。;Canbe"font"insteadof"font.png".image=font.png;Threecharactersareenoughfordemonstrationpurposes:-)"A"=0,0,7,13"B"=7,0,7,13"C"=14,0,7,133.1符号dlabel中使用的一些变量返回的字符有特殊的意义。这些字符被显示为符号,使得播放DVD时显示一个漂亮的DVDlogo而不是字符'd'。下列的表格列出所有能被用来显示符号的字符(所以要求另一种字体)。字符符号p播放s停止e暂停n无声m单声道t立体声f媒体流是文件v媒体流是VideoCDd媒体流是DVDu媒体流是URL4.GUI信息GUI信息是能被按钮,滑动条和菜单项产生的消息。注意:一些信 息可能不像所预想的那样工作(或者根本不工作),因为GUI还在开发中。-13-Playback控制:evNext:跳到播放列表中下一个track。evPause:暂停播放。evPauseSwitchToPlay:与evPlaySwitchToPause—起形成开关。他们能用来实现普通的播放/暂停按钮。两条信息应该被分配到窗口中同一位置的两个按钮上。这条信息暂停播放并使evPlaySwitchToPause按钮的图像显示出来(表明点击按钮能继续播放)。evPlay:开始播放。evPlaySwitchToPause:与evPauseSwitchToPlay对应的消息。这条信息开始播放并使evPauseSwitchToPlay按钮的图像显示出来(表明点击按钮能暂停播放)。evPrev:跳到播放列表中上一个track。evStop:停止播放。搜索:evBackward10secevBackward1minevBackward10min向后搜索10秒/1分钟/10分钟。evForward10secevForward1minevForward10min向前搜索10秒/1分钟/10分钟。evSetMoviePosition搜索到制定位置(能被滑动条使用;使用与滑动条相关的值(0-100%))。视频控制:evDoubleSize:把电影窗口置为双倍大小。evFullScreen:切换全屏方式。evNormalSize:把电影窗口置为正常大小。音频控制:evDecAudioBufDelay:减少音频缓冲延迟。evDecBalance:减少声道平衡。evDecVolume:减少音量。evIncAudioBufDelay:增加音频缓冲延迟。evIncBalance:增加声道平衡。evIncVolume:增加音量。evMute:禁音/取消禁音。evSetBalance:设置声道平衡(能被滑动条使用;使用与滑动条相关的值(0-100%))。evSetVolume:设置音量(能被滑动条使用;使用与滑动条相关的值(0-100%))。-14-其他:evAbout:打开关于窗口。evEqualizer:打开/关闭均衡器。evExit:退出程序。evIconify:窗口图标化。evLoad:装载文件(打开一个文件浏览窗口,你能在其中选择文件)。evLoadPlay:功能与evLoad一样,但是它在文件之后装载自动地开始播放。evNone:空信息,它没有效果(也许CVS版本除外:-))。evPlaylist:打开/关闭播放列表窗口。evPlayDVD:尝试打开指定的DVD-ROM驱动器中的碟片。evPlayVCD:尝试打开指定的CD-ROM驱动器中的碟片。evPreferences:打开选项设置窗口。evSetAspect:设置显示图像的屏幕高宽比。evSetURL:显示URL对话窗口。evSkinBrowser:打开skin浏览器窗口。-15--16--17-Mplayer.cmain(){Initinputandguidemux_openinit_best_audio_codecinit_best_video_outvf_open_filterinit_best_video_codecpreinit_audio_filtersinit_best_audio_outbuild_afilter_chain{init_audio_filters}Eventsloop{decode_audioaudio_out->playvideo_read_framedecode_video}Exit}Libmpcodes/dec_audio.caudio_codec_list=NULL{selectcode()Initcode()}Libmpdemux/Demuxer.c{New_demuxer(stream)Open_demux_fmt(demux)}fmt的值为:avi,real,rtp….等对应函数分布在demux_avi.c,demux_real.c,demux_rtp.c….中Libmpcodes/dec_audio.c从mpcodecs_ad_drivers中选择解码器初始化}Ad.cmpcodecs_ad_drivers:mp3,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国数字营销行业市场深度研究及投资方向与风险防控建议报告
- 2026中国物流配送行业市场分析供需平衡评估投资布局规划发展研究
- 2026中国物流仓储行业市场竞争分析发展深度与发展规划及供应链管理
- 2026农业科技行业市场供需分析及风险防控研究报告
- 药物治疗学章节试题及答案
- 2026年初中历史专项训练试卷
- 2026后疫情时代运动医学器械市场渗透率提升策略深度调研
- 2026中国西药行业市场深度调研及发展规划和投资前景预测研究报告
- 2026年鄂尔多斯新高考数学全程复习规划与备考指南(一轮+二轮+三轮)含易考题、常考题、易错题
- 2026中国现代农业科技应用与农产品品牌化发展研究报告
- 政府机构沟通技巧培训:提升政府公共服务水平
- 医院义务消防队组织管理
- 淫羊藿栽培技术
- 飞机隐身涂层课件
- 市政工程质量控制资料用表
- 护理礼仪与人际沟通PPT(高职)全套教学课件
- 压疮分期及护理
- 钢铁有限责任公司大方坯连铸工程初步方案设计
- 秘书实务第四章接待工作
- GB 14101-1993木质防火门通用技术条件
- GA 871-2010防爆罐
评论
0/150
提交评论