Seite 1 von 1

AVI-File-Info

Verfasst: 21.12.2005 01:17
von scholly
moin, moin...
Ich hab mich in den letzten Tagen durch jede Menge RIFF-/AVI-Doku gebissen und Dank einiger Unterstützung im Anfängerforum hab ich auch was zustandegebracht, das zumindest mit meinen Files das macht, was es soll. Ich werde den Code in einem anderen Projekt verwenden, denke aber, daß er vielleicht für andere, die ohne WinAPI OS-unabhängig an die Tags/Infos kommen wollen, hilfreich sein könnte.
Er ist bestimmt weder effizient noch elegant und cool ist daran eigentlich nur, daß es mein erstes PB-Proggi ist :D.
Aber erkönnte eben als Beispiel taugen und er funktioniert.
Ich hab keine Richtige HP, aber unter ..... gibts 2 Files zu holen:
- mic.zip = gezipter Source
- ugs_avi.avi = kleines AVI zum Testen der ganzen Tags und Infos.
[edit]
Sorry, Provider verkauft, Files auf Nachfrage.
[/edit]
Basiert hab ich das alles auf abcAVI, VfW.hlp, FourCC.org,diverse Doku zu RIFF/AVI und den damit gewonnenen Erkenntnissen.
Wers gebrauchen kann, möge es nehmen und zu friedlichen Zwecken verwenden ;)
bis denne...
scholly

Re: AVI-File-Info

Verfasst: 21.12.2005 13:37
von Kiffi
Mein lieber Scholly,

ich kann zwar mit Deinem Code (noch) nichts anfangen, weil ich (derzeit)
nichts mit AVI mache, aber dennoch hier mal ein 'Danke schön', dass Du
Dein Wissen der Community zur Verfügung stellst! :allright:

(ausserdem wollte ich schon immer mal diese Anrede verwenden ;-))

Grüße ... Kiffi

Verfasst: 21.12.2005 13:58
von inc.
Gruß von Köln nach Ddorf :wink:

http://www.purebasic-lounge.de/viewtopi ... streaminfo
Hatte ich da mal gepostet (nach einem Forumproblem wurden alte Threads von mir zu Starter="Torsten" umgemünzt).
Werde noch die Ausgabe von Audio-Info's mit einbinden.

Bin gerade eine Lib am erstellen, die die noch fehlenden Strukturen, Deklarationen und Konstanten der vfw.h für PB enthält.
WinMM wird ja bereits in PB unterstützt, jedoch (imho) noch nicht die API der avifil32.dll und msvfw32.dll, welche Bestandteil des vfw.h waren

Verfasst: 21.12.2005 16:48
von scholly
@Kiffi:
Ihr habt mir bei meinem Anfänger-Generve so schön gehelft, daß ich nicht widerstehen konnte.
ausserdem wollte ich schon immer mal diese Anrede verwenden
So kann man auch mit kleinen Sachen Kiffi eine Freude machen :lol:
inc. hat geschrieben:Gruß von Köln nach Ddorf :wink:
Oh, ein Mitstreiter aus unserem liebsten Vorort :mrgreen:
Danke für den Zaunpfahl, ich hab zwar die lounge rechts oben immer gesehen, aber nicht als Such-Ort erkannt. Da werd ich mich gleich doch maln bischen umsehen ;)
Bin gerade eine Lib am erstellen, die die noch fehlenden Strukturen, Deklarationen und Konstanten der vfw.h für PB enthält.
WinMM wird ja bereits in PB unterstützt, jedoch (imho) noch nicht die API der avifil32.dll und msvfw32.dll, welche Bestandteil des vfw.h waren
Ich bin zwar (wegen MacOS und Linux) gegen OS-Abhängigkeit (.dll), aber wenn Du jemanden brauchst, der sich durch RIFF/AVI halbwegs durchgebissen hat: scholly fragen kost nix :)

bis denne
scholly (mit kleinem "s")

Verfasst: 19.01.2006 17:46
von inc.
Sorry die späte Antwort, aber wenns um OS Unabhängigkeit geht, dann ....

Code: Alles auswählen

;-----------------------------------------------------------------------------------------------------
;- AVI-Header-Reader 1.0
;-----------------------------------------------------------------------------------------------------
;-
;-
;- simply streams an AVI for the header and reads out it's data
;- REQUESTS a filename and an empty MainAVIHeader-structure to be filled
;- RETURN #True if all is OK, or #False if not
;-
;- see the comments and the example on how to interpretate the data
;-
;- by Froggerprogger 02.06.04
;-
#File_Temp = 0

Structure MainAVIHeader
  dwMicroSecPerFrame.l ; use this to calculate the AVIs framerate (fps = 1.000.000 / dwMicroSecPerFrame)
  dwMaxBytesPerSec.l
  dwReserved1.l
  dwFlags.l
  dwTotalFrames.l ; use this one to calculate the film's length (secs = dwTotalFrames / fps)
  dwInitialFrames.l
  dwStreams.l
  dwSuggestedBufferSize.l
  dwWidth.l
  dwHeight.l
  dwScale.l
  dwRate.l  ; a lot of AVIs let this value at 0, so use dwMicroSecPerFrame instead
  dwStart.l ; this is also set to 0 very often
  dwLength.l ; this is also set to 0 very often
EndStructure

Procedure.l GetAVIHeaderInformation(p_filename.s, *p_struct.MainAVIHeader)
  Protected tempL.l
  If ReadFile(#File_Temp, p_filename) ; open the file
   
    If ReadLong() <> 'FFIR'   ; "RIFF" ?
      ProcedureReturn #False
    EndIf
    ReadLong()                ; (not interesting) size of RIFF-chunk
    If ReadLong() <> ' IVA'   ; "AVI " ?
      ProcedureReturn #False
    EndIf
   
    Repeat
      tempL = ReadLong() ; read in the actual Long-value (4 Bytes)
      FileSeek(Loc()-3) ; go back 3 Bytes, because perhaps "avih" isn't 4-Byte-aligned
    Until Eof(#File_Temp) Or tempL = 'hiva' ; "avih" ?
   
    If tempL = 'hiva'
      FileSeek(Loc() + 7) ; go on 3 because the above and further 4 because of the not intersting chunksize
      ReadData(*p_struct, SizeOf(MainAVIHeader)) ; copy the whole header
      CloseFile(#File_Temp)
      ProcedureReturn #True
    Else
      CloseFile(#File_Temp)
      ProcedureReturn #False
    EndIf

  Else
    ProcedureReturn #False
  EndIf
EndProcedure


;- an example
myAVI_Data.MainAVIHeader

filename.s = OpenFileRequester("Choose an AVI:", "G:\Videos", "*.avi|*.avi", 0)
If filename <> ""
  If GetAVIHeaderInformation(filename, @myAVI_Data) = #False
    MessageRequester("AVI-Header-Reader:", "Error during GetAVIHeaderInformation!", #MB_ICONERROR)
  Else
    result.s = filename + ":" + Chr(13) + Chr(10)
    result + "(W/H)  " +  Str(myAVI_Data\dwWidth) + " / " + Str(myAVI_Data\dwHeight) + Chr(13) + Chr(10)
    result + StrF(1000000.0 / myAVI_Data\dwMicroSecPerFrame, 2) + " fps" + Chr(13) + Chr(10)
    result + Str(myAVI_Data\dwTotalFrames) + " frames total" + Chr(13) + Chr(10)
    MessageRequester("AVI-Header-Reader:", result, #MB_ICONINFORMATION)
  EndIf
EndIf 

Verfasst: 19.01.2006 18:27
von scholly
inc. hat geschrieben:Sorry die späte Antwort, aber wenns um OS Unabhängigkeit geht, dann ....
... geb ich mich trotzdem nicht mit <20% der potentiellen Infos aus einem AVI zufrieden. :mrgreen:
Der Code ließt ja nur den MainAVIHeader und nichts anderes. Da kannste mit meinem o.g. "mic" aber wesentlich mehr Infos aus nem AVI rausholen, besonders, wenn es noch RIFF-INFO-Tags beinhaltet.
bis denne...
scholly

Verfasst: 05.02.2006 02:12
von scholly
moin, moin...
Ich hab den Code auf PB4.00Beta1 angepaßt und statt ins Debuggerfenster geht die Ausgabe jetzt in einen Listview.
[edit]
Sorry, Provider verkauft, Files auf Nachfrage.
[/edit]
bis denne...
scholly

Verfasst: 06.02.2006 09:44
von dige