导航:首页 > 文件处理 > mfc视频压缩与解压缩

mfc视频压缩与解压缩

发布时间:2022-04-28 06:29:15

Ⅰ 求助压缩解压缩程序源代码

压缩文件的基本原理是查找文件内的重复字节,并建立一个相同字节的"词典"文件,并用一个代码表示,比如在文件里有几处有一个相同的词"中华人民共和国"用一个代码表示并写入"词典"文件,这样就可以达到缩小文件的目的.
由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。为了有助于理解文件压缩,请您在脑海里想象一幅蓝天白云的图片。对于成千上万单调重复的蓝色像点而言,与其一个一个定义“蓝、蓝、蓝……”长长的一串颜色,还不如告诉电脑:“从这个位置开始存储1117个蓝色像点”来得简洁,而且还能大大节约存储空间。这是一个非常简单的图像压缩的例子。其实,所有的计算机文件归根结底都是以“1”和“0”的形式存储的,和蓝色像点一样,只要通过合理的数学计算公式,文件的体积都能够被大大压缩以达到“数据无损稠密”的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的数据不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式mpeg、音乐文件格式mp3和图像文件格式jpg。但是更多情况下压缩数据必须准确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软件(compression software)自然就是利用压缩原理压缩数据的工具,压缩后所生成的文件称为压缩包(archive),体积只有原来的几分之一甚至更小。当然,压缩包已经是另一种文件格式了,如果你想使用其中的数据,首先得用压缩软件把数据还原,这个过程称作解压缩。常见的压缩软件有winzip、winrar等。
有两种形式的重复存在于计算机数据中,zip就是对这两种重复进行了压缩。
一种是短语形式的重复,即三个字节以上的重复,对于这种重复,zip用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩,这很容易理解。
一个字节有 0 - 255 共 256 种可能的取值,三个字节有 256 * 256 * 256 共一千六百多万种可能的情况,更长的短语取值的可能情况以指数方式增长,出现重复的概率似乎极低,实则不然,各种类型的数据都有出现重复的倾向,一篇论文中,为数不多的术语倾向于重复出现;一篇小说,人名和地名会重复出现;一张上下渐变的背景图片,水平方向上的像素会重复出现;程序的源文件中,语法关键字会重复出现(我们写程序时,多少次前后、paste?),以几十 K 为单位的非压缩格式的数据中,倾向于大量出现短语式的重复。经过上面提到的方式进行压缩后,短语式重复的倾向被完全破坏,所以在压缩的结果上进行第二次短语式压缩一般是没有效果的。
第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。其中,某些字节出现次数可能较多,另一些则较少,在统计上有分布不均匀的倾向,这是容易理解的,比如一个 ASCII 文本文件中,某些符号可能很少用到,而字母和数字则使用较多,各字母的使用频率也是不一样的,据说字母 e 的使用概率最高;许多图片呈现深色调或浅色调,深色(或浅色)的像素使用较多(这里顺便提一下:png 图片格式是一种无损压缩,其核心算法就是 zip 算法,它和 zip 格式的文件的主要区别在于:作为一种图片格式,它在文件头处存放了图片的大小、使用的颜色数等信息);上面提到的短语式压缩的结果也有这种倾向:重复倾向于出现在离当前压缩位置较近的地方,重复长度倾向于比较短(20字节以内)。这样,就有了压缩的可能:给 256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。

Ⅱ 如何减小MFC程序

要用MFC只能如此,除非你不用。

不过用MFC也不至于有2M吧,除非是DEBUG版,Release版一般的小程序都在100k以下。

另外在vc里有优化选项,你可以选择优化速度,也可以选择优化程序大小,选择优化大小看情况,大概还可以减少几k的量。

-----

鼠标右键点击工具栏,选择“build”或“组建”

Ⅲ mfc怎么做录音程序

MFC多媒体开发
======================
高层音频接口:播放声音资源/文件
调用MCI::Media Control Interface 和Api::MessageBeep,sndPlaySound,PlaySound
底层音频接口:数据采集
开发一般步骤:
检测音频设备->打开驱动程序->分配缓冲区->管理缓冲区->操作音频数据->释放缓冲区->关闭驱动程序.
SDK参考::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_multimedia_functions.htm
多媒体控制两种方式可选:调API,执行命令.
MCI命令结构:
系统命令:直接由MCI解析,并由系统处理,与设备无关
通用命令:由设备驱动处理
可选命令:
扩展命令:
常用MCI命令:
MCI_OPEN,MCI_PLAY,MCI_RECORD,MCI_STATUS,MCI_SET,时间操作宏命令.
--------------------------------------------------------
视频开发:
Microsoft基于视频软件工作平台 VFW(Video For Windows,Avi标准),六个DLL
AVICAP.DLL,::视频采集函数
MSVIDEO.DLL,DrawLib函数,回放用
MCIAVI.DRV.MCI命令解析
AVIFILE.DLL,支持从标准IO访问AVI文件.
VCM,包含视频压缩/解码工具(CODEC)
ACM,针对AVI提供视频压缩/解码
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_video_for_windows.htm
视频媒体:图像,数字视频,
使用AVIFile操作 AVI文件步骤:
初始化AviFileInit->打开文件AviFileOpen->取文件信息AviFileInfo->打开数据流AviFileGetStream->获取数据流信息AviFileStreamInfo->操作数据流AviStream::Read,Write,ReadFormat,SetFormat等->关闭文件AviFileRelease->释放 AviFileExit;
AVI视频采集:AVICap:
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_video_capture.htm
AVI视频播放:DrawDib
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_drawdib.htm
AVI视频编解码:VCM::Video Compression Manager
MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/multimed/htm/_win32_video_compression_manager.htm
播放工具:ActiveMovie控件.
应用示例::MSDN::ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vcsample/html/dade0c5d-ddc8-4ceb-8a15-e58efd37af3e.htm

追问:
关于录音频的函数有哪些呢?谢谢
回答:
不好意思,有一个重要的函数没有列出,添加如下:
=====================================================
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWord dwFlags, DWORD dwParam);
第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,见后面MCI指令清单,其中有有关录音的指令。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。

MCI的设备类型:
设备描述 描述字符串 说明
MCI_ALL_DEVICE_ID 所有设备
MCI_DEVTYPE_ANIMATION Animation 动画设备
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音频
MCI_DEVTYPE_DAT Dat 数字音频
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 数字视频
MCI_DEVTYPE_OTHER Other 未定义设备
MCI_DEVTYPE_OVERLAY Overlay 重叠视频
MCI_DEVTYPE_SCANNER Scanner 扫描仪
MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
MCI_DEVTYPE_VCR Vcr 合式录像机
MCI_DEVTYPE_VIDEODISC Videodisc 激光视盘
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音频
MCI指令
MCI_BREAK设置中断键,缺省是”CTRL+BREAK"
MCI_CAPTURE抓取当前帧并存入指定文件,仅用于数字视频
MCI_CLOSE关闭设备
MCI_CONFIGURE弹出配置对话框,仅用于数字视频
MCI_COPY拷贝数据至剪贴板
MCI_CUE延时播放或录音
MCI_CUT删除数据
MCI_DELETE删除数据
MCI_ESCAPE仅用于激光视频
MCI_FREEZE将显示定格
MCI_GETDEVCAPS获取设备信息
MCI_INDEX当前屏幕显示与否,仅用于VCR设备
MCI_INFO获取字符串信息
MCI_LIST获取输入设备数量,支持数字视频和VCR设备
MCI_LOAD装入一个文件
MCI_MARK取消或做一个记号,与MCI_SEEK配套
MCI_MARK取消或做一个记号,与MCI_SEEK配套
MCI_MONITOR为数字视频指定报告设备
MCI_OPEN打开设备
MCI_PASTE粘帖数据
MCI_PAUSE暂停当前动作
MCI_PLAY播放
MCI_PUT设置源、目的和边框矩形
MCI_QUALITY定义设备缺省质量
MCI_RECORD开始录制
MCI_RESERVE分配硬盘空间
MCI_RESTORE拷贝一个bmp文件至帧缓冲
MCI_RESUME使一个暂停设备重新启动
MCI_SAVE保存数据
MCI_SEEK更改媒体位置
MCI_SET设置设备信息
MCI_SETAUDIO设置音量
MCI_SETTIMECODE启用或取消VCR设备的时间码
MCI_SETTUNER设置VCR设备频道
MCI_SETVIDEO设置video参数
MCI_SIGNAL在工作区上设置指定空间
MCI_STATUS获取设备信息
MCI_STEP使播放设备跳帧
MCI_STOP停止播放
MCI_SYSINFO返回MCI设备信息
MCI_UNDO取消操作
MCI_UNFREEZE使使用MCI_UNFREEZE的视频缓冲区恢复运动
MCI_UPDATE更新显示区域
MCI_WHERE获取设备裁减矩形
MCI_WINDOW指定图形设备窗口和窗口特性
其中比较常用的指令有MCI_OPEN、MCI_RECORD、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。

举例:
//关闭一个MCI设备
mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL);
//打开CD播放器
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);

Ⅳ 毕业设计的课题是《压缩与解压缩的软件实现》 想用C++做,求高手指导啊!!

请问你的毕设做好了吗?问题解决了吗?

Ⅳ VC MFC 想用bzip2 来解压文件流

首先,如果你的开发环境是vs2005以上,就可以使用c#里面的类了。要在项目设置里设置一下。
当然,要解压,有很多库可以使用。例如zlib这个库。

Ⅵ 霍夫曼 解压缩

哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。这种方法是由David.A.Huffman发展起来的。 例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。

本文描述在网上能够找到的最简单,最快速的哈夫曼编码。本方法不使用任何扩展动态库,比如STL或者组件。只使用简单的C函数,比如:memset,memmove,qsort,malloc,realloc和memcpy。
因此,大家都会发现,理解甚至修改这个编码都是很容易的。

背景
哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。
编码使用
我用简单的C函数写这个编码是为了让它在任何地方使用都会比较方便。你可以将他们放到类中,或者直接使用这个函数。并且我使用了简单的格式,仅仅输入输出缓冲区,而不象其它文章中那样,输入输出文件。
bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen);
bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen);
要点说明
速度
为了让它(huffman.cpp)快速运行,我花了很长时间。同时,我没有使用任何动态库,比如STL或者MFC。它压缩1M数据少于100ms(P3处理器,主频1G)。
压缩
压缩代码非常简单,首先用ASCII值初始化511个哈夫曼节点:
CHuffmanNode nodes[511];
for(int nCount = 0; nCount < 256; nCount++)
nodes[nCount].byAscii = nCount;
然后,计算在输入缓冲区数据中,每个ASCII码出现的频率:
for(nCount = 0; nCount < nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
然后,根据频率进行排序:
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
现在,构造哈夫曼树,获取每个ASCII码对应的位序列:
int nNodeCount = GetHuffmanTree(nodes);
构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。
// parent node
pNode = &nodes[nParentNode++];
// pop first child
pNode->pLeft = PopNode(pNodes, nBackNode--, false);
// pop second child
pNode->pRight = PopNode(pNodes, nBackNode--, true);
// adjust parent of the two poped nodes
pNode->pLeft->pParent = pNode->pRight->pParent = pNode;
// adjust parent frequency
pNode->nFrequency = pNode->pLeft->nFrequency + pNode->pRight->nFrequency;
这里我用了一个好的诀窍来避免使用任何队列组件。我先前就直到ASCII码只有256个,但我分配了511个(CHuffmanNode nodes[511]),前255个记录ASCII码,而用后255个记录哈夫曼树中的父节点。并且在构造树的时候只使用一个指针数组(ChuffmanNode *pNodes[256])来指向这些节点。同样使用两个变量来操作队列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。
接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中:
int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount < nSrcLen; nCount++)
{
*(DWORD*)(pDesPtr+(nDesIndex>>3)) |=
nodes[pSrc[nCount]].dwCode << (nDesIndex&7);
nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}
(nDesIndex>>3): >>3 以8位为界限右移后到达右边字节的前面
(nDesIndex&7): &7 得到最高位.
注意:在压缩缓冲区中,我们必须保存哈夫曼树的节点以及位序列,这样我们才能在解压缩时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。
解压缩
解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中:
int nDesIndex = 0;
DWORD nCode;
while(nDesIndex < nDesLen)
{
nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7);
pNode = pRoot;
while(pNode->pLeft)
{
pNode = (nCode&1) ? pNode->pRight : pNode->pLeft;
nCode >>= 1;
nSrcIndex++;
}
pDes[nDesIndex++] = pNode->byAscii;
}

Ⅶ mfc有没有可以解压缩 播放媒体的类啊。

DirectShow

Ⅷ 在mfc工程中我先将压缩文件解压,然后想使用解压缩后的.txt文件,但遍历时因为前面解压缩占用导致打不开

什么样的压缩文件?怎么样解压的?

Ⅸ mfc使用windows media player控件如何支持多种视频格式的播放

WMP是Windows自带的播放器。MFC中这个插件是调用Windows中的WMP,而不是包含了WMP全套的代码。
我们可以给电脑增加视频格式编码来让它播放更多的视频格式,但是这个软件在另一台没有自己加装视频格式的电脑上,还是和现在一样。
可以下载格式工厂,这个用着不错。

Ⅹ 想用mfc做一个视频播放器

1.首先要对mfc比较了解,如果你做播放器,将来会涉及很多关于鼠标消息处理的函数,在一开始的 时候做好准备.我去年做播放器其他技术都没怎么难我,就是界面消息的处理搞得很乱.

2.看你是想省力气还是费力气了,如果省劲的话,直接上网找些开源的编码解析包,或者自己水平比较高的话就自己参考DirectShow的api自己写各种视频格式的解析包,不过会累死的,我光学习mpeg2就花了将近两个月时间,如果你想要支持很多格式,最好不要自己写解析库,上网搜开源的拿来用,发现其中有哪几种文件格式打开效果或者速度实在太差劲的话你再自己写.

3.具体写程序的建议: 最好一开始只写一种格式,等到自己水平确实上来了再写多种格式,最后把这些格式整合到一个程序里面.其实很简单,无非是加上一些判断或者switch,但是你要对mfc的消息机制有比较深入的了解

阅读全文

与mfc视频压缩与解压缩相关的资料

热点内容
湖南省常德通用压缩机有限公司 浏览:109
服务器的双电是什么意思 浏览:614
程序员离开后代码运行几天 浏览:386
多多乐app是什么干嘛的 浏览:346
文档加密授权工具 浏览:436
命令与征服将军闪退 浏览:132
vs2019预编译怎么设置 浏览:780
沈阳中软python培训班 浏览:493
逆战文件夹怎么放 浏览:120
怎么统一删除文件夹raw文件 浏览:121
卡尔曼滤波算法书籍 浏览:769
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:844
安卓怎么下载60秒生存 浏览:803
外向式文件夹 浏览:240
dospdf 浏览:431
怎么修改腾讯云服务器ip 浏览:392
pdftoeps 浏览:496
为什么鸿蒙那么像安卓 浏览:736
安卓手机怎么拍自媒体视频 浏览:186
单片机各个中断的初始化 浏览:724