李国帅 摘自工作日志
2012/7/10 13:57:45
在解码过滤器之后,渲染器之前,加入一个中间过滤器,就可以在这个过滤器中对媒体帧进行后处理,比如处理抓图,缩放,绘图等。
处理数据解码后非YUV420P的情况
我们将中间过滤器的inpin设定为接收YV12,但有些视频或解码器不能输出YV12格式,只可以输出I420格式,那么就需要将uv互换,变成YV12进行播放。
是否需要把yuv转换为RGB
做一个后处理的transform filter,把yuv数据转换为rgb数据。 除非有必要,不然的话没有必要做这一步,因为vmr自己根据显卡决定是yuv格式还是rgb格式。
有些显示器无法显示YV12格式图像帧,但现在已经很少了。
对于现在的显示设备,基本上都支持YV12,不再需要考虑RGB播放以及其他的YUV格式。
如何在视频上绘制线条或者缩放框
方法1、
生成一个内存dc,和一个bmp内存图像,把一帧rgb数据写入bmp文件,然后把dc和bmp文件进行关联。
使用dc对bmp图像进行拉伸,缩放,绘图,和其他的任何处理。
方法2、
在界面上添加一个透明窗口,绘制文字和线条。方法简单,但窗口必须是播放窗口的上层窗口。
中间过滤器的限制
现在自己用的中间过滤器仅仅支持YV12格式,如果不是YV12,那么必须转换为YV12,这样的话中间处理就不能继承自CTransInPlaceFilter,需要使用CTransformFilter这样的过滤器,因为输入输出媒体格式不一样。
把解码之后的视频格式从RGB或其他YUV格式转换为YV12格式,可以自己按照公式转换,也可以使用ffmpeg中的转换函数。
其实如果转换为RGB格式进行输出,视频图像处理更加方便一些,因为对rgb的处理有比较成熟的技术,也更加的直观。
中间过滤器改进
以后可能加入,去噪,锐化,抓图等等。
如果使用evr,中间过滤器不能够抓到图像,好像抓到的都是0,但使用evr的抓图接口是可以抓到图像的。
--------------------------------------------
现在开始做一个中间处理过滤器,把放大的矩形框绘制到画面上。
中间过滤器基类有三种选择
CBaseFilter CBaseInputPin CBaseOutputPin
CTransformFilter CTransformInputPin CTransformOutputPin 进行数据转换,可以改变媒体类型和媒体缓冲区
CTransInPlaceFilter CTransInPlaceInputPin CTransInPlaceOutputPin 仅仅是把缓冲区里面数据进行处理。
如果要把yv12改变为yuv或者rgb格式,可以在render中进行,现在的render使用了vmr9,现在不用考虑显示器不能播放rgb的情况。
所以直接更改yv数据,在yv12数据中绘制矩形,这样快捷,方便。
名字定为“XVideoTransFilter ”,仅仅处理视频。主要处理绘制绘制矩形。
但是如果后期需要进行复杂的操作,比如进行倒放缓冲,可以这个基础上更改的话。
暂不处理音频,需要进行音频处理,另外加入一个过滤器。
YUV介绍
YUV(从技术上来讲并不叫YUV而 是叫做YCbCr)是一种类似于RGB方式的存储原始图像的格式。 粗略的讲,Y是亮度分量,U和V是色度分量。(这种格式比RGB复杂的多,因为很多的颜 色信息被丢弃了,而且你可以每2个Y有1个U和1个V)。SDL的YUV覆盖使用一组原始的YUV数据并且在屏幕上显示出他们。它可以允许4种不同的 YUV格式,但是其中的YV12是最快的一种。还有一个叫做YUV420P的YUV格式,它和YV12是一样的,除了U和V分量的位置被调换了以外。 420意味着它以4:2:0的比例进行了二次抽样,基本上就意味着1个颜色分量对应着4个亮度分量。所以它的色度信息只有原来的1/4。这是一种节省带宽 的好方式,因为人眼感觉不到这种变化。在名称中的P表示这种格式是平面的――简单的说就是Y,U和V分量分别在不同的数组中。FFMPEG可以把图像格式 转换为YUV420P,但是现在很多视频流的格式已经是YUV420P的了或者可以被很容易的转换成YUV420P格式