大家好!我有一个非常棘手的问题已经困扰了我很长一阵子!
前些日子我做了一个自定义Filter,可以播放网络上接收到的QCIF分辨率的图像(IYUV格式),本来程序工作已经很正常了,可后来重做了系统,再调试这个程序时,输出的视频就是花屏的,我试着只推送单一色彩的图片(即将视频缓冲区中的一帧全部填为128),发现输出的图像只有上半部分正常,下半部分全是绿色的。在检查了DxSDK版本,并全部重新编译后,问题依然存在。
后来仔细调试的过程中,我发现在FillBuffer函数中,得到的IMediaSample对象GetSize返回值比QCIF要大!正常来说,QCIF是176*144的分辨率,按照IYUV的存储格式应该占用176*144/2*3=38106大小的空间,而我的程序调试时,返回的IMediaSample对象缓冲区每次都是41472,而且无论我在DecideBufferSize函数中将缓冲区设置为多大,此时都会返回41472。后来我将分辨率设置为320*240,再运行程序,看到的结果就是正常的一张图片了。后来我算了一下41472这个数字,原来是 192*144/2*3=41472,为什么会这样呢?为什么176*144的分辨率不被支持呢?而且重装系统之前这个程序是好用的呀?

解决方案 »

  1.   

    D3D纹理要求大小为2的整数次方,不清楚DirectShow有没有相关限制了。
      

  2.   

    这是由于显示决定的,render可能随时根据需要,返回格式变化请求,从而能够满足硬件加速的需要。格式的动态改变lz是怎么处理的,把这个处理好。再有,处理width的对齐,比如你说的176变成192,需要根据格式的变化做实际的处理,并不一定是最开始连接时候的格式,动态更新
      

  3.   

    你的自定义filter是trans类型的吧,这种类型虽然实现最简单,但是要写好最关键的就是要处理好媒体类型的动态变化请求。
      

  4.   

    我做DirectShow不久,请问各位大侠,媒体类型的动态变化请求是以什么方式通知的呢?我现在没有这部分的处理。我的Filter不是Trans类型,是SourceFilter,还有320*240也不是2的整数次方呀?另外还想问一下,格式如果改变了,不会影响到输出窗口的大小吧?只是我在填充图像的时候,只填充有用的那一部分,对吗?谢谢!