当前位置:文档之家› 第12章-多媒体技术

第12章-多媒体技术

第十二章多媒体技术

多媒体技术是计算机对声音、音乐、图形、图像、影像和动画等信息的处理。Delphi对多媒体数据的处理有多种方法,一是使用Delphi 中自带的TMediaplayer控件, 二是直接使用Windows MCI API的函数,三就使用第三方控件。本章选取了一些典型的问题作为介绍: 主要包含以下几个方面

1)TMediaPlayer的使用;

2)关于WaveAPI;

3)语音库技术;

4)动画的实现;

5)Mepg-I影像的播放;

6)数据影像格式。

这些观点是参加讨论网友的个人观点,仅供参考。

本章目录

ID 题目

92702 在D4中用MediaPlayer.FileName时,老提示未定

义FileName?

93092 如何编程控制Wave口的音量

96466 有汉语text to speeh引擎吗?

107416 如何全屏幕播放MPEG I视频文件-- BY CJ

98644 关于底层waveAPI

100101 求ani格式说明与读取各帧的方法

101694 急问如何用delphi3.0编写独立的"mp3播放器

"????!!!!

102290 如何在.DAT或.MPG中读取图像

104900 请问mp3文件的格式

105265 放CD(20)

109601 多媒体小问题

提出问题:在D4中用MediaPlayer.FileName时,老提示未定义FileName? 答案提供者:唐晓锋

来自:wtiebo 时间:1998-11-21 23:49:45ID:92702

来自:Another_eYes 时间:1998-11-22 1:22:14

ID:92714

是否filename为空并且选择了AutoOpen?

来自:wtiebo 时间:1998-11-22 3:34:55 ID:92729

Yes.But WHY? I can't understand . But thank you yet!

来自:dyf 时间:1998-11-22 12:15:54ID:92742

因为device初始设置为autodetect,open时需根据filename确定驱动程序

来自:Another_eYes 时间:1998-11-22 15:17:49

ID:92762

正确, 所以我劝您别把autodetect打开, 既然你好象需要动态改变filename的, 每次设完filename后自己调用open和play得了, 也很简单嘛

来自:CJ 时间:1998-11-22 22:27:16ID:92821

好不容易找到个简单的...

我用MEDIA PLAY时不用AUTOOPEN而用这样的代码

try

mediaplayer1.filename := 'ani.avi';

mediaplayer1.open

except

mediaplayer1.visable := false //我把动画在MEDIAPLAYER中播放end;

来自:wtiebo 时间:1998-11-24 21:49:01ID:93000 但是,问题依然存在。是否我的DELPHI4装得有问题?不过,在装的过程中,没出现任何问题。

来自:唐晓锋时间:1998-11-25 10:50:12ID:93048

用我下面的例子保证没错!

procedure TForm1.Button1Click(Sender: TObject);

begin

MediaPlayer1.FileName:='c:\windows\media\the microsoft sound.wav';

MediaPlayer1.Open;

MediaPlayer1.Play;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

mediaPlayer1.FileName:='C:\WINDOWS\MEDIA\Office97\Camera.wav

';

MediaPlayer1.Open;

MediaPlayer1.Play;

end;

Good Luck!

来自:唐晓锋时间:1998-11-25 12:05:02ID:93053

补充一点: AutoOpen -> False

ShareAble -> False

应在属性表里面定好

来自:wtiebo 时间:1998-11-25 15:54:39ID:93090

谢谢各位大虾!

来自:smallshrimp 时间:1998-11-25 16:14:32 ID:93095

光谢谢就够了吗?*_~加分!

来自:wtiebo 时间:1998-11-25 17:50:41ID:93126

当然,但我还不知到问题是否已被解决.能不能先等等?

来自:CJ 时间:1998-11-25 23:13:25ID:93156

实在不幸把程序贴上来,三分钟把它搞定!

来自:wtiebo 时间:1998-11-26 7:22:45 ID:93179

接受答案了.

提出问题:如何编程控制Wave口的音量

答案提供者:MengZhaoXing-90,pegasus-10,

来自:walkdan 时间:1998-11-25 16:02:56ID:93092

1. waveOutSetVolume(hwo: HWAVEOUT; dwVolume: DWORD)

中的hwo参数怎么用?

2. 声卡各音量怎么控制

来自:smallshrimp 时间:1998-11-25 16:31:50

ID:93100

听说mciSendCommand可以

来自:pegasus 时间:1998-11-25 16:46:54ID:93105 waveOutSetVolume(hwo: HWAVEOUT; dwVolume:DWORD)

hwo param means: a handle of a Wave Out DEVICE,

that device is opened by

waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPWAVEFORMATEX pwfx,

DWORD dwCallback, DWORD dwCallbackInstance, DWORD fdwOpen); hwo is returned (phwo points to the address).

来自:MengZhaoXing 时间:1998-11-25 23:23:59

ID:93159

walkDan:

waveOutSetVolume(hwo: HWAVEOUT; dwVolume:DWORD)

dwVolume --- 音量大小 HWORD---Left volume

LWORD--Right volume

来自:walkdan 时间:1998-11-25 23:34:34ID:93164

最近在外地出差,目前的条件只有一台能上网机器,

机器上的Delhpi Help又出了问题,但问题得马上解决。

 怎么办?

想到了Delphi之大富豪论坛。

面对API的众多参数 . . .

一咬牙,愿意出100两买问题的答案---完整源程序.

在外靠大虾,在家靠Help。

来自:MengZhaoXing 时间:1998-11-25 23:34:48 ID:93165

walkDan:

waveOutSetVolume(hwo: HWAVEOUT; dwVolume:DWORD)

dwVolume --- 音量大小 HWORD---Left volume

LWORD--Right volume

来自:MengZhaoXing 时间:1998-11-26 16:55:30 ID:93258

在以下地址有一个音量控制构件,可以控制各种音量。

https://www.doczj.com/doc/141567992.html,/~rainbowy/delphic.htm

可以丢掉 API 了, :-D

来自:walkdan 时间:1998-11-26 19:51:43ID:93272

找到了volctrl3.zip, 一解然眉之集!

来自:walkdan 时间:1998-11-26 21:36:07ID:93274

多人接受答案了。

提出问题:有汉语text to speeh引擎吗?

答案提供者:CJ-50,DNChen-10,jiangtao-10,pegasus-20,tqz-10,

来自:chenke 时间:1999-01-01 6:10:28 ID:96466

我利用微软的sapi sdk,engish tts 引擎,Delphi Talk component制作了一个朗读英语文章的程序,但不知有没有汉语tts引擎,或制造汉语tts引擎的方法?

sapi sdk html

https://www.doczj.com/doc/141567992.html,/tti

来自:DNChen 时间:1999-01-01 11:40:13ID:96472

IBM的Viavoice好象可以提供类似功能。

来自:CJ 时间:1999-01-01 22:39:21ID:96498

在已答问题中有讨论,好象没有很好的结果

来自:CJ 时间:1999-01-01 22:58:01ID:96500

chenke: I cannot find the url u have ritten if it is not large please

mail me a copy! or give the right url to down load thanks a lot 来自:chenke 时间:1999-01-02 16:57:35ID:96551

viavoice 是SR(语音识别技术)

来自:chenke 时间:1999-01-05 14:16:52ID:96727

斑竹,把这问题上删除了吧.

来自:pegasus 时间:1999-01-05 18:30:38ID:96768

A Simple way:

Using Chinese char code to get its PinYin input str, so that we can get the pronunciation, but I do not know hot to tell the difference of achar's multiple proonunciations, :( With PinYin input staring, you can translate it into English pronuncing mark, then let your English engine read it, :)

A fantasy!

来自:chenke 时间:1999-01-05 20:15:21ID:96791

恕罪,小可听不懂。

来自:tqz 时间:1999-01-05 21:20:46ID:96803

pegasus的意思大概是用读英语的方式读汉语拼音,其实就是把汉语读音变成英语

的音标,是吧?不过这样最好的结果也不过是象老外读汉语的腔调吧?

来自:CJ 时间:1999-01-05 22:15:17ID:96813

1、反查拼音,然后模拟发音

2、把所有可能的拼音组合(字典的拼音索引)朗读、建库,然后反查拼音发音。来自:chenke 时间:1999-01-05 22:50:13ID:96828

不好意思,重复一下:是做tts引擎,要求符合Sapi,符合tts标准,可用SApi调用, 不是做汉字语音库。汉字语音库我已有了,是按声标排列。男声,

11200,intalk.zip

可到https://www.doczj.com/doc/141567992.html,/~newhua上下载。

来自:CJ 时间:1999-01-07 23:27:32ID:97075

chenke:

I have this soft but how can i use it? please a l ittle example or

document thank you

来自:chenke 时间:1999-01-08 0:26:39 ID:97089

你想使用汉字语音库,还是软件;如果是软件的话,要读文章的话,用copy ,paste 方法, 该我加分!$-)

来自:CJ 时间:1999-01-08 0:41:30 ID:97093

软件我还不会,淡然是语音库

来自:chenke 时间:1999-01-08 1:00:09 ID:97096

用cooledit96选单声道,11000载入,把他然读一遍试试看。

来自:CJ 时间:1999-01-10 23:27:00ID:97452

我的意思是在自己的程序里使用

来自:chenke 时间:1999-01-10 23:33:13ID:97455

他好象用 | 来分开每个音,每个音的物理长度也一样,看一下Cool eidt96的下标,

具体我没试过.

来自:CJ 时间:1999-01-10 23:39:17ID:97459

Cool eidt96哪里有?

来自:jiangtao 时间:1999-01-10 23:59:00ID:97462

怎么在华军找不到intalk文件

来自:chenke 时间:1999-01-11 0:03:55 ID:97463

https://www.doczj.com/doc/141567992.html,

user:Andre Lagua s/n:TNDTMEWV

来自:huizhang 时间:1999-01-12 0:26:46 ID:97667

To ChenKe, Why can't fint sapi sdk html ->

https://www.doczj.com/doc/141567992.html,/tti?

提出问题:如何全屏幕播放MPEG I视频文件-- BY CJ

答案提供者:lhz-90,QiangQiang-10,

来自:CJ 时间:1999-05-01 10:37:30ID:107416

需要做全屏播放 MPEG I 视频信息(*.mpg or *.mpeg)的程序

Required://本题分数

1、效率要高

2、无版权问题

3、急

Optional://如能实现最好,需要的话,可以加分

1、有源码

来自:CJ 时间:1999-05-01 13:46:50ID:107425

1.延迟真的没有办法了吗?这是我问这个问题最主要的原因,如果有0.5秒的延迟用起来会很不舒服的。

2.我会考虑压缩,但是如何实现呢?这些算法有没有现成的 SOURCE 可用?自己做会做死的。LHZ应该对压缩有心得吧:)

3.RSVP如何实现?我现在没有路由,但将来可能用到,我本来是直接用SOCKET ,现在需要改进吗?

4.群体电话延迟更难过,请再详细说明:如何不听到自己的声音?

5.视频这是将来的事情,而且,一定会有摄影头什么的,他应该会提供一点压缩什么的功能吧?不然自己写压缩的话,速度可能达不够。

to all and especially to huizhang:哪位大侠如果有音频/视频通讯程序的SOURCE可以参考(简单点的就可以,复杂了CJ看不懂)可以加分。CJ要把自己的积分控制在3,000以内

来自:lhz 时间:1999-05-01 19:23:54ID:107441

??

我好象回答的另一个问题,您怎么把回贴贴到这里了? :) //haha

先说语音的问题:

1.不可能解决.延迟是肯定存在的,只有长短问题.如果网络通信带宽有

保障,系统硬件跟得上,可以将延迟控制在30ms.要再短就非常困难了,

除非用专门硬件并铺设专门网络......

如果不要求复杂的控制,可以在一般的PC机上实现0.2S左右的延时.

如果再缩短延迟,将严重影响回放质量(可能都听不见了).

2.有关于这些标准的源代码,但效率都比较低,只有理论上的意义.要实

用的编码器,还得自己编.不过有一个投机取巧的方法,就是用M$的

ACM(Audio Codec Manager).M$的Netmeeting带有G.723.1等几个

ACM,可以试试.我是没有试过的(如果用M$的ACM编码,就只有M$的

ACM可以解得开了.但有个附加的好处,就是可以将编码几个直接存成

WAV文件,在安装有这个ACM的系统上都可以直接播放).

3.RSVP是资源预约的协议,对当前网络通信的影响不大.如果考虑将来要

使用RSVP,那么现在用UDP通信就可以了.RSVP只对UDP有效.语音/视频等实时数据也只需要UDP.

4.设有N个终端,一个服务器,对终端i来说,服务器要将N个终端中除i以外的(N-1)路语音混合,再发送给i.每一路都要这种处理.这样,各个终端

收到的数据中就没有自己的声音了.

5.摄像头肯定不会提供压缩的,它输出的数据是模拟信号.可能有压缩的

是采集卡.但有压缩功能的采集卡都很贵.而且,采集卡提供的压缩算法

基本上没有甚麽用处,因为(1)它压缩的码率一般不能满足要求(2)它

输出的压缩格式只有自己能解开.

6.没有简单的音频/视频通讯程序,这些程序都很复杂,如果是实用的.网上可以找到各种标准的编解码器,但都是原理性的,效率很差.完整的系统

比较少见.我倒是编过一个屏幕传输的程序(LAN,5-8帧每秒),可以冒充简单的视频通信,但已经卖给别人了,所以不能给您:(

7.其实延时并不是那么难受.在通信双方只能通过网络交流时,0.5S的延时不会有太大的感觉.国际长途通常都有超过0.5S的延时,您是否有明显的感觉?

关于全屏播放MPEG-I,当然是用ActiveMovie了.那是M$自己的东东,OS都带的,自然没有版权问题,效率还能忍受(感觉比超级解霸好),用ActiveX 控件控制,Delphi下方便又快捷.

BTW:不要去找有source的MPEG-I播放器.MPEG-I的解码是很费计算量的, 不做专门优化的代码效率实在非常低下.而做了专门优化的代码都是

要卖钱的.

CJ是不是两个题都要给我加分呀? :)

来自:CJ 时间:1999-05-07 23:13:07ID:107517

呵呵

这里只谈第这个问题吧:

RE1:用ACTIVEX总觉得不舒服,而且,我要在一台烂机器上用,程序是用MCI写的,要改很吃力。

RE2:想要,有吗?

RE3:那要看你了:-)

来自:lhz 时间:1999-05-08 10:45:33ID:107576

RE1:MCI也可以控制ActiveMovie播放MPEG.Win95就带ActiveMovie,IE4将其升级

到DirectShow,但都都是兼容的.ActiveX是不舒服,但用起来简单.

RE2:我有一些MPEG的编/解码器,但没有for Win32的 :( 如果要查找这方面的资料,

可以到https://www.doczj.com/doc/141567992.html,,我的代码都是从这里

找到的.

来自:CJ 时间:1999-05-08 22:03:36ID:107638

哦?可是ACTIVEMOVICE的筐好象去不掉

直接用TMEDIAPLAYER可以利用ACTIVEMOVICE?

来自:lhz 时间:1999-05-09 10:52:18ID:107684 TMediaPlayer是用MCI播放的,好象不能全屏幕.

将ActiveMovie的FullScreenMode设成true,就没有筐了.绝对全屏幕.

来自:CJ 时间:1999-05-09 15:38:22ID:107691

>TMediaPlayer是用MCI播放的,好象不能全屏幕.

什么意思?是不是如果用MEDIAPLAYER用ACTIVEMOVICE放不能全屏?用XING 可以的。

来自:lhz 时间:1999-05-09 16:00:31ID:107694

不是。TMediaPlayer是用MCI调用ActiveMovie。ActiveMovie的文档

上有关于用MCI控制的说明。我不知道用MCI是否能让ActiveMovie全屏

(也就是说,MCI有FULLSCREEN的选项吗?)。我没有用过MCI。

来自:CJ 时间:1999-05-09 21:50:44ID:107711

好象没有,不过TMediaplayer有类似的用法:

Mediaplayer1.DispRect := Rect(0,0,640,480);

ACTIVE MOVICE的效果比XING好吗?

来自:QiangQiang 时间:1999-05-09 22:45:08 ID:107726

如果用ActiveMovie播放MPEG,可以看看我刚学DELPHI时写的一个程序,一个多媒体播放器,也是用ActiveMovie播放MPEG,我是用WINAPI函数把窗体的标题档动态隐藏,然后窗体最大化(当然ActiveMovie的可视面积也随之变化),完全可达到满屏。当然,如果用TMediaPlayer来写也应该行得通。

源程序我放在:

https://www.doczj.com/doc/141567992.html,/grwy/qqxw/myapp/ptmpeg/delphi/source. zip

有些附带文件要安装了运行版的程序才能得到:

https://www.doczj.com/doc/141567992.html,/grwy/qqxw/myapp/ptmpeg/delphi/ptmpeg. zip

如果有98年《电脑报配套光盘之PC世界》第三期的话,光盘里就有。

后来我发现如果用mciexecute函数来写多媒体程序的话,会更简单,有兴趣的话可来信讨论。

来自:CJ 时间:1999-05-09 23:00:13ID:107730 QiangQiang:我看过你的程序,不过,问题是我不想用ACTIVEX,因为我已经用MEDIAPLAYER搞好了程序,问题只是选个驱动程序而已,现在最后的问题是:ACTIVEMOVICE是否效率比XING高?

BTW TO 强强:你的主页怎么了?

来自:QiangQiang 时间:1999-05-09 23:59:07 ID:107732

感觉上ACTIVEMOVICE音效比XING好,解码比XING慢一点。XING读烂盘的功夫比ACTIVEMOVICE差一点。纯属个人看法。

BTW TO:我的主页怎么了是何意思?

来自:CJ 时间:1999-05-10 0:15:02 ID:107734

我还是考虑XING,有其它好的驱动程序吗?

你的主页许多连接连不上

来自:李颖时间:1999-05-10 14:07:19ID:107794

没有那么麻烦!

直接用TMediaPlayer就可以搞定了,

全屏播放的问题也很容易解决:

1、将Form设置为没有边框,最大化

2、将播放区域指定到Form上,方法:

(1)MediaPlayer1.Display:=Form1;

(2)MediaPlayer1.DisplayRect:=<自己指定>;

注意如果指定的Rect大小与画面大小不一致,会有缩放效果。

你还可以指定到Form上的一个Panel上,搞得象个电视机一样,等等等等其他的花招。

来自:CJ 时间:1999-05-10 21:25:33ID:107844

TO 李兄:

>没有那么麻烦!

不麻烦。什么问题都解决了(如果连这都解决不了,CJ不写程序,拿DELPHI回家烧汤喝了)问题只是找个适合的驱动程序而已,仔细看上面的帖子

来自:CJ 时间:1999-05-14 23:25:28ID:108388

先谢了,有发现麻烦告诉我

提出问题:关于底层waveAPI

答案提供者:chenke-10,jiangtao-40,

来自:zph 时间:1999-01-21 18:34:06ID:98644

谁有关于底层waveAPI的例程?

来自:Nova 时间:1999-01-22 15:15:12ID:98698

在Vc的例程中就有.

samples/sdk/reverse/

samples/sdk/directx/dsound

你可以去找一找

来自:jiangtao 时间:1999-01-23 7:10:55 ID:98798

文章来源:uddu 97年9月(文章太长,

我没贴全,if you can't find it,you can email me)

UNDU, Sept 1997 article "Playing and Recording Sound in Delphi" by Darryl Gove

你还可以使用控件Audio 4.0(可以从很多地方

download)

1. Do you have a soundcard?

if WaveOutGetNumDevs=0 then

application.messagebox('Error', 'No s ound playing card', mb_OK);

if waveInGetNumDevs=0 then

application.messagebox('Error','No recording sound card',mb_ok);

2.Getting a handle on it.

HwaveOut:=new(PHwaveOut);

i:=waveOutOpen(HWaveOut,0,Pwaveformat(WaveFormat),form1.hand le,0,CALLBACK_WINDOW);

if i<>0 then

application.messagebox('Error', 'Problem creating play handle', mb_OK);

HwaveIn:=new(PHwaveIn);

i:=waveInOpen(HWaveIn,0,Pwaveformat(WaveFormat),form1.handle ,0,CALLBACK_WINDOW);

if i<>0 then

application.messagebox('Error', 'Problem creating record handle', mb_OK);

3.Being prepared

The final thing to do is to start either playing sound or recording sound.

To do this we need to send packets of memory to the sound card either to play or to record on.

When you send data out to be played,

the playing starts immediately you add a packet of data, extra packets of data are added to a queue, and played in sequence. If youre recording then the blocks of memory are once again added to a queue -

but they are not recorded on until you tell the com puter to start recording.

If the computer runs out of packets to record on then the recording stops.

So the first thing to do is to get a block of memory and to set up the data block

that will tell the multimedia subsystem about it.

Tmemblock=array[0..memblocklength] of byte;

memBlock:=new(PmemBlock);

Nows a good time to put your audio data into the memory block - if youre playing audio.

Header:=new(PwaveHdr);

with header^ do

begin

lpdata:=pointer(memBlock);

dwbufferlength:=memblocklength;

dwbytesrecorded:=0;

dwUser:=0;

dwflags:=0;

dwloops:=0;

end;

Except for setting the pointer to a block of memory, and the length of the block of memory, all the other fields should be set to zero - unless you want to play the same block of dat a multiple times.

The next step is to prepare the data, why this is necessary, I dont know!

i:=waveOutPrepareHeader(HWaveOut^,Header,sizeof(TWavehdr)); if i<>0 then

application.messagebox('Out Prepare error','error',mb_ok); i:=waveInPrepareHeader(HWaveIn^,Header,sizeof(TWavehdr));

if i<>0 then

application.messagebox('In Prepare error','error',mb_ok); Then we need to send the new block of data to the audio device - either to be played or to be recorded on.

i:=waveOutWrite(HWaveOut^,Header,sizeof(TWaveHdr));

if i<>0 then

application.messagebox('Wave out error','error',mb_ok);

i:=waveInAddBuffer(HWaveIn^,Header,sizeof(TWaveHdr));

if i<>0 then

application.messagebox('Add buffer error','error',mb_ok); The final thing to do when recording sound is to start!

i:=waveInStart(HwaveIn^);

if i<>0 then

application.messagebox('Start error','error',mb_ok);

There are also commands to stop and pause recording.

4.Messages

If youre using messages to control the recording an playback of audio,

then you need to have some handlers for the messages.

The handlers should be something like

procedure MMOutOpen(var msg: Tmessage); message MM_WOM_OPEN; procedure MMOutClose(var msg: Tmessage); message MM_WOM_CLOSE; procedure MMOutDone(var msg: Tmessage); message MM_WOM_DONE; procedure MMInOpen(var msg: Tmessage); message MM_WIM_OPEN; procedure MMInClose(var msg: Tmessage); message MM_WIM_CLOSE; procedure MMInDone(var msg: Tmessage); message MM_WIM_DATA; 来自:tqz 时间:1999-01-23 18:40:21ID:98818

我的竹叶上有几个关于wave的VCL

在新控件里

提出问题:求ani格式说明与读取各帧的方法

答案提供者:delphi fan2

来自:Another_eYes 时间:1999-02-05 23:13:21

ID:100101

如题

来自:barton 时间:1999-02-06 3:27:28 ID:100130

读一下RxLIB2.5中的Anifile.pas和Animate.pas的原码,

一切都明白了。

来自:huizhang 时间:1999-02-06 7:14:58 ID:100133

Ani是Animate Icon文件, 每一帧都是一个Icon

[编者注] Rxlib2.5是一个著名的免费控件组。在许多站点都可以找到。

提出问题:急问如何用delphi3.0编写独立的"mp3播放器"????!!!!

答案提供者:yysun

来自:amos 时间:1999-03-05 0:02:30 ID:101694

告急:

各位大侠,我想用delphi3编写一个独立的mp3播放器,最近由

https://www.doczj.com/doc/141567992.html,的"软件下载\编程工具"下载了一个mp3play.ocx

这个mp3的ActiveX的控件版本号为v1.4。然而使用后这未注册版,不能播放完整的mp3。

请问:此那伟大侠由此控件的注册号?是否有另外的免注册的独立的mp3控件或更好的解决方

来自:yysun 时间:1999-03-05 8:55:25 ID:101704

向您推荐一个不错的控件(mpegplay.zip)

来自:borland 时间:1999-03-27 10:40:40ID:103125

mpegplay.zip好象也不好用,仅能播放十几秒钟。

来自:bluebird 时间:1999-04-27 19:49:34ID:106870

不是的,endpos设置对了就可以放全了

提出问题:如何在.DAT或.MPG中读取图像

答案提供者:huizhang-60,yuan-40,

来自:kane 时间:1999-03-16 10:44:44ID:102290

相关主题
文本预览
相关文档 最新文档