Video Codec auslesen


  • Danke, aber das habe ich sicher nie bei Google erhalten ... das habe einfach nicht gesucht, bzw. wusste nicht dass ich das suchen sollte ... Google ist nur ein Freund, wenn man genau weiß, was man sucht ;)
    Seis drum ... danke :thumbup:

    Ich habe mal mit dem dort geposteten Skript zur DLL gespielt, ich bekomme die Informationen, die ich eigentlich will .. aber nicht in der Form, in der ich diese brauche!
    Ich bekomme immer nur diesen Formatierten String raus ... und daraus die Daten zu gewinnen ist schwierig ... kannst du mir helfen, so dass ich entweder direkt einen benutzerdefinierten String ala csv erhalte oder besser noch direkt ein 2-Dim Array!?

  • Ich komm mit der DLL wirklich nicht zurecht ... habe bisher noch nie mit DLLs gearbeitet ... finde keine Einstellungen, dass es mir die Daten anständig ausgibt!
    Müsste doch aber gehen!? :(

    Du musst halt mal die Dokumentation von mediainfo lesen. Hier mal ein Beispiel, dass dir alle verfügbaren Mediainfo Parameter in eine Datei ausgibt:

    [autoit]


    #include <file.au3>
    ;Loading the DLL
    $DLL=DllOpen("MediaInfo.dll")

    [/autoit][autoit][/autoit][autoit]

    ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ; General info
    ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    [/autoit][autoit][/autoit][autoit]

    ;Info
    $Info_Parameters=DllCall($DLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Info_Parameters", "wstr", "")
    MsgBox(0, "MediaInfo_Option - Info_Parameters", $Info_Parameters[0])
    _FileCreate(@ScriptDir & "\params.txt")
    _FileWriteToLine(@ScriptDir & "\params.txt",1,$Info_Parameters[0],1)

    [/autoit]

    Im Verzeichnis Examples des DLL Pakets findes du ja bereits ein Anwendungsbeispiel für Autoit mit einigen verschiedenen Ausgaben. Mediainfo kann dir sehr viele Dinge in den unterschiedlichsten Formaten ausgeben, dazu einfach schaun was es gibt und ausprobieren welche Ausgabe dir am meisten zusagt. Es ist jedenfalls möglich jede Information einzeln abzurufen. Das ganze dann in Arrays zu speichern oder in Dateien zu schreiben ist ein anderes Thema, dazu solltest du dich vielleicht zunächt mal mit Arrays auseinandersetzen und dir entsprechende Tutorials anschaun.

  • So, nach 11 Monaten bin ich wieder voll am Projekt ... nur mit den DLL-Aufrufen hapert es noch :(

    Ich habe mal alle Parameter auswerten lassen:

    Alle Parameter auswerten lassen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    local $komplette_liste ; Liste aller möglichen Parameter, aus csv

    [/autoit] [autoit][/autoit] [autoit]

    $Handle = DllCall($hDLL, "ptr", "MediaInfo_New") ; New MediaInfo handle
    $Open_Result = DllCall($hDLL, "int", "MediaInfo_Open", "ptr", $Handle[0], "wstr", $datei)

    [/autoit] [autoit][/autoit] [autoit]

    for $x=0 to UBound($komplette_liste, 1)-1
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Get", "ptr", $Handle[0], "int", 0, "int", 0, "wstr", $komplette_liste[$x][0], "int", 1, "int", 0)
    if @error then MsgBox(0, default, "Fehler!")
    $komplette_liste[$x][1] = $tmp_info[0]
    next

    [/autoit] [autoit][/autoit] [autoit]

    $Handle=DllCall($hDLL, "none", "MediaInfo_Delete", "ptr", $Handle[0])

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($info, "Alle Datei-Infos!")

    [/autoit]

    ... aber nur ein Bruchteil davon gibt ein Ergebnis aus!

    Ich verstehe das ganze um die DLL()-Fkt. nicht!
    Der erste Parameter ist klar, der zweite ist das Ausgabeformat, das dritte verstehe ich schon nicht, wann kommt MediaInfo_Inform, MediaInfo_Option, MediaInfoList_Count_Get_Files, MediaInfo_Get oder MediaInfo_GetI?
    Das finde ich nirgends wo!

    Der vierte und fünfte Parameter ist die zu untersuchende Datei ... der sechste bis neunte machen für mich wieder keinen Sinn, genauso wie der zwölfte bis fünfzehnte.
    Der elfte Parameter ist idR. das was ich bestimmen möchte, nur klappt das nicht immer ... :huh:

    Er echt cool, wenn mir da jemand weiterhelfen könnte! ^^


    Nachtrag:
    Ich habe jetzt eine andere Funktion aus den Beispielen gepickt und die so umgeformt, dass sie jetzt alles ausgeben kann:

    Alle Parameter auswerten lassen - die 2te
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    local $komplette_liste ; Liste aller möglichen Parameter, aus csv
    ; nun mit $daten_typ: General, Video, Audio, usw.

    [/autoit] [autoit][/autoit] [autoit]

    $Handle = DllCall($hDLL, "ptr", "MediaInfo_New") ; New MediaInfo handle
    $Open_Result = DllCall($hDLL, "int", "MediaInfo_Open", "ptr", $Handle[0], "wstr", $datei)

    [/autoit] [autoit][/autoit] [autoit]

    for $x=0 to UBound($komplette_liste, 1)-1
    DllCall($hDLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Inform", "wstr", $daten_typ & ";%" & $komplette_liste[$x][0] & "%")
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Inform", "ptr", $Handle[0], "int", 0)
    if @error then MsgBox(0, default, "Fehler!")
    $komplette_liste[$x][1] = $tmp_info[0]
    next

    [/autoit] [autoit][/autoit] [autoit]

    $Handle=DllCall($hDLL, "none", "MediaInfo_Delete", "ptr", $Handle[0])

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($info, "Alle Datei-Infos!")

    [/autoit]

    So komme ich nun an alle Informationen, die ich will!
    (Die "komplette Liste" mit allen 934 Parametern laufen hier nur zu Testzwecken durch, später benutze ich selbstverständlich nur noch die benötigten!)

    Sieht aber nicht als ob das so gedacht war ... wenn jemand weiß, wie man das besser machen kann, dann nur her damit ;)


    Neues Problem:
    Wenn das Video mehrere Audio- oder Untertitel- Spuren besitzt, dann werden die Informationen dazu in ein String geschrieben:

    Code
    BitRate/String: 640 Kbps640 Kbps
    Language/String: GermanEnglish


    Wie bekomme ich die Informationen für jede einzelne Spur getrennt?

  • Neues Problem:
    Wenn das Video mehrere Audio- oder Untertitel- Spuren besitzt, dann werden die Informationen dazu in ein String geschrieben:

    Code
    BitRate/String: 640 Kbps640 Kbps
    Language/String: GermanEnglish


    Wie bekomme ich die Informationen für jede einzelne Spur getrennt?


    Soweit ich weiß geht das per dll bzw cli nicht nativ. Ich hab das bei mir so gefriemelt, dass ich per %StreamCount% für Video und %AudioCount% für Audio schaue wieviele Streams ein Video hat und dann Strings entsprechend wenn möglich halbiere / drittele etc und oder die als String (%BitRate/String%) ausgegebenen Bitraten ebenfalls aufspalte, zb per StringSplit() usw.

    Mit der Sache sollte man aber vielleicht mal an die Entwickler rantreten.

  • ... Ich hab das bei mir so gefriemelt, dass ich per %StreamCount% für Video und %AudioCount% für Audio schaue wieviele Streams ein Video hat und dann Strings entsprechend wenn möglich halbiere / drittele etc und oder die als String (%BitRate/String%) ausgegebenen Bitraten ebenfalls aufspalte, zb per StringSplit() usw.

    Wenn man den String nicht Symmetrisch Teilen kann, hat man halt Probleme.
    Aus den den Audiosprachen für 2 Tonspuren "germanenglisch" wird dann getrennt "germane" und "nglisch" ...

    Ich habe noch ein bisschen mit der DLL#Fkt. herum gespielt ... try and error ... so wie man es lernt, wie man es nicht machen soll :whistling:
    Auf jeden Fall habe ich es jetzt so gelöst:

    [autoit]

    ; StreamIDs herausfinden
    local $daten_typ[4][3] = [["General",0],["Video",1],["Audio",2],["Text",3]]
    for $n=0 to 3
    DllCall($hDLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Inform", "wstr", $daten_typ[$n][0] & ";%StreamCount%")
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Inform", "ptr", $Handle[0], "int", 0)
    $SteamID = StringLeft($tmp_info[0], 1) ; bei Mehrfachnennungen nur die erste Zahl, geht nur bis 9 Streams!
    next

    [/autoit][autoit][/autoit][autoit]

    ; ...

    [/autoit][autoit][/autoit][autoit]

    ; $StreamKind : General, Video, Audio oder Text ID .. also 0,1,2,3 oder 4
    ; $SteamID : Beginnent bei 0 ... wenn es 2 Tonspuren gibt, dann gibt es bei Audio: 1,2
    ; $Parameter : Was man für Info raus bekommen möchte
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Get", "ptr", $Handle[0], "int", $StreamKind, "int", $SteamID, "wstr", $Parameter, "int", 1, "int", 0)

    [/autoit]


    Ich frage zuerst ab, wie viele Stream es je Typ gibt und dann kann man die gezielte Info abrufen!