请问如何给Windows Media Player写插件,支持自己定义的音频格式?使其能够播放?
需要哪些步骤,哪些SDK,以及哪些工具。谢谢

解决方案 »

  1.   

    写相关的解码的filter并注册。DirectShow.可以参考陆其明的DirectShow和Windows Media的书。
      

  2.   

    因为没有使用过DirectShow,希望得到指点。
    我现在如果已经写好了,扩展名为filter.ax,请问如何使用?让MediaPlayer能够使用?
    比如我想让所有扩展名为abc的文件都由MediaPlayer来播放,其中codec在filter.ax中。
    该如何操作?
      

  3.   

    regsvr32 filter.ax 进行注册。
      

  4.   

    写SourceFilter,在DllRegisterServer中的AMovieDllRegisterServer2前
    RegisterSourceFilter(
    CLSID_AsyncReader, 
    MEDIASUBTYPE_RealMedia, 
    _T("0,4,,2E524D46"), 
    _T(".rm"), _T(".rmvb"), _T(".ram"), NULL);void RegisterSourceFilter(const CLSID& clsid, const GUID& subtype2, LPCTSTR chkbytes, LPCTSTR ext = NULL, ...)
    {
    CString null = CStringFromGUID(GUID_NULL);
    CString majortype = CStringFromGUID(MEDIATYPE_Stream);
    CString subtype = CStringFromGUID(subtype2);
    /*
    SetRegKeyValue(_T("Media Type\\") + null, subtype, _T("0"), chkbytes);
    SetRegKeyValue(_T("Media Type\\") + null, subtype, _T("Source Filter"), CStringFromGUID(clsid));
    */
    SetRegKeyValue(_T("Media Type\\") + majortype, subtype, _T("0"), chkbytes);
    SetRegKeyValue(_T("Media Type\\") + majortype, subtype, _T("Source Filter"), CStringFromGUID(CLSID_AsyncReader)); DeleteRegKey(_T("Media Type\\") + null, subtype); va_list er;
    va_start(er, ext);
    for(; ext; ext = va_arg(er, LPCTSTR))
    DeleteRegKey(_T("Media Type\\Extensions"), ext);
    va_end(er);
    }
      

  5.   

    我安装了DirectX9.0 SDK。在VC的Tools/Option/Directory里的Include面加入<DX90SDKInstallFolder>\Include, 
    <DX90SDKInstallFolder>\Samples\C++\Common
    <DX90SDKInstallFolder>\Samples\C++\DirectShow\Common
    <DX90SDKInstallFolder>\Samples\C++\DirectShow\BaseClasses在Library中加入
    <DX90SDKInstallFolder>\lib
    <DX90SDKInstallFolder>\Samples\C++\DirectShow\BaseClasses\Debug修改Project Setting/Link/Output file name为Debug/MyFilter.ax修改Project Setting/Link/Object Modules为
    strmbasd.lib msvcrtd.lib quartz.lib vfw32.lib winmm.lib kernel32.lib advapi32.lib version.lib largeint.lib user32.lib gdi32.lib comctl32.lib ole32.lib olepro32.lib oleaut32.lib uuid.lib选上"Ignore all default libraries.随后,我build成功了
    <DX90SDKInstallFolder>\Samples\C++\DirectShow\BaseClasses,
    生成了Debug目录中的strmbasd.lib主文件代码如下:
    #include "stdafx.h"
    #include <streams.h>STDAPI DllRegisterServer()
    {
    return AMovieDllRegisterServer2(TRUE);
    }STDAPI DllUnregisterServer()
    {
    return AMovieDllRegisterServer2(FALSE);
    }extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
     
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        return DllEntryPoint((HINSTANCE) hModule, (ULONG) ul_reason_for_call, lpReserved);
    }
    但是链接会出错:
    Compiling...
    StdAfx.cpp
    Compiling...
    myFilter.cpp
    Linking...
       Creating library Debug/MyFilter.lib and object Debug/MyFilter.exp
    strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
    strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
    strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA)
    strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA)
    Debug/MyFilter.ax : fatal error LNK1120: 2 unresolved externals
    Error executing link.exe.MyFilter.ax - 5 error(s), 0 warning(s)
    然后我生成一个Simple Dll Project.
    MyFilter.def文件如下:
    LIBRARY MyFilter.ax 
    EXPORTS
    DllMain PRIVATE
    DllGetClassObject PRIVATE
    DllCanUnloadNow PRIVATE
    DllRegisterServer PRIVATE
    DllUnregisterServer PRIVATE