搜索 社区服务 统计排行 帮助
  • 12329阅读
  • 162回复

[请教]x264压制出来画面发白怎么办?

楼层直达
级别: 侠客
注册时间:
2005-02-09
在线时间:
0小时
发帖:
512
只看该作者 135楼 发表于: 2008-06-09
MJPEG用的矩阵就是JPG的算法,所以不存在A和B不相同的情况
级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 136楼 发表于: 2008-06-09
引用

我当然知道RGB<->RGB,YUV<->YUV不存在601/709的说法。一般不会这样做的吧
问题是在RGB<->YUV pixel_type是较交给解码器去做转换 而ConvertTo可以手动设定 但是解码器可以根据片源自动正确识别并且转换么?COREAVC那个AUTO是否起作用?

这里的情况 你的意思是用其他解码器 比如FFD? 而不用系统自带的是么?

问题是你为什么要转RGB,大部分视频编码器不支持RGB。
FFD的MJPEG解码器支持YUV输出,如果场序错了avs里加一句SwapFields()就解决了。

引用
最初由 qyqgpower 发布
MJPEG用的矩阵就是JPG的算法,所以不存在A和B不相同的情况


但是我这里M$,MainConcept和PicVideo三种解码器输出RGB得到三种颜色。
级别: 侠客
注册时间:
2005-12-16
在线时间:
5小时
发帖:
676
只看该作者 137楼 发表于: 2008-06-09
引用
最初由 qyqgpower 发布
MJPEG用的矩阵就是JPG的算法,所以不存在A和B不相同的情况

应该是这样, 要不ms的解码器也不会选择输出RGB了

我这里看了
DirectShowSource("C:\ng1.grf",audio=false)

FFmpegSource("C:\ng1.avi")
ConvertToRGB32(matrix="PC.709")

FFmpegSource("C:\ng1.avi")
ConvertToRGB32(matrix="PC.601")

FFmpegSource是出来原始的YCbCr, 但用601和709变换都和ms解码的RGB看起来不一样. 所以这片必须YCbCr->RGB->YV12来压

ps:FFmpegSource出来的交错画面可以用什么滤镜解决么?
引用
最初由 roozhou 发布

问题是你为什么要转RGB,大部分视频编码器不支持RGB。
FFD的MJPEG解码器支持YUV输出,如果场序错了avs里加一句SwapFields()就解决了。



但是我这里M$,MainConcept和PicVideo三种解码器输出RGB得到三种颜色。


SwapFields() 赞~~

把MainConcept和PicVideo输出的RGB, 和我刚才说的FFmpegSource输出比比看?

爱看看不看滚
级别: 侠客
注册时间:
2005-02-09
在线时间:
0小时
发帖:
512
只看该作者 138楼 发表于: 2008-06-09
roozhou还没有搞清楚

MJPEG里的YCbCr是JPG标准的,直接downsampling到YV12->x264的话,没有任何渲染器、解码器可以在回放时正确还原。

所以必须YCbCr->JPG变换->RGB->709变换->YV12

至于三个解码器输出的RGB颜色不一样,那肯定是有两个使用了错误的matrix变换了原始YCbCr,至于到底哪个正确,谁知道:D
级别: 风云使者
注册时间:
2006-03-12
在线时间:
54小时
发帖:
6604
只看该作者 139楼 发表于: 2008-06-09
引用
最初由 roozhou 发布

FFD的MJPEG解码器支持YUV输出


可是为什么 输出到渲染器的是UYVY 而不是YV12呢

级别: 精灵王
注册时间:
2008-04-08
在线时间:
44小时
发帖:
2855
只看该作者 140楼 发表于: 2008-06-09
M$ RGB输出


MainConcept RGB输出


PicVideo RGB输出


ffdshow YUV输出
directshowsource("ng1.avi",pixel_type="YUY2")
SwapFields()
ConvertToRGB32(matrix="PC.601")


ffdshow YUV输出
directshowsource("ng1.avi",pixel_type="YUY2")
SwapFields()
ConvertToRGB32(matrix="PC.709")
级别: 新手上路
注册时间:
2007-06-24
在线时间:
14小时
发帖:
123
只看该作者 141楼 发表于: 2008-06-09
百度不能外链
级别: 新手上路
注册时间:
2007-11-19
在线时间:
0小时
发帖:
145
只看该作者 142楼 发表于: 2008-06-09
不同意ls的说法,我已经提到把jpeg压缩和颜色变换关联是错误的理解。YUV储存解码到YUV就是本色,解到RGB就要换换损失,而且转换还要考虑是709/601和pc/tv scale2个问题,但对直接编码转换没有任何意义。之前我提到要注意pc/tv scale,我对M$解出的RGB,做ConvertToYV12("PC.601")结果等同ffdshow的YUV输出,这说明了,M$的解码器,对源的YUV认定是的pc sclae,然后采601标准转换。
级别: 侠客
注册时间:
2005-02-09
在线时间:
0小时
发帖:
512
只看该作者 143楼 发表于: 2008-06-09
解码到YUV是本色……原来你在电脑屏幕上看到的JPEG图片都是YUV

233

你连JPG到底是怎么、用什么参数对RGB采样,转成Y'CbCr的都没弄清楚

还有,未downsampling的Y'CbCr与RGB之间是无损转换的

我再说一次
对于RGB空间的图像,JPEG编码时将RGB用
Y = 0.299 R + 0.587 G + 0.114 B
Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128
Cr = 0.5 R - 0.4187 G - 0.0813 B + 128
转换为YCbCr (256 levels)

而这个YCbCr是不可以用视频的matrix转回去的
因为
1.视频的YCbCr的范围不是256
Y->16~235
CbCr->16~240
2.逆转换的公式不同

计算机回放视频时,最终都要经过渲染器把YCbCr转成RGB呈现到显示器上,请教哪个渲染器是用JPG matrix的
级别: 新手上路
注册时间:
2007-11-19
在线时间:
0小时
发帖:
145
只看该作者 144楼 发表于: 2008-06-09
[QUOTE]最初由 qyqgpower 发布
解码到YUV是本色……原来你在电脑屏幕上看到的JPEG图片都是YUV

233

你连JPG到底是怎么、用什么参数对RGB采样,转成Y'CbCr的都没弄清楚

还有,未downsampling的Y'CbCr与RGB之间是无损转换的

我再说一次
对于RGB空间的图像,JPEG编码时将RGB用
Y = 0.299 R + 0.587 G + 0.114 B
Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128
Cr = 0.5 R - 0.4187 G - 0.0813 B + 128
转换为YCbCr (256 levels)

你上面所述就是错误的理解,RGB-〉YUV那是为了加大压缩力度,所以才先行采样成YUV,接着才是JPEG压缩算法,JPEG本身压缩不一定就非得YUV,只是YUV是视频领域采用格式。另外,如果是直接mjeg对YUV源转换,根本就没有RGB-〉YUV这步骤了。

PS:之前我已提到有pc/tv sclae2套,LZ的原决不是你说的256color,要不然M$出来的的就正确了。mjpeg编码器,也有pc/tv输出的开关选项,所以不是单行0-256标准,也有16-235这种,LZ的源就是。
级别: 侠客
注册时间:
2005-02-09
在线时间:
0小时
发帖:
512
只看该作者 145楼 发表于: 2008-06-09
第一:JPEG本身压缩

这是什么概念?

YCbCr->Downsampling->Block splitting->DCT->Quantization->Entropy coding

有哪一步脱离了YUV的基础了?很显然,JPEG的压缩流程与视频压缩是非常相似的

第二,直接对YUV转换的确可以直接从Downsampling这步开始,但你如何确定这个源是从什么格式转换过来的
级别: 侠客
注册时间:
2005-12-16
在线时间:
5小时
发帖:
676
只看该作者 146楼 发表于: 2008-06-09
引用
最初由 roozhou 发布
M$ RGB输出



MainConcept RGB输出

PicVideo RGB输出


FFDshow那两个和我这里FFmpegSource出来的一样,都是典型的
16-235,
但我的MS RGB输出是这样的。。。也是16-235


为啥你的会是那种介于16-235和0-255之间的一种颜色。。。orz

另外你的MainConcept和PicVideo输出的RGB真的很怪,唯一可以肯定的是0-255,做了YC伸张。其中MainConcept接近这个(为什么你不全截第1帧。。

FFmpegSource("C:\ng1.avi")
SwapFields()
ConvertToRGB32(matrix="rec601")

爱看看不看滚
级别: 侠客
注册时间:
2005-02-09
在线时间:
0小时
发帖:
512
只看该作者 147楼 发表于: 2008-06-09
最终帧下方黑色区域色彩对比

MS (古怪结果)
RGB32
110F11 0F0D0F

PIC no Normalized (错误,过度伸张)
YUY2->VD(601RGB)
000000

PIC no Normalized (错误,过度伸张)
RGB32
000000

PIC assume Normalized (大致正确,matrix待定)
YUY2->VD(601RGB)
101010 0F0F0F

PIC assume Normalized (大致正确,matrix待定)
YUY2->ConvertToRGB32(matrix="rec709")
101010 0F0F0F

PIC assume Normalized (大致正确,matrix未知)
RGB32
101010 0F0F0F

ffdshow (错误,过度伸张)
YV12->VD(601RGB)
000000

ffdshow 601RGB (大致正确,matrix待定)
RGB32
101010 0F0F0F

ffdshow (用不扩张的matrix才能得到正确的RGB,错误)
YUY2->ConvertToRGB32("pc.709")
101010 0F0F0F

最奇怪的两点在于
MS解码器输出的色彩与其他的都不一样,因此完全错误的可能性大

ffdshow在输出YUV系时,与PIC no Normalized输出的色彩是一样的,但强制RGB后又与PIC assume Normalized相同,也就是YUV和RGB的输出策略是不同的

到这里,我感觉最安全的是
PIC assume Normalized输出YV12(这与输出YUY2的结果是一样的,省的再去ConvertToYV12)
级别: 新手上路
注册时间:
2007-11-19
在线时间:
0小时
发帖:
145
只看该作者 148楼 发表于: 2008-06-09
引用
最初由 qyqgpower 发布
第一:JPEG本身压缩

这是什么概念?

YCbCr->Downsampling->Block splitting->DCT->Quantization->Entropy coding

有哪一步脱离了YUV的基础了?很显然,JPEG的压缩流程与视频压缩是非常相似的

第二,直接对YUV转换的确可以直接从Downsampling这步开始,但你如何确定这个源是从什么格式转换过来的


源是什么格式,当然之前我提到实际实践压制过。譬如就用ffdshow来编码,输入一个YUY2,他不会动这些数据,直接压缩,如果是普通16-235 tv sclae源,这时候ffdshow解码YUV输出就正确,切换到RGB输出变灰=M$解码RGB输出,所以你如果要用后者解码必须用pc scale的YUV来压制。如果源是RGB,当然编码器就要RGB-〉YUV,这时ffdshow采用0-255 pc scale的方式(我是没注意有没有调节开关),所以解码的时候ffdshow rgb输出和M$的就正确,ffdshow的YUV输出伸张过度。另外,我也用picvideo压制,这个编码器有输出方面的pc/tv scale的设定,RGB的输入也可以16-235 tv sclae保存,所以解码的时候要看设置。

另外,注意到ffdshow对mjpeg有特殊处理,在rgb/yuv的输出表现不同,差异就是pc/tv sclae这种所谓yc扩张问题。这和处理mpeg/xvid/h264这些编码的效果不同,后者这些编码rgb输出应该等同YUV。
级别: 侠客
注册时间:
2005-12-16
在线时间:
5小时
发帖:
676
只看该作者 149楼 发表于: 2008-06-09
PIC no Normalized 和PIC assume Normalized是啥?

另,su xining你说 “FFD RGB输出变灰=M$解码RGB输出”没发现颜色有差别么,特别是刀把的红色

爱看看不看滚
快速回复

限150 字节
上一个 下一个