谁有流的压缩函数吗?(200分)

  • 主题发起人 戏浪儿
  • 开始时间

戏浪儿

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有流的压缩函数吗?
delphi自已带的压缩后比原还大,745啦!
 
不对吧,
如果数据本身是不可压缩的,
譬如MP3文件,一些媒体文件,JPG图像,
可能都会造成越压越大的现象
Delphi自己带的还是很好用的
有一个专门的组织研究zlib,压缩比和效率都是很高的
 
要看你是什么流的,
如果是视视或音频的话,
就可以用API
 
见过动态 哈夫曼 算法
但不一定有用
 
我的是语音流,大概是wav文件,可能是不支持压缩吧
但我想一定有方法压的
 
非常同意LiChaoHui的说法,他所说的这个组织在这里http://www.dellapasqua.com/,提供源码
和例子,比Delphi自带的有些改进,而且速度快!不错的!如果你找不到,我可以发给你!
 
wav -> mp3
 
不会吧.
Zlib么?
 
戏浪儿:
你是要压缩wav文件流,是吗?我刚才用我上面说的这个组织的产品(附源码)做了一个例子,试验了一下
一个wav文件,压缩前225K,压缩后138K,压缩比还是很不错的,速度极快!!为了做对比,我用
现在很流行的WinRar 3.11压缩了一下,基本是一样的,仅仅是少了几十个字节!这样的压缩率
应该可以满意的呀!
尤其是压缩bmp文件,简直太厉害了,缺点是压缩文本文件稍差一点!
 
算了,我不压了,最新的SMC支持语音了,效果还不错,延时一秒以内
http://211.152.144.39/Sms/online/SMC/smc.exe
 
戏浪儿:
>>我的是语音流,大概是wav文件,可能是不支持压缩吧
啊?????你的意思是:将wav文件压缩完后,还能直接播放啊!!!!!!天啊!这也太过分了!
那我的方法可不行!你再听听别人的意见吧![:)]
 
如果要压缩wav文件,建议压缩为mp3
压缩率可以达到10倍以上,且失真不影响听觉
找mp3的压缩算法吧,不同的数据应该用不同的压缩方法,才能获得理想的压缩率
 
UP
delphi自带了一个压缩的:Zlib
 
呵呵,戏浪儿,
你用ACM控件,他语音采集就要一秒,还有网络传输,所以大于一秒的,呵呵
建议自己ACM控件,减小其中的缓冲区,
还有,
WAV 可以ACMCONVERT这个函数压缩的,
网上找找,比较多的资料~
 
我有啊,
发个邮件过来,
不过分可不能少呀。
 
Uses ZLib;
//------------------------------------------------------------------------------
// 司马华鹏
//压缩流
procedure myCompressStream(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
begin
Count := CompressedStream.Size;
//获得流的原始尺寸
DestStream := TMemoryStream.Create;
Try
SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream);
Try
CompressedStream.SaveToStream(SourceStream);//SourceStream中保存着原始的流
finally
SourceStream.Free;
//将原始流进行压缩, DestStream中保存着压缩后的流
end;
CompressedStream.Clear;
CompressedStream.WriteBuffer(Count, SizeOf(Count));//写入原始的尺寸
CompressedStream.CopyFrom(DestStream, 0);//写入经过压缩的流
finally
DestStream.Free;
end;
end;

//------------------------------------------------------------------------------
// 司马华鹏
//还原被压缩流
procedure myUnCompressStream(const CompressedStream:TMemoryStream;
var DeCompressedStream:TMemoryStream);
var
SourceStream: TDecompressionStream;
Buffer: PChar;
Count: Integer;
begin
CompressedStream.ReadBuffer(Count, SizeOf(Count));//从被压缩的流中读出原始的尺寸
GetMem(Buffer, Count);//根据尺寸大小为将要读入的原始流分配内存
try
SourceStream := TDecompressionStream.Create(CompressedStream);
Try
SourceStream.ReadBuffer(Buffer^, Count);
//将被压缩的流解压缩,然后存入 Buffer内存块中
DeCompressedStream.WriteBuffer(Buffer^, Count);//将原始图像流保存至 DestStream流
DeCompressedStream.Position := 0;//复位流指针
finally
SourceStream.Free;
end;
finally
FreeMem(Buffer);
end;
end;
 
多人接受答案了。
 
顶部