1、为什么压缩的原始数据一般采用YUV格式
(1)利用人对图片感觉的生理特性,对于亮度信息比较敏感,对于色度信息不太敏感,所以视频编码是将Y分量和UV 分量分开来编码,并且可以减少UV分量.
2、视频压缩原理
(1)空间冗余:图像相邻像素之间的相关性,比如一帧图片被划分成多个16x16的块之后,相邻的块之间有很多明显的相似性。
(2)时间冗余:时间相差较近的两张图片变化较小。
(3)视觉冗余:我们的眼睛对某些细节不太敏感,对图像中的高频信息的敏感度小于低频信息,可以去除一些高频信息。
(4)编码冗余:一幅图片中不同像素出现的概率是不同的,对于出现次数较多的像素,用少的位数来编码,对于出现次数较少的像素,用多的位数来编码,能够减少编码的大小。比如哈夫曼编码。
3、图像帧的类型(I帧,P帧,B帧)
I帧:关键帧
P帧:预测帧
B帧:B帧带来编码延迟
4、GOP(group of pictures)
一个序列的第一个图像叫做IDR图像,IDR都是I帧图像,gop指两个IDR之间的距离
gop长度约大,视频压缩率越高
5、H264主要采用了以下几种方法对视频数据进行压缩,包括:
(1)帧内预测压缩,解决的是空域数据冗余问题。
(2)帧间预测压缩(运动估计与补偿),解决的是时域数据冗余问题。
(3)整数离散余弦变换DCT,将空间上的相关性变为频域上无关的数据,然后进行量化。
(4)CABAC压缩
划分宏块:
H264默认使用16X16大小的区域作为一个宏块,也可以划分为8X8大小
划分好宏块之后,计算宏块的像素值
依次把H264编码器的缓存区中的每一张图片都计算好
划分子块:
在16X16的宏块上还可以划分子块,子块的大小可以为8X16,16X8,8X8等
帧分组:
划分好宏块之后,就可以对所有的图片进行分组了。
其算法为:再相邻的几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值不超过%2,而色度差值的变化只有1%以内,我们认为这样的图可以分为一组。在这样的一组帧中,经过编码后,我们只保留第一帧的完整数据,其他帧都通过参考上一帧计算出来,我们称第一帧为IDR/I帧,其他帧为P/B帧,这样编码后的数据组称为gop
运动估计与补偿:
在H264编码器中将帧分组后,就要计算组内物体的运动矢量了,运动矢量计算出来后,将相同的部分减去,就得到了补偿数据,我们把运动矢量和补偿称为帧间压缩技术。它解决的是时间上的数据冗余。
帧内预测:
除了上面说的时间上的冗余,还有空间上的冗余,人眼对低频的亮度很敏感,对高频的亮度不太敏感,提出了帧内预测技术。
将原始图像与帧内预测后的图像相减得到残差值。
对残差数据做DCT:
经过帧内与帧间的压缩后,还有压缩的空间,
将残差数据经过整数离散余弦变换,去掉数据的相关性,进一步压缩。
CABAC:
上面的帧内压缩属于有损压缩,还可以进行无损压缩,比如哈夫曼编码,给高频的词一个短码,给低频的词一个长码。
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
是否有任何可用于Ruby的开源压缩/解压库?有没有人实现过LZW?或者,是否有任何使用压缩组件的开源库可以提取出来独立使用?编辑——感谢您的回答!我应该提到我必须压缩的是只驻留在数据库中的长字符串(我不会压缩文件)。此外,如果可以执行此操作的任何库都具有用于客户端压缩/分解的等效JavaScript实现,那将是理想的,因为这将用于Web应用程序。 最佳答案 您会在rubystdlib下找到所有已交付的ruby库的一个很好的列表.我会使用zlib库,它是开放的,无处不在,您会发现几乎所有语言的库!
我有一个包含100多个zip文件的目录,我需要读取zip文件中的文件以进行一些数据处理,而无需解压缩存档。是否有一个Ruby库可以在不解压缩文件的情况下读取zip存档中的文件内容?使用rubyzip报错:require'zip'Zip::File.open('my_zip.zip')do|zip_file|#Handleentriesonebyonezip_file.eachdo|entry|#Extracttofile/directory/symlinkputs"Extracting#{entry.name}"entry.extract('here')#Readintomemoryc
我有一个正在HerokuCedar堆栈上部署的Rails3.2应用程序。这意味着应用程序本身负责为其静态Assets提供服务。我希望对这些Assets进行gzip压缩,所以我在production.rb的中间件堆栈中插入了Rack::Deflater:middleware.insert_after('Rack::Cache',Rack::Deflater)...curl告诉我这与宣传的一样有效。但是,由于Heroku将全力运行rakeassets:precompile,生成一堆预gzipAssets,我很想使用它们(而不是让Rack::Deflater再次完成所有工作)。我已经看到使用
我想知道与使用native操作系统库执行压缩相比,使用rubyzip压缩数据时的性能差异是什么。我正在从URL获取要压缩的数据,然后使用ZipOutputStream创建zip文件。对于native操作系统实用程序,我正在考虑使用zip工具。很高兴听到这两种方法的优缺点。 最佳答案 事实证明,无论是运算时间还是CPU使用率,都没有太大差异。但是在内存使用方面存在显着差异。与使用ziputil相比,使用rubyzip的过程最终会使用更多的内存。在我们的用例中,内存使用是一个重要问题,因此我们最终使用了zip实用程序。
我知道如何使用rubyzip检索普通zip文件的内容。但是我在解压缩压缩文件夹的内容时遇到了问题,我希望你们中的任何人都能帮助我。这是我用来解压的代码:Zip::ZipFile::open(@file_location)do|zip|zip.eachdo|entry|nextifentry.name=~/__MACOSX/orentry.name=~/\.DS_Store/or!entry.file?logger.debug"#{entry.name}"@data=File.new("#{Rails.root.to_s}/tmp/#{entry.name}")endendentry
我想每周更新一个城市表以反射(reflect)世界各地城市的变化。为此,我正在创建一个Rake任务。如果可能,我希望在不添加其他gem依赖项的情况下执行此操作。压缩文件是在geonames.org/15000cities.zip上公开可用的压缩文件.我的尝试:require'net/http'require'zip'namespace:geocitiesdodesc"RaketasktofetchGeocitiescitylistevery3days"task:fetchdouri=URI('http://download.geonames.org/export/dump/cities
假设我有这个:[{:user_id=>1,:search_id=>a},{:user_id=>1,:search_id=>b},{:user_id=>2,:search_id=>c},{:user_id=>2,:search_id=>d}]我想结束:[{:user_id=>1,:search_id=>[a,b]},{:user_id=>2,:search_id=>[c,d]}]最好的方法是什么? 最佳答案 确实是非常奇怪的要求。无论如何[{:user_id=>1,:search_id=>"a"},{:user_id=>1,:sear
文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat
我已经写了一些csv文件并压缩它,使用这个代码:arr=(0...2**16).to_aFile.open('file.bz2','wb')do|f|writer=Bzip2::Writer.newfCSV(writer)do|csv|(2**16).times{csv我想阅读这个csvbzip2ed文件(用bzip2压缩的csv文件)。这些未压缩的文件如下所示:1,24,125,28,71,3...所以我尝试了这段代码:Bzip2::Reader.open(filename)do|bzip2|CSV.foreach(bzip2)do|row|putsrow.inspectendend