Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Verwenden von IAMMediaContent (https://www.delphipraxis.net/198137-verwenden-von-iammediacontent.html)

EWeiss 5. Okt 2018 21:58


Verwenden von IAMMediaContent
 
Die einzige Information die ich habe ist diese hier.
Zitat:

IAMMediaContent

Implemented methods:
•get_Title Returns title of the clip. One line of text.
•get_Description Returns description of the clip. Multiline text.

Returned text is ready to use, i.e. any URL encoding, HTML entities, HTML tags etc. are removed.
Zusatz Informationen gibt es hier.. so weit man das so nennen darf

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:
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;
1. Ich weis nicht ob das mit dem Splitter so stimmt.
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..
Neue KINO TRAILER 2018 (German Deutsch) KW 38


gruss

EWeiss 5. Okt 2018 22:17

AW: Implementation von IAMMediaContent
 
Ok! Sorry hat sich erledigt.
So geht es!

Delphi-Quellcode:
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;
srcFilter ist in dem Fall
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

Schokohase 5. Okt 2018 22:57

AW: Implementation von IAMMediaContent
 
Du willst also
Delphi-Quellcode:
IAMMediaContent
gar nicht implementieren sondern verwenden? Dann ist der Titel Implementation von IAMMediaContent etwas irreführend.

Wenn du nicht aufpasst, dann hast du hier einen schönen Memleak, denn du musst den zurückgegebenen Text von
Delphi-Quellcode:
IAMMediaContent::get_Title
auch wieder aus dem Speicher räumen (laut Dokumentation).

Am einfachsten ist das, wenn du dieses direkt in der Methode
Delphi-Quellcode:
TEVMRPlayer.GetYoutubeFilterTitle
erledigst. Dort kopierst du den Text von unmanaged zu managed (von dem Pointer in einen string) und gibst den unmanaged Speicher direkt frei.

EWeiss 5. Okt 2018 22:58

AW: Implementation von IAMMediaContent
 
Zitat:

Dort kopierst du den Text von unmanaged zu managed und gibst den unmanaged Speicher direkt frei.
Beispiel?
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:

(von dem Pointer in einen string)
Der soll PWideChar bleiben.

Zitat:

Dann ist der Titel Implementation von IAMMediaContent etwas irreführend.
geändert..

gruss

Schokohase 5. Okt 2018 23:12

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:

Zitat von EWeiss (Beitrag 1415064)
Zitat:

(von dem Pointer in einen string)
Der soll PWideChar bleiben.

Bitte erkläre mir doch einmal, was ein
Delphi-Quellcode:
PWideChar
ist? Etwa ein Pointer und deswegen fängt der Typ auch mit einem P an?

EWeiss 5. Okt 2018 23:15

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:

Bitte erkläre mir doch einmal, was ein PWideChar ist? Etwa ein Pointer und deswegen fängt der Typ auch mit einem P an?
Du wolltest den Pointer in einen string kopieren.
Deshalb habe ich gesagt der soll PWideChar bleiben. (Pointer of WideChar)

Ich habe es so verstanden.
Delphi-Quellcode:
var
  x: string
//..
x := string(Title);
gruss

Schokohase 5. Okt 2018 23:20

AW: Verwenden von IAMMediaContent
 
Zitat:

Zitat von EWeiss (Beitrag 1415066)
Ahh dann war ich fast richtig. Siehe mein Edit.

Nun ja, fast richtig - es hatte sich bei dir eigentlich nichts gändert. Ob man den Pointer direkt an Title übergibt oder über eine Zwischenvariable, das ändert halt nichts.

Der FreeMem auf dem Pointer ist das Entscheidende

EWeiss 5. Okt 2018 23:21

AW: Verwenden von IAMMediaContent
 
Zitat:

Zitat von Schokohase (Beitrag 1415067)
Zitat:

Zitat von EWeiss (Beitrag 1415066)
Ahh dann war ich fast richtig. Siehe mein Edit.

Nun ja, fast richtig - es hatte sich bei dir eigentlich nichts gändert. Ob man den Pointer direkt an Title übergibt oder über eine Zwischenvariable, das ändert halt nichts.

Der FreeMem auf dem Pointer ist das Entscheidende

Also doch fast! ;) Wollen wir mal nicht so kleinlich sein..

Auf jeden fall danke für den Hinweis.

gruss

Schokohase 5. Okt 2018 23:29

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:
function TEVMRPlayer.GetYoutubeFilterTitle(out Title: string): HRESULT;
, 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.

EWeiss 5. Okt 2018 23:30

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:06 Uhr.
Seite 1 von 3  1 23      

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