Thema: Delphi WMV/WMA und DRM *hmz*

Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

WMV/WMA und DRM *hmz*

  Alt 23. Mai 2009, 21:40
Hi,

ich habe heute krampfhaft versucht DRM geschützte Formate über Directshow abzuspielen. Das Problem was ich habe ist folgendes: Ich finde auf der MSDN Seite nirgends eine Version der wmvcore.lib in welcher WMCreateCertificate zu finden ist

Theoretisch sollte für die Wiedergabe von DRM Material ja folgender Code ausreichen:

Delphi-Quellcode:
  TKeyProvider = class(TInterfacedObject, IServiceProvider)
    function QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall;
  end;

...

function TKeyProvider.QueryService(const rsid, iid: TGuid; out Obj): HResult; stdcall;
var
  punkCert: IUnknown;
  LibHandle: Cardinal;
  WMCreateCertificate: function(out pUnkCert: IUnknown): HRESULT; stdcall;

begin
  result := E_NOINTERFACE;
  if (isEqualGUID(rsid, IID_IWMReader)) then
  begin
    LibHandle := LoadLibrary('wmvcore.dll'); // <-- Jaja ich weiß, da war die Funktion mal drin...
    if (LibHandle > 0) then
    begin
      WMCreateCertificate := GetProcAddress(LibHandle, 'WMCreateCertificate');
      if assigned(WMCreateCertificate) then
      begin
        result := WMCreateCertificate(punkCert);
        if SUCCEEDED(result) then IUnknown(obj) := punkCert;
      end;
    end else result := E_FAIL;
    freeLibrary(LibHandle);
  end;
end;

function TForm1.AddKeyProvider(const pGraph: IGraphBuilder): HRESULT;
var ObjectWithSite: IObjectWithSite;
const
  IID_IObjectWithSite: TGuid = '{FC4801A3-2BA9-11CF-A229-00AA003D7352}';

begin
  result := pGraph.QueryInterface(IID_IObjectWithSite, ObjectWithSite);
  if SUCCEEDED(result) then
    result := ObjectWithSite.SetSite(FProvider);
end;

procedure TForm1.LoadFromFile(const Filename: string);
var
  Filter: IBaseFilter;
  source: IFileSourceFilter;
  EP: IEnumPins;
  outPin: IPin;
  ff: ULONG;
begin
  FProvider := TKeyProvider.Create;
  CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC,
    IID_IFilterGraph2, FGraph);
  CoCreateInstance(CLSID_WMAsfReader, nil,
    CLSCTX_INPROC, IID_IBaseFilter, Filter);
  Fgraph.AddFilter(Filter, 'ASF Source');
  AddKeyProvider(FGraph);
  Filter.QueryInterface(IID_IFileSourceFilter, source);

  Source.Load(PWideChar(WideString(Filename)), nil);

  Filter.EnumPins(EP);
  EP.Reset;
  while EP.Next(1, outpin, @ff) = S_OK do
    FGraph.Render(outpin);
  EP := nil;
  FGraph.QueryInterface(IID_IMediaControl, FMC);
  FMC.Run;
end;
Hinweise und Links zu obiger Lib nehme ich dankbar entgegen :wub:

Peter
  Mit Zitat antworten Zitat