![]() |
Verwenden von IAMMediaContent
Die einzige Information die ich habe ist diese hier.
Zitat:
![]() Mein bisher kläglicher versuch.
Delphi-Quellcode:
function KVideo_GetYoutubeFilterTitle(var Title: PWideChar): HRESULT; stdcall;
begin result := E_FAIL; if not Assigned(EVMRPlayer) then exit; result := EVMRPlayer.GetYoutubeFilterTitle(Title); end;
Delphi-Quellcode:
1. Ich weis nicht ob das mit dem Splitter so stimmt.
function TEVMRPlayer.GetYoutubeFilterTitle(var Title: PWideChar): HRESULT;
var MediaContent: IAMMediaContent; Source: IBaseFilter; begin Result := E_FAIL; if IsUrl then begin if DYDYoutubeFilter <> nil then begin if IsRegisteredFilter(CLSID_LegacyAmFilterCategory, CLSID_MPEG1Splitter) then Result := CoCreateInstance(CLSID_MPEG1Splitter, nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, Source); if SUCCEEDED(Result) then begin Source.QueryInterface(IID_IAMMediaContent, MediaContent); Result := MediaContent.get_Title(Title); if not SUCCEEDED(Result) then ReportError('YoutubeFilterTitle fails', Result); end; end; end; end; 2. Fehlt hier noch irgendwas? Ich habe mich im Net dumm gesucht aber mit dem Stichwort IAMMediaContent findet man fast so gut wie nix. Der Titel soll mir den Namen des Video Streams zurückgeben. Beispiel.. ![]() gruss |
AW: Implementation von IAMMediaContent
Ok! Sorry hat sich erledigt.
So geht es!
Delphi-Quellcode:
srcFilter ist in dem Fall
function TEVMRPlayer.GetYoutubeFilterTitle(var Title: PWideChar): HRESULT;
var MediaContent: IAMMediaContent; begin Result := E_FAIL; if not Assigned(srcFilter) then exit; if IsUrl then begin if DYDYoutubeFilter <> nil then begin srcFilter.QueryInterface(IID_IAMMediaContent, MediaContent); Result := MediaContent.get_Title(Title); if not SUCCEEDED(Result) then ReportError('YoutubeFilterTitle fails', Result); end; end; end;
Delphi-Quellcode:
hr := GraphBuilder.AddSourceFilter(PWideChar(MediaFile), 'SRC01', srcFilter);
Was für ein Aufwand bis das mal alles steht. Pic von Vimeo, YouTube Jetzt fehlt noch die Video Auflösung und die Laufzeit. gruss |
AW: Implementation von IAMMediaContent
Du willst also
Delphi-Quellcode:
gar nicht implementieren sondern verwenden? Dann ist der Titel Implementation von IAMMediaContent etwas irreführend.
IAMMediaContent
Wenn du nicht aufpasst, dann hast du hier einen schönen Memleak, denn du musst den zurückgegebenen Text von
Delphi-Quellcode:
auch wieder aus dem Speicher räumen (
IAMMediaContent::get_Title
![]() Am einfachsten ist das, wenn du dieses direkt in der Methode
Delphi-Quellcode:
erledigst. Dort kopierst du den Text von unmanaged zu managed (von dem Pointer in einen string) und gibst den unmanaged Speicher direkt frei.
TEVMRPlayer.GetYoutubeFilterTitle
|
AW: Implementation von IAMMediaContent
Zitat:
Ich denke du meinst das so.
Delphi-Quellcode:
function TEVMRPlayer.GetYoutubeFilterTitle(var Title: PWideChar): HRESULT;
var MediaContent: IAMMediaContent; pTitle: PWideChar; begin Result := E_FAIL; if not Assigned(srcFilter) then exit; if IsUrl then begin if DYDYoutubeFilter <> nil then begin srcFilter.QueryInterface(IID_IAMMediaContent, MediaContent); Result := MediaContent.get_Title(pTitle); Title := pTitle; pTitle := nil; if not SUCCEEDED(Result) then ReportError('YoutubeFilterTitle fails', Result); end; end; end; Zitat:
Zitat:
gruss |
AW: Verwenden von IAMMediaContent
So sollte das tun
Delphi-Quellcode:
function TEVMRPlayer.GetYoutubeFilterTitle(out Title: string): HRESULT;
var MediaContent: IAMMediaContent; pbstrTitle: PWideChar; begin Result := E_FAIL; if not Assigned(srcFilter) then exit; if IsUrl then begin if DYDYoutubeFilter <> nil then begin srcFilter.QueryInterface(IID_IAMMediaContent, MediaContent); Result := MediaContent.get_Title(pbstrTitle); if not SUCCEEDED(Result) then ReportError('YoutubeFilterTitle fails', Result) else begin Title := pbstrTitle; FreeMem(pbstrTitle); end; end; end; end; Zitat:
Delphi-Quellcode:
ist? Etwa ein Pointer und deswegen fängt der Typ auch mit einem P an?
PWideChar
|
AW: Verwenden von IAMMediaContent
Ahh dann war ich fast richtig. Siehe mein Edit.
Danke dir. Werde das auch bei Description berücksichtigen (ist noch nicht implementiert) Zitat:
Deshalb habe ich gesagt der soll PWideChar bleiben. (Pointer of WideChar) Ich habe es so verstanden.
Delphi-Quellcode:
gruss
var
x: string //.. x := string(Title); |
AW: Verwenden von IAMMediaContent
Zitat:
Der FreeMem auf dem Pointer ist das Entscheidende |
AW: Verwenden von IAMMediaContent
Zitat:
Auf jeden fall danke für den Hinweis. gruss |
AW: Verwenden von IAMMediaContent
Wenn du weiterhin Title als PWideChar übergeben willst, dann hast du jetzt zwei Möglichkeiten:
1. Du hast einen MemLeak, weil alle Stllen die diese Methode verwenden den Speicherbereich nicht freigeben. 2. Es knallt, wenn du den Speicher in der Methode schon freigibst. Die beste Variante ist die von mir gezeigte
Delphi-Quellcode:
, denn dort hast du weder ein MemLeak noch einen SPeicherzugriffsfehler, egal was du anstellst. Ist allerdings auch nur eine Empfehlung wie ich das machen würde, weil es das Leben einfacher macht.
function TEVMRPlayer.GetYoutubeFilterTitle(out Title: string): HRESULT;
|
AW: Verwenden von IAMMediaContent
Nun Praxis und versuch sind zwei Dinge.
Die Anwendung stürzt nun ab bei FreeMem. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz