video codec für avi auslesen

    • Offizieller Beitrag

    Das sollte helfen:

    Spoiler anzeigen
  • meine datei-header:
    wie kann ich denn jetzt das rausbekomen...

    Code
    RIFFP4¢AVI LISTÀ   hdrlavih8   Ð  0À 	  .   		0 V                 	LISTt   strlstrh8   vidsMSVC        	      	.	0 '      	V strf(   (   V        	0             	JUNK

    Nur keine Hektik - das Leben ist stressig genug

    • Offizieller Beitrag

    - Datei binär einlesen
    - Offset 32, also mit einer Verschiebung von 32 Zeichen beginnt die Codec-Info (i.A. steht direkt vor der Info 'vid' o.ä.)
    - die nächsten Bytes enthalten die CodecInfo
    - beachten bei Größenangabe: wenn -1, Zahlenwert +256 wegen Speicherübertrag

    • Offizieller Beitrag

    Es hatte mich gerade mal interessiert, deshalb habe ich eine kleine Funktion geschrieben:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <FileConstants.au3>
    #include <WinAPI.au3>

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

    $aHeader = _GetAviHeaderInfo('f:\test.avi')
    If @error Then
    ConsoleWrite('Error= ' & @error & @CR)
    Else
    _ArrayDisplay($aHeader)
    EndIf

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

    Func _GetAviHeaderInfo($sFilename)
    Local $hFile, $tBuffer
    Local $aHeader[14][2] = [['time delay between frames in microseconds', ''], _
    ['data rate of AVI data', ''],['padding multiple size, typically 2048', ''], _
    ['parameter flags', ''],['number of video frames', ''], _
    ['number of preview frames', ''],['number of data streams (1 or 2)', ''], _
    ['suggested playback buffer size in bytes', ''],['width of video image in pixels', ''], _
    ['height of video image in pixels', ''],['time scale, typically 30', ''], _
    ['data rate (frame rate = data rate / time scale)', ''], _
    ['starting time, typically 0', ''],['size of AVI data chunk in time scale units', '']]
    If Not FileExists($sFilename) Then Return SetError(1, 0, 0)
    $hFile = FileOpen($sFilename, 16)
    If $hFile = -1 Then Return SetError(2, 0, 0)
    FileSetPos($hFile, 32, $FILE_BEGIN)
    For $i = 0 To 13
    $tBuffer = FileRead($hFile, 4)
    $aHeader[$i][1] = Dec(Hex(_WinAPI_HiWord($tBuffer), 4) & Hex(_WinAPI_LoWord($tBuffer), 4))
    Next
    FileClose($hFile)
    Return $aHeader
    EndFunc ;==>_GetAviHeaderInfo

    [/autoit]


    Ab Offset 32 stehen aber vor allem statistische Werte (Anzahl der Frames, Zeit zwischen zwei Frames, horizontale und vertikale Auflösung, usw.)
    Bei vielen meiner AVIs sind manche Werte auch mit Null belegt?! ?(

  • avi ist nur ein Container, darin können sich unterschiedliche Quellen befinden und somit gibts auch unterschiedliche Decoder.
    Wie man Infos über das Directshowsystem kriegen kann würde mich allerdings auch interessieren.

    • Offizieller Beitrag

    So, hier jetzt eine Funktion, die brauchbarere Informationen ausgibt. Unter anderem auch den Codec sowie Informationen über den Codec.
    Dafür wird außer dem Script noch die Datei "AVI-Codecs.txt" im Scriptverzeichnis benötigt. Das Script sowie die Textdatei befinden sich im ZIP-Archiv (Anhang).