社区
图形处理/算法
帖子详情
YUV直接压缩
堆堆
2003-03-26 09:25:52
现在在做视频方面的程序,一般都是把YUV先转换成RGB,然后再使用MPEG4等压缩方法来压缩的,其实可以直接对YUV格式进行压缩吗?这样就可以省略了转换的时间和资源! 高手请出招。。。
...全文
860
26
打赏
收藏
YUV直接压缩
现在在做视频方面的程序,一般都是把YUV先转换成RGB,然后再使用MPEG4等压缩方法来压缩的,其实可以直接对YUV格式进行压缩吗?这样就可以省略了转换的时间和资源! 高手请出招。。。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
堆堆
2003-04-01
打赏
举报
回复
自己搞锭啦!谢谢各位
堆堆
2003-03-30
打赏
举报
回复
不是啊,我使用的是N制的摄像头,摄像头采集回来的数据,最原始的数据都是YUV的
ayi7456
2003-03-30
打赏
举报
回复
一个不是解释的解释。
我觉得是不是你这个库的问题,因为可能不少SDK(可能也包括DirectX,惭愧,这么有名的东西我到真的没有用过)在从摄像头读数据的时候已经默认地将静态帧转换成RGB的格式了,从这个考虑你用的这个类当然会选择接收一个RGB格式的头然后再自行地将数据转换为YUV格式。这实在是为用户着想,因为他不需要用户写代码转换色彩空间嘛,没想到你老兄得到的直接就是YUV了。这是我的猜测,你用库我不了解,当然也不能了解它的运行机制了,所有只是猜测而已
堆堆
2003-03-30
打赏
举报
回复
下面是我最近的一次测试,已经可以直接压缩YUV了,不过不能解压,大家来看看:
//这个是压缩的过程,我压缩好象成功了压缩出来的文件约9K
//文件yuv_no.dat是我的一张320 X 240 的UYVY格式的图象数据文件
const yuvcount=153600;
DWORD cc=MAKEFOURCC('M','P','G','4');
HIC hh;
hh = ICOpen(ICTYPE_VIDEO, cc, ICMODE_COMPRESS);
if(!hh)
{
MessageBox("Open Error");
return ;
}
BITMAPINFOHEADER m_bmpInfo,m_bmpInfo1;
m_bmpInfo.biSize = sizeof(BITMAPINFOHEADER);
m_bmpInfo.biWidth = 320;
m_bmpInfo.biHeight = 240;
m_bmpInfo.biPlanes = 1;
m_bmpInfo.biBitCount = 0;
m_bmpInfo.biCompression = 'UYVY';
m_bmpInfo.biSizeImage = yuvcount;
m_bmpInfo.biXPelsPerMeter = 0;
m_bmpInfo.biYPelsPerMeter = 0;
m_bmpInfo.biClrUsed = 0;
m_bmpInfo.biClrImportant = 0;
memcpy(&m_bmpInfo1,&m_bmpInfo,sizeof(BITMAPINFOHEADER));
m_bmpInfo1.biCompression = cc;
m_bmpInfo1.biSizeImage = 0;
unsigned char indata[yuvcount],outdata[yuvcount];
memset(indata,0,yuvcount);
memset(outdata,0,yuvcount);
DWORD flag=AVIIF_KEYFRAME;
CFile m_File;
if(!m_File.Open("yuv_no.dat", CFile::modeRead | CFile::typeBinary, NULL))
{
MessageBox("file error!");
}
m_File.Read(indata,yuvcount);
m_File.Close();
DWORD res=0;
res = ICCompressBegin(hh,&m_bmpInfo,&m_bmpInfo1);
if(res!=ICERR_OK)
{
MessageBox("Error Begin");
ICClose(hh);
return;
}
res = ICCompress(hh,0,&m_bmpInfo1,outdata,&m_bmpInfo,indata,NULL,&flag ,1,yuvcount,10000,&m_bmpInfo,NULL);
if(res!=ICERR_OK)
{
MessageBox("Error Compress");
}
ICCompressEnd(hh);
ICClose(hh);
//Write file
m_File.Open("yuv_com.dat", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary,NULL);
m_File.Write(outdata,m_bmpInfo1.biSizeImage);
m_File.Close();
//下面是解压的过程
const yuvcount=153600;
DWORD cc=MAKEFOURCC('M','P','G','4');
HIC hh;
hh = ICOpen(ICTYPE_VIDEO, cc, ICMODE_DECOMPRESS );
if(!hh)
{
MessageBox("sdfsd");
return ;
}
unsigned char *indata,*outdata;
indata = new unsigned char[yuvcount];
outdata = new unsigned char[yuvcount];
memset(indata,0,yuvcount);
memset(outdata,0,yuvcount);
CFile m_File;
if(!m_File.Open("yuv_com.dat", CFile::modeRead | CFile::typeBinary, NULL))
{
MessageBox("file error!");
}
m_File.Read(indata,m_File.GetLength());
BITMAPINFOHEADER m_bmpInfo,m_bmpInfo1;
m_bmpInfo.biSize = sizeof(BITMAPINFOHEADER);
m_bmpInfo.biWidth = 320;
m_bmpInfo.biHeight = 240;
m_bmpInfo.biPlanes = 1;
m_bmpInfo.biBitCount = 0;
m_bmpInfo.biCompression = cc;
m_bmpInfo.biSizeImage = m_File.GetLength();
m_bmpInfo.biXPelsPerMeter = 0;
m_bmpInfo.biYPelsPerMeter = 0;
m_bmpInfo.biClrUsed = 0;
m_bmpInfo.biClrImportant = 0;
memcpy(&m_bmpInfo1,&m_bmpInfo,sizeof(BITMAPINFOHEADER));
m_File.Close();
DWORD res=0;
res=ICDecompressGetFormat(hh,&m_bmpInfo,&m_bmpInfo1);
//在这里其实已经有问题了。
//因为返回的m_bmpInfo1.biBitCount=24 而不是0
//m_bmpInfo1.biSizeImage=230400 (320*240*3) 而不是153600 (320*240*4/2)
if(res!=ICERR_OK)
{
MessageBox("Error GetFormat");
ICClose(hh);
return;
}
res=ICDecompressBegin(hh,&m_bmpInfo,&m_bmpInfo1);
if(res!=ICERR_OK)
{
MessageBox("Error Begin");
ICClose(hh);
return;
}
//程序在这里就真正运行不了
res =ICDecompress(hh,0,&m_bmpInfo,indata,&m_bmpInfo1,outdata);
if(res!=ICERR_OK)
{
MessageBox("Error Decompress");
ICDecompressEnd(hh);
ICClose(hh);
return ;
}
ICDecompressEnd(hh);
ICClose(hh);
//下面是显示部分。。。
堆堆
2003-03-28
打赏
举报
回复
MPEG的算法我也了解一个,所以我就奇怪压缩的时候为什么要送一个BITMAPINFOHEADER的参数?我不想自己写一个MPEG的压缩过程,这样做一来浪费时间,二又写的不好!
堆堆
2003-03-28
打赏
举报
回复
up
堆堆
2003-03-27
打赏
举报
回复
是啊,又是我啊,问题多多嘛 ^_^
收到啦,
CCBeyond
2003-03-27
打赏
举报
回复
发到你邮箱啦,注意接收!
CCBeyond
2003-03-27
打赏
举报
回复
怎么又是你,我自己写了个利用WME 进行 MPEG4 采集的类,发给你看看。
不过,我建议用Format,可能会好些。
堆堆
2003-03-27
打赏
举报
回复
我的OCIQ 124246924
堆堆
2003-03-27
打赏
举报
回复
谁可以写例子代码啊?我对DX 、 WME 等方式都不熟,出例子就给50分
pangshaojun@eyou.com
CCBeyond
2003-03-27
打赏
举报
回复
可以直接用Windows Media Encoder 或者Windows Media Format进行MPEG4采集啊,简单方便.
堆堆
2003-03-27
打赏
举报
回复
wd846(wd846) 你用的是什么啊?DIVX?MPEG4?IV50?
ayi7456
2003-03-27
打赏
举报
回复
代码我没有,但对MPEG的算法流程很熟悉,你弄MPEG一定会听说过4:1:1之类的东西,他指的就是就是减小UV分量的resolution. 但我没有用过你用的这些函数,所以恐怕帮不上太大的忙
堆堆
2003-03-27
打赏
举报
回复
下面是主要的代码:大家讨论一下吧!!
typedef struct {
HIC driver;
BITMAPINFOHEADER out_format;
BITMAPINFOHEADER in_format;
} COMPRESSOR;
int open_compressor(COMPRESSOR *c, LPBITMAPINFOHEADER in_format, FOURCC codec)
{
c->driver = ICOpen(ICTYPE_VIDEO, codec, ICMODE_COMPRESS);
if(c->driver == NULL){
return 0;
}
c->in_format = *in_format;
c->out_format = *in_format;
c->out_format.biCompression = codec;
ICCompressBegin(c->driver, &(c->in_format), &(c->out_format));
return 1;
}
int compress(LPVOID in, LPVOID out, COMPRESSOR *c, int *key, size_t *size)
{
DWORD flag;
ICCompress(c->driver, 0, &(c->out_format), out, &(c->in_format), in, NULL, &flag, 1,1000 , 10000, &(c->in_format), c->buffer);
*size = c->out_format.biSizeImage;
return 1;
}
int close_compressor(COMPRESSOR *c)
{
ICCompressEnd(c->driver);
ICClose(c->driver);
return 1;
}
堆堆
2003-03-27
打赏
举报
回复
啊?哪为什么我使用的
ICOpen()
ICCompress()
ICClose()
一定要有个LPBITMAPINFOHEAD呢?
ayi7456(阿一) 有没有具体点的代码啊?
ayi7456
2003-03-27
打赏
举报
回复
你完全弄错了,MPEG是对YUV直接压缩的,事实上如果输入是RGB的还要被转化成YUV先。因为UV分量对人眼不是很敏感,所以可以把UV分量先resize到原来的一半再压缩一提高压缩率
堆堆
2003-03-26
打赏
举报
回复
duwenyong(啸海) 大哥可以说具体点吗?
如果是使用ICCompress等方法是要设置
BITMAPINFOHEAD的,这个东西只是支持RGB的?
我不明白?
比如我在 LPVOID m_data有一张 320 * 240 的yuv格式的图片数据
怎么样才可以压缩呢?
duwenyong
2003-03-26
打赏
举报
回复
其实MPEG4是对YUV编码的,一般是会支持YUV 各种格式的,你可能要设biCompress这个参数
堆堆
2003-03-26
打赏
举报
回复
有没有人可以发点代码啊?
pangshaojun@eyou.com
用DX都没有问题的
加载更多回复(6)
Yuv
Player RawViewer
YUV
查看工具
本文将深入探讨两款针对
YUV
格式的专业查看工具——
Yuv
Player和RawViewer,它们能帮助用户
直接
查看内存中保存的原始无
压缩
图片,支持多种
YUV
格式及RGB格式,为开发者和研究人员提供了极大的便利。 首先,我们来了解...
Android
直接
播放
yuv
420p/
yuv
i420文件
本文将深入探讨如何在Android上
直接
播放
YUV
420P或
YUV
I420(通常指的是带有交错顺序的
YUV
420)文件。 首先,理解
YUV
420P的结构至关重要。它是由三个分量组成的:Y(亮度),U(蓝色色度),V(红色色度)。Y分量的...
YUV
合成,
YUV
裁剪,
YUV
_to_JPEG 纯c语言编写
在IT领域,尤其是在图像处理和编码中,
YUV
是一种常见的颜色空间,广泛应用于视频编码和数字电视系统。
YUV
代表亮度(Y)和两个色差分量(U和V),这种格式可以有效地减小存储和传输图像所需的数据量。本项目专注于
YUV
...
7
yuv
-
yuv
,raw图像文件查看软件
7
yuv
能够解析
YUV
文件中的各个分量,展示图像的亮度和色度信息,有助于分析图像质量、
压缩
效果以及颜色还原度。 而RAW格式则更为专业,它是数码相机捕捉光线并记录原始数据的方式,未经任何处理,保留了最原始的色彩...
快速的将
YUV
444转成
YUV
420格式数据
根据提供的
压缩
包子文件的文件名“
yuv
444P2
yuv
420p”,我们可以推测这是一个源代码文件或者程序,可能包含一个函数或者类,用于将
YUV
444 Planar(逐行)格式的数据转换为
YUV
420 Planar格式。在处理
YUV
数据时,Planar...
图形处理/算法
19,470
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章