Hi zusamm
kurz: wie kann man den video-codec vom format avi auslesen? bei mir: Microsoft Video 1
thx für antwort
video codec für avi auslesen
-
- [ offen ]
-
AntiSpeed -
19. April 2010 um 14:51 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Das sollte helfen:
Spoiler anzeigen
ZitatAVI Header Format
AVI files contain a 56-byte header, starting at offset 32 within the file.
offset
size
description
0
4
time delay between frames in microseconds
4
4
data rate of AVI data
8
4
padding multiple size, typically 2048
12
4
parameter flags
16
4
number of video frames
20
4
number of preview frames
24
4
number of data streams (1 or 2)
28
4
suggested playback buffer size in bytes
32
4
width of video image in pixels
36
4
height of video image in pixels
40
4
time scale, typically 30
44
4
data rate (frame rate = data rate / time scale)
48
4
starting time, typically 0
52
4
size of AVI data chunk in time scale units
-
hmm wie komme ich den jetzt an die Header-Informationen?
-
-
- 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]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <FileConstants.au3>
#include <WinAPI.au3>$aHeader = _GetAviHeaderInfo('f:\test.avi')
[/autoit] [autoit][/autoit] [autoit]
If @error Then
ConsoleWrite('Error= ' & @error & @CR)
Else
_ArrayDisplay($aHeader)
EndIfFunc _GetAviHeaderInfo($sFilename)
[/autoit]
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
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?! -
irgentwie ist da ja "nur" der width die height und der sleep zwischen den frames, aber wie kann man den codec auslesen?
-
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). -
Oscar : Alle achtung super gemacht!!
thx für schnelle antworten