DirectShow怎么设置全屏时的分辨率和颜色质量

DirectShow怎么设置全屏时的分辨率和颜色质量,第1张

1、设置成显示器最佳分辨率时显示不满屏,是因为刷新率设置有误造成的。

2、液晶显示器一般刷新率为60,纯平一般为85。大于或者小于这个数据偶尔会造成不满屏显示。

3、在桌面空白处右击,选择屏幕分辨率,如图

4、选择高级设置。如图

5、在监视器中设置刷新率即可。

6、如果显卡驱动安装有误也会造成此类情况。请检查显卡驱动是否正确。

7、考虑显示器没有调节好,用显示器上的调节按钮调节显示区域即可。

那是因为C++与C#中的数据类型不对应而照成的。你可以使用C#调用C++ DLL的导出函数,在你的C#中实现即可。C++的导出函数一般在SDK中会详细说明,你对着改抄就可以了。下面给点例子:例如:C++的导出函数为:long WINAPI LoadDRV(void)你在C#中使用对应的方式声明这个函数的对应函数[DllImport("Tc08a32.dll", EntryPoint = "LoadDRV", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern Int32 LoadDRV()DllImport的语法你可以在MSDN上面找到详细的说明,这里对给出的示例做一下简单的说明括号中的第一个String参数是表明你要导入的DLL的目标路径,可以是别人C++导出函数的路径EntryPoint设置后,可以主动的搜索入口函数,可要可不要。CharSet是设置你接收时的字符类型的,这个很重要,某些时候,通过改变这个值的设置可以得到你的理想值。CallingConvention是指的一个导出标准,一般在C++的SDK中也可以看到这种导出标准,是什么,就对应的用什么。 注意使用时的类型转换,因为变量的类型不同,则使用不同的对应关系,这个网上也有很多的介绍,很简单。唯一需要注意的是一些指针类型,因为C#为安全机制没有指针一般的,C++中的 Char * 在C#中可以使用一个String来传值如果是LPSTR的话,那就需要使用一个char[]来实现,具体char[]有多长,你要根据你的SDK中的说明具体实现。实现完你需要的函数之后,你即可在你的项目中调用了。

对于DIrectShow的初学者而言,最大的困难莫过于尝试设计自定义的filter。

设计自定义的transform filter是困难的

因为 首先filter是一种dll (后缀名为.ax)而编写dll工程需要一定的VC基础 所以建议先补充一点dll的知识

其次 dll的注册,GUID的生成和工程的配置都很麻烦。

再次 网上缺乏现成的transform filter的例子。DirectShow给的源码比如NULLINPLACE 和CONTRAST都太复杂,都带有对话框和属性页,不适合初学者,而且这些例子 没有一个涉及到图像格式的转换,而transform filter最大的公用就是媒体类型的转换,因此这些例子不适用

作为一个初学者,我深深受到这些问题的困扰,经过刻苦钻研终于走出了这个泥潭,豁然开朗。于是把它记录下来,希望可以对其他人有帮助,也作为对08年的一个小结。

我的例子是 设计一个 transform filter 把 YUY2 16bit 的媒体转化为RGB24 24bit的类型。

原因是我的摄像头只支持YUY2 16bit这种格式, 我想得到位图。。顺便学习一下Filter的设计

以下为具体步骤:

一 配置开发环境

1. VC中在Tools->Options->Directories 设置好DirectX SDK的头文件和库文件路径

2. 编译了基类源码,生成strmbasd.lib (debug版), strmbase.lib(release版)

3. VC向导新建一个win32 DLL(empty)工程

4. Setting->Link->Output file name: YUV2RGBfilter.ax

5. Setting->Link加入strmbasd.lib winmm.lib quartz.lib vfw32.lib (注意路径)

6. 定义一个同名.def文件,加入到工程,内容如下:

LIBRARY YUV2RGBfilter.ax

EXPORTS

DllMain PRIVATE

DllGetClassObjectPRIVATE

DllCanUnloadNow PRIVATE

DllRegisterServerPRIVATE

DllUnregisterServer PRIVATE

7.建立一个类 YUV2RGBfilter 建立他的cpp文件和h文件

8. 在YUV2RGBfilter.cpp中定义DLL的入口函数及注册 放在cpp文件的最后

//

// DllEntryPoint

//

extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID)

BOOL APIENTRY DllMain(HANDLE hModule,

DWORD dwReason,

LPVOID lpReserved)

{

return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved)

}

////////////////////////////////////////////////////////////////////////

//

// Exported entry points for registration and unregistration

// (in this case they only call through to default implementations).

//

////////////////////////////////////////////////////////////////////////

STDAPI DllRegisterServer()

{

return AMovieDllRegisterServer2( TRUE )

}

STDAPI DllUnregisterServer()

{

return AMovieDllRegisterServer2( FALSE )

}

9. cpp文件中要包含的头文件

#include <streams.h>

#include <windows.h>

#include <initguid.h>

#include <olectl.h>

#if (1100 >_MSC_VER)

#include <olectlid.h>

#endif

#include "Y2Ruids.h" // our own public guids

#include "YUV2RGBfilter.h"

二 开发Filter

1. 生成GUID( 命令行模式下运行guidgen工具) 为他建立一个文件Y2Ruids.h 单独引用

#include <initguid.h>

// YUV2toRGB24 Filter Object

// {F91FC8FD-B1A6-49b0-A308-D6EDEAF405DA}

DEFINE_GUID(CLSID_YUV2toRGB24,

0xf91fc8fd, 0xb1a6, 0x49b0, 0xa3, 0x8, 0xd6, 0xed, 0xea, 0xf4, 0x5, 0xda)

2. 构造CYUV2RGBfilter类 继承自CTransformFilter写在TransformFilter.h中

// ----------------------------------------------------------------------------

// Class definitions of CYUV2RGBfilter

// ----------------------------------------------------------------------------

//

//

class CYUV2RGBfilter : public CTransformFilter

{

public:

static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr)

STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv)

DECLARE_IUNKNOWN

// override pure virtual function

HRESULT CheckInputType(const CMediaType *mtIn)

HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)

HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProp)

HRESULT GetMediaType(int iPosition, CMediaType *pMediaType)

HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut)

private:

//Constructor

CYUV2RGBfilter(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr)

// member function

VOID ChangeFormat(AM_MEDIA_TYPE* pAdjustedType)

DWORD ConvertYUV2toRGB(BYTE* yuv, BYTE* rgb, DWORD dsize)

// member variable

const long m_lBufferRequest

CCritSec m_Y2RLock// To serialise access.

}

3. 按格式改写构造函数

//

// CNullInPlace::Constructor

//

CYUV2RGBfilter::CYUV2RGBfilter(TCHAR *tszName,LPUNKNOWN punk,HRESULT *phr) :

CTransformFilter(tszName, punk, CLSID_YUV2toRGB24),

m_lBufferRequest(1)

{

ASSERT(tszName)

ASSERT(phr)

} // CYUV2RGBfilter

4. 改写CTransformFilter五个纯虚函数(最重要的地方)

HRESULT CheckInputType(const CMediaType *mtIn)

HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)

HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProp)

HRESULT GetMediaType(int iPosition, CMediaType *pMediaType)

HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut)

5. 设计自己的私有函数 完成一定的功能

6. 注册Filter信息

// 注册信息

//setup data

const AMOVIESETUP_MEDIATYPE

sudPinTypes = { &MEDIATYPE_Video// clsMajorType

, &MEDIASUBTYPE_NULL } // clsMinorType

const AMOVIESETUP_PIN

psudPins[] = { { L"Input"// strName

, FALSE // bRendered

, FALSE // bOutput

, FALSE // bZero

, FALSE // bMany

, &CLSID_NULL // clsConnectsToFilter

, L"Output" // strConnectsToPin

, 1 // nTypes

, &sudPinTypes } // lpTypes

, { L"Output" // strName

, FALSE // bRendered

, TRUE// bOutput

, FALSE // bZero

, FALSE // bMany

, &CLSID_NULL // clsConnectsToFilter

, L"Input"// strConnectsToPin

, 1 // nTypes

, &sudPinTypes } } // lpTypes


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7875503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存