YUV422转420

左耳丁 2011-03-21 05:36:11
各位大虾们,我刚接触视频解理,组长让我把422转成420,请问该怎么转啊?最好有代码,谢谢啦!
...全文
586 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
袁保康 2013-03-30
  • 打赏
  • 举报
回复
引用 16 楼 huoppo 的回复:
我认为以上的哥们都好蠢笨的很,就是ffmepg里面不是有关于yuv422转yuv420...好多好多格式都有,要是想要的可以留下邮箱,我发给你们,免得在这边好幸苦 然后还转的失真。
得你指点改了google关键词找到用命令的方法: ffmpeg -pix_fmt yuyv422 -s 640x480 -i 640_480_100f_422.yuv -pix_fmt yuv420p 640_480_100f_420.yuv 测试OK。
youyuwangzi_dandan 2012-02-04
  • 打赏
  • 举报
回复
youyuwangzi_520@163.com

能否也给我发一份,谢谢了
huoppo 2011-03-25
  • 打赏
  • 举报
回复
我认为以上的哥们都好蠢笨的很,就是ffmepg里面不是有关于yuv422转yuv420...好多好多格式都有,要是想要的可以留下邮箱,我发给你们,免得在这边好幸苦
然后还转的失真。
左耳丁 2011-03-25
  • 打赏
  • 举报
回复
谢谢了,我的邮箱是
luoshibin@visiontops.com,希望尽快发给我吧
左耳丁 2011-03-24
  • 打赏
  • 举报
回复
哪们大牛帮我看看,422转到420的,就是颜色有错,不知道中哪错了?请指点指点,感激不尽
int main()
{
FILE* fp_read;
FILE* fp_write;
unsigned char *buf;
unsigned char *pY;
unsigned char *pU;
unsigned char *pV;

unsigned int LEN=720*576*2;
unsigned int frame;
fp_read=fopen("d:\\VTsd1.yuv","rb");
fp_write=fopen("d:\\text_422_to_420.yuv","wb");

if (fp_read==NULL || fp_write==NULL)
{
perror("Open file error...");
exit(0);
}

fseek(fp_read,0,SEEK_END);
frame=ftell(fp_read)/LEN;
fseek(fp_read,0,SEEK_SET);

for (unsigned int i=0;i<frame;i++)
{
buf=(unsigned char*)malloc(LEN);
pY=(unsigned char*)malloc(LEN/2);
pU=(unsigned char*)malloc(LEN/4);
pV=(unsigned char*)malloc(LEN/4);

fread(buf,1,LEN,fp_read);
fseek(fp_read,i*LEN,SEEK_SET);

abstract_y(buf,pY,pU,pV,576,720);

fseek(fp_write,i*LEN*0.75,SEEK_SET);//移动720*576*1.5个byte
fwrite(pY,1,LEN/2,fp_write);


//隔一个U/V取一个U/V
for (unsigned int j=0;j<LEN/8;++j)
{
pV[j]=pV[j*2];
pU[j]=pU[j*2];
}
pV[LEN/8]='\0';
pU[LEN/8]='\0';
//fseek(fp_write,LEN/8,SEEK_CUR);
fwrite(pV,1,LEN/8,fp_write);

//fseek(fp_write,LEN/8,SEEK_CUR);
fwrite(pU,1,LEN/8,fp_write);

free(buf);
free(pY);
free(pU);
free(pV);
buf=NULL;
pY=NULL;
pU=NULL;
pV=NULL;
}
return 0;
}
左耳丁 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oexpress 的回复:]
你自己把这个函数改造一下就可以了
[/Quote]哎,这个函数我改了好多次了,效果不明显,可能是我没能真正理解透422的存储空间吧,郁闷ing
左耳丁 2011-03-23
  • 打赏
  • 举报
回复
可算是把Y分量给提出来了,用的最笨的方法,读一个字节处理一个字节,虽然慢,但还是实现了
RabbitLBJ 2011-03-22
  • 打赏
  • 举报
回复
推荐SDL,其他楼下解决
buhuizheyangba 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luoshibin2011 的回复:]
引用 4 楼 oexpress 的回复:
BOOL YUV422To420(BYTE* pYUV, BYTE* pY, BYTE* pU, BYTE* pV, LONG lWidth, LONG lHeight)
{

int i,j;

BYTE* pYUVTemp = pYUV;
BYTE* pYUVTempNext = pYUV+lWidth*2;

for(i=0; i<……
[/Quote]

你要知道YUV422转YUV420你要知道YUV色彩空间,各个分量代表什么,了解422和420各个分量存储排序是怎么样的,这样再看代码就比较明了了。
CyberLogix 2011-03-22
  • 打赏
  • 举报
回复
你自己把这个函数改造一下就可以了
左耳丁 2011-03-22
  • 打赏
  • 举报
回复
急啊,我是菜鸟,哪位大牛快快出来帮帮我吧,我现在想单独把Y分提出来,显示出来的不是黑白的效果啊,是不是有问题呢?
void abstract_y(unsigned char* pYUV,unsigned char* pY,int _Width,int _Height)
{
int i,j;
unsigned char* pYUVTemp=pYUV;
int Temp=0;
for (i=0;i<_Height;++i)
{
for (j=0;j<_Width;j+=2)
{

*pYUVTemp++;
pY[j]=*pYUVTemp;
*pYUVTemp++;
}
}

}
eye_119_eye 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oexpress 的回复:]
BOOL YUV422To420(BYTE* pYUV, BYTE* pY, BYTE* pU, BYTE* pV, LONG lWidth, LONG lHeight)
{

int i,j;

BYTE* pYUVTemp = pYUV;
BYTE* pYUVTempNext = pYUV+lWidth*2;

for(i=0; i<lHeight; i+=2)
{
for……
[/Quote]
q
queatin_man 2011-03-22
  • 打赏
  • 举报
回复
不如自己找个第三方库,图像的大小尺寸,以及存放数据的图像结构都要清楚,单独用一小块函数,有时是断章取义
左耳丁 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oexpress 的回复:]
BOOL YUV422To420(BYTE* pYUV, BYTE* pY, BYTE* pU, BYTE* pV, LONG lWidth, LONG lHeight)
{

int i,j;

BYTE* pYUVTemp = pYUV;
BYTE* pYUVTempNext = pYUV+lWidth*2;

for(i=0; i<lHeight; i+=2)
{
for……
[/Quote]我大致看明白了,你这个好像是转换YUY2的,代码是两行两行读的吧,但是我有一点看不明白,就是pU和pV为什么是等于它们{(*(pYUVTemp) + *(pYUVTempNext))/2}呢?
左耳丁 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oexpress 的回复:]

BOOL YUV422To420(BYTE* pYUV, BYTE* pY, BYTE* pU, BYTE* pV, LONG lWidth, LONG lHeight)
{

int i,j;

BYTE* pYUVTemp = pYUV;
BYTE* pYUVTempNext = pYUV+lWidth*2;

for(i=0; i<lHeight; i+=2)
{
fo……
[/Quote]那参数里的四个指针分别是什么意思啊,还有BYTE是什么类型啊,谢谢
CyberLogix 2011-03-21
  • 打赏
  • 举报
回复
BOOL YUV422To420(BYTE* pYUV, BYTE* pY, BYTE* pU, BYTE* pV, LONG lWidth, LONG lHeight)
{

int i,j;

BYTE* pYUVTemp = pYUV;
BYTE* pYUVTempNext = pYUV+lWidth*2;

for(i=0; i<lHeight; i+=2)
{
for(j=0; j<lWidth; j+=2)
{
pY[j] = *pYUVTemp++;
pY[j+lWidth] = *pYUVTempNext++;

pU[j/2] =(*(pYUVTemp) + *(pYUVTempNext))/2;
pYUVTemp++;
pYUVTempNext++;

pY[j+1] = *pYUVTemp++;
pY[j+1+lWidth] = *pYUVTempNext++;

pV[j/2] =(*(pYUVTemp) + *(pYUVTempNext))/2;
pYUVTemp++;
pYUVTempNext++;
}
pYUVTemp+=lWidth*2;
pYUVTempNext+=lWidth*2;
pY+=lWidth*2;
pU+=lWidth/2;
pV+=lWidth/2;
}

return TRUE;
}

就想叫yoko 2011-03-21
  • 打赏
  • 举报
回复
要不就是你花时间去研究这两种文件格式的标准
要不就是去研究拿第三方库转
左耳丁 2011-03-21
  • 打赏
  • 举报
回复
呵呵,还是谢谢!

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧