Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi WMV/WMA und DRM *hmz* (https://www.delphipraxis.net/134517-wmv-wma-und-drm-%2Ahmz%2A.html)

Peter666 23. Mai 2009 21:40


WMV/WMA und DRM *hmz*
 
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 :wall:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz