Mediainfo.dll

Mediainfo.dll
2014-04-02T21:16:50+02:00
2014-04-14T20:30:15+02:00
2022-07-19T05:10:32+02:00
ErZé
A mediainfo.dll –t szeretném használni egymás után  több film adatainak a kiolvasására. A program készítője nagyon előzékenyen még példa programot is írt, szinte minden nyelven,(én a delphit szeretném használni)  amely remekül működik... de csak egy fájlt tud elemezni. a többit csak átlépi. MIÉRT?
Mutasd a teljes hozzászólást!
Ezt a részt vedd ki, és működni fog:

To_Display := To_Display + CR + CR + 'Custom Inform' + CR; MediaInfo_Option (0, 'Inform', 'General;Example : FileSize=%FileSize%'); To_Display := To_Display + MediaInfo_Inform(Handle, 0); To_Display := To_Display + CR + CR + 'GetI with Stream=General and Parameter:=17' + CR; To_Display := To_Display + MediaInfo_GetI(Handle, Stream_General, 0, 17, Info_Text); To_Display := To_Display + CR + CR + 'Count_Get with StreamKind=Stream_Audio' + CR; To_Display := To_Display + format('%d', [MediaInfo_Count_Get(Handle, Stream_Audio, -1)]); To_Display := To_Display + CR + CR + 'Get with Stream:=General and Parameter=^AudioCount^' + CR; To_Display := To_Display + MediaInfo_Get(Handle, Stream_General, 0, 'AudioCount', Info_Text, Info_Name); To_Display := To_Display + CR + CR + 'Get with Stream:=Audio and Parameter=^StreamCount^' + CR; To_Display := To_Display + MediaInfo_Get(Handle, Stream_Audio, 0, 'StreamCount', Info_Text, Info_Name); To_Display := To_Display + CR + CR + 'Get with Stream:=General and Parameter=^FileSize^' + CR; To_Display := To_Display + MediaInfo_Get(Handle, Stream_General, 0, 'FileSize', Info_Text, Info_Name);
Ez a rész az egyedi lekérdezéseket tartalmazza.
Én a
To_Display
helyett így csinálnám:

For i:=0 to sList.Count -1 do begin Handle := MediaInfo_New(); pw := StringToOleStr(slist[i]); // Konvertálás Memo1.Lines.Add(format('%d', [MediaInfo_Open(Handle, PWideChar(pw))])); // Mégegyszer ? Memo1.Lines.Add('Inform with Complete=false'); MediaInfo_Option (0, 'Complete', ''); // rövid verziós lekérdezés Memo1.Lines.Add(MediaInfo_Inform(Handle, 0)); Memo1.Lines.Add('Inform with Complete=true'); MediaInfo_Option (0, 'Complete', '1'); // bővebb verziós lekérdezés Memo1.Lines.Add(MediaInfo_Inform(Handle, 0)); Memo1.Lines.Add('********** Következő file *************'); MediaInfo_Close(Handle); pw:=''; tc:=''; end;
Mutasd a teljes hozzászólást!

  • Szia!

    Ezt megnézted már?
    Mutasd a teljes hozzászólást!
  • Szia!


    Köszönöm hogy foglalkozol a problémámmal! De sajnos nálam ez a változat sem működik jól.

    A memoba sikerül néhány  értelmetlen jelet beletennie és megáll. Az eredeti az működne jól, de csak egyszer fut le hibátlanul a másodiknál pedig olyan mintha nem kapná meg a file nevét, (persze debug módban futtatva látom hogy megkapja), vagy valami benne marad a memóriában??? Nem értem...
    Mutasd a teljes hozzászólást!
  • Szia! Még belemélyedni a forráskódba nem volt időm, de most próbálgattam.
    Néhány fájlnál megáll valóban (nálam ez egy mp4 fájl). De ez inkább szerintem a dll hibája. Ránézek majd, hogy pontosan miért is és visszajelzem neked.
    Mutasd a teljes hozzászólást!
  • Majd elfelejtettem. A fájlok mérete nagyobb 2 Gb-nál? Mert akkor fájl pozicionálási hibák lehetnek.
    Mutasd a teljes hozzászólást!
  • Szia!

    Nem, 2-300 MB-os fájlokkal próbáltam
    Mutasd a teljes hozzászólást!
  • Talán érdemes lenne kipróbálni FFmpeg programot amivel minden mediainfót kinyerhetsz az összes videofájltípusból. Én is ezt használom most lejátszási idő kinyerésére. Infót itt találsz a tudásáról és használatáról: ffmpeg
    Innen pedig letöltheted a neked megfelelőt: FFmpegHasználhatod akár *.bat fájlban is ciklussal. Egy batch mintapélda:

    @echo off del lista.csv for %%a in (*.avi *.flv *.mkv *.mp4 *.ts *.vob *.wmv) do ffprobe -show_entries format=filename,duration -print_format csv=print_section=0 -loglevel quiet -i "%%a" >> lista.csv
    Mutasd a teljes hozzászólást!
  • Köszönöm kipróbálom!
    Mutasd a teljes hozzászólást!
  • Szia! Most volt időm megnézni. De nem nagyon tudok mit mondani. A példa alpján kipróbáltam és írtam is egy egyszerű kis programot. Több fájlt is hibátlanul beolvas. A példa programokat próbáltad futtatni vagy sajátot írtál?
    Talán ez elé a sor elé:

    Handle:=MediaInfo_New();
    be lehetne szúrni, hogy

    Handle:=0;
    Mert, lehet , hogy hibás azonosítót kap és ezért nem működik.
    Mutasd a teljes hozzászólást!
  • Szia!
    Azt hiszem rájöttem a hiba okára!
    A fájl megnyitás módja lehet az ok.
    Kétféle módon lehetséges.

    MediaInfo_Open(Handle,PWideChar(Fajlneve)); //Unicode
    vagy

    MediaInfoA_Open(Handle,PChar(Fajlneve)); //ANSI
    Mivel a példa program amit küldtem ANSI módot használ és nem működik valószínű
    az Unicode verzió lesz a jó.
    Ezt lehet ellenőrizni, mert a fájlmegnyitásnak van visszatérési értéke.
    0 esetén a fájl nem lett megnyitva, 1-nél viszont sikeres. Ezt pedig ellenőrizheted.
    Például:

    var hibakod : integer; begin . . . Handle:=MediaInfo_New; hibakod:=0; hibakod:=MediaInfo_Open(Handle,PWideChar(Fajlneve)); if hibakod=0 then begin MessageDlg('A fájl megnyitása Unicode módon sikertelen!',mtError, [mbOK], 0); hibakod:=MediaInfoA_Open(Handle,PChar(Fajlneve)); end; if hibakod=0 then begin MessageDlg('A fájl megnyitása ANSI módon sikertelen!',mtError, [mbOK], 0); exit; end; . . . end;


     Az unicode és ansi vonatkozik a lekérdezésekre is.
    Mutasd a teljes hozzászólást!
  • Szia!

    Köszönöm az ellenőrzést, kipróbáltam, és megnyitotta Unicode módban.
    Igazából az eredeti példaprogramból másoltam ki a kódot, azt próbálom futtatni, de még mindig csak az elsőt vizsgálja, a többit nem. Átküldöm hátha rájössz hogy mit rontok el.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ok! Megnézem
    Mutasd a teljes hozzászólást!
  • Ezt a részt vedd ki, és működni fog:

    To_Display := To_Display + CR + CR + 'Custom Inform' + CR; MediaInfo_Option (0, 'Inform', 'General;Example : FileSize=%FileSize%'); To_Display := To_Display + MediaInfo_Inform(Handle, 0); To_Display := To_Display + CR + CR + 'GetI with Stream=General and Parameter:=17' + CR; To_Display := To_Display + MediaInfo_GetI(Handle, Stream_General, 0, 17, Info_Text); To_Display := To_Display + CR + CR + 'Count_Get with StreamKind=Stream_Audio' + CR; To_Display := To_Display + format('%d', [MediaInfo_Count_Get(Handle, Stream_Audio, -1)]); To_Display := To_Display + CR + CR + 'Get with Stream:=General and Parameter=^AudioCount^' + CR; To_Display := To_Display + MediaInfo_Get(Handle, Stream_General, 0, 'AudioCount', Info_Text, Info_Name); To_Display := To_Display + CR + CR + 'Get with Stream:=Audio and Parameter=^StreamCount^' + CR; To_Display := To_Display + MediaInfo_Get(Handle, Stream_Audio, 0, 'StreamCount', Info_Text, Info_Name); To_Display := To_Display + CR + CR + 'Get with Stream:=General and Parameter=^FileSize^' + CR; To_Display := To_Display + MediaInfo_Get(Handle, Stream_General, 0, 'FileSize', Info_Text, Info_Name);
    Ez a rész az egyedi lekérdezéseket tartalmazza.
    Én a
    To_Display
    helyett így csinálnám:

    For i:=0 to sList.Count -1 do begin Handle := MediaInfo_New(); pw := StringToOleStr(slist[i]); // Konvertálás Memo1.Lines.Add(format('%d', [MediaInfo_Open(Handle, PWideChar(pw))])); // Mégegyszer ? Memo1.Lines.Add('Inform with Complete=false'); MediaInfo_Option (0, 'Complete', ''); // rövid verziós lekérdezés Memo1.Lines.Add(MediaInfo_Inform(Handle, 0)); Memo1.Lines.Add('Inform with Complete=true'); MediaInfo_Option (0, 'Complete', '1'); // bővebb verziós lekérdezés Memo1.Lines.Add(MediaInfo_Inform(Handle, 0)); Memo1.Lines.Add('********** Következő file *************'); MediaInfo_Close(Handle); pw:=''; tc:=''; end;
    Mutasd a teljes hozzászólást!
  • Szia!

    Ha tudnád mióta küzdök ezzel...

    Köszönöm!
    Mutasd a teljes hozzászólást!
  • Szívesen!
    Mutasd a teljes hozzászólást!
abcd