RIFF-INFO-Chunks mit API lesen/schreiben?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die sind "http://pbs.de.gg/PB$4.20%5EStable@T.gif" und nix von "nordgoetter.de",
und außerdem wurden die schon komplett angezeigt als ich immer noch die zeigersanduhr hatte...

... und heute tritt es nicht auf... wasn schmarrn
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Dann kann mir vielleicht jetzt jemand zum Thema weiterhelfen?

Wenn ich das im Eingangspost genannte Dokument richtig verstehe, muß ich
zum lesen/schreiben der RIFF-Tags das AVI-File über die AVIFILE-Funktionen
initiieren, öffnen, bearbeiten, schließen und "exiten" ;)

Hab ich versucht, aber schon bei STDAPI_(VOID) AVIFileInit(VOID);
mach ich wohl mit der PB-Übersetzung AVIFileInit_(); laufe ich auf.

Was mach ich flasch?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ich hab vor langer Zeit mal ein Snippet zusammengeschraubt was den RIFF Header von .WAV Dateien ausliest um deren Länge zu bestimmen. Sollte sich auf AVI Dateien übertragen lassen. Naja, vielleicht hilfts ja ...

Code: Alles auswählen

Define lpck.MMCKINFO, wfmt.WAVEFORMATEX

If InitSound() = 0
	MessageRequester("Error","DirectX 7 isn't available or no sound card present.",16) : End
EndIf

Filename$ = OpenFileRequester("","","WAVE Files (*.wav)|*.wav",0)

If Filename$
	HMMIO = mmioOpen_(Filename$,0,#MMIO_READ)
	
	; FILE FORMAT
	lpck\fccType = mmioStringToFOURCC_("WAVE",0)
	
	Result = mmioDescend_(HMMIO,lpck,0,#MMIO_FINDRIFF)
	
	If Result <> #MMSYSERR_NOERROR
		MessageRequester("Error","Not a wave file!",16) : End
	EndIf
	
	; READ FORMAT CHUNK
	lpck\ckid = mmioStringToFOURCC_("fmt",0)
	
	Result = mmioDescend_(HMMIO,lpck,lpck,#MMIO_FINDCHUNK)
	
	If Result <> #MMSYSERR_NOERROR      
		MessageRequester("Error","Couldn't get format chunk!",16) : End  	
	EndIf
	
	; READ COMPRESSION TYPE
	mmioRead_(HMMIO,wfmt,lpck\ckSize)
	
	If wfmt\wFormatTag ! #WAVE_FORMAT_PCM
		MessageRequester("Error","Compressed wave files aren't supported!",16) : End	
	EndIf
	
	; READ DATA CHUNK
	lpck\ckid = mmioStringToFOURCC_("data",0)
	
	Result = mmioDescend_(HMMIO,lpck,lpck,#MMIO_FINDCHUNK)    
	
	If Result <> #MMSYSERR_NOERROR
		MessageRequester("Error","Couldn't get data chunk!",16) : End	
	EndIf	
	
	; CALCULATE SOUND LENGTH
	Duration = lpck\ckSize / wfmt\nAvgBytesPerSec
	
	Hours = Duration / 3600
	Minutes = (Duration / 60) - (60 * Hours)
	Seconds = Duration - (60 * (Duration / 60))
	Millisecs = Int(lpck\ckSize / (wfmt\nAvgBytesPerSec / 1000))
	
	Hours$ = Str(Hours) : Minutes$ = Str(Minutes) : Seconds$ = Str(Seconds)
	
	If Seconds < 10 : Seconds$ = "0" + Seconds$ : EndIf
	If Minutes < 10 : Minutes$ = "0" + Minutes$ : EndIf
	If Hours   < 10 : Hours$   = "0" + Hours$   : EndIf
	
	Time$ = Hours$ + ":" + Minutes$ + ":" + Seconds$	
	
	mmioClose_(HMMIO,0)
	
	; DEBUG INFO
	Debug "Soundfile = " + Filename$
	Debug "Duration = " + Str(Millisecs) + " Ms"
	Debug "Time Format = " + Time$ + " (H:M:S)"
EndIf
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Fluid Byte hat geschrieben:Sollte sich auf AVI Dateien übertragen lassen. Naja, vielleicht hilfts ja ...
:allright: , hat mir den Einstieg erleichtert, auch wenns ein arges Hauen und Stechen für mich war:

Code: Alles auswählen

EnableExplicit

Define HMMIO.l
Define Result.l
Define raushier.l

Define main_lpck.MMCKINFO
Define info_lpck.MMCKINFO
Define Itag_lpck.MMCKINFO

Define Itag_buff.s =Space(1024)

Define filename.s

Filename = OpenFileRequester("","","AVI Files (*.avi)|*.avi",0)

If Filename
  HMMIO = mmioOpen_(Filename,0,#MMIO_READ)
   
  ; check FILE FORMAT
  main_lpck\fccType = mmioStringToFOURCC_("AVI ",#MMIO_TOUPPER)
   
  Result = mmioDescend_(HMMIO,main_lpck,0,#MMIO_FINDRIFF)
   
  If Result <> #MMSYSERR_NOERROR
    Debug "Error:  Not an AVI file!" : End
  EndIf
   
  ; find the LIST named INFO 
  info_lpck\fccType= mmioStringToFOURCC_("INFO",#MMIO_TOUPPER)  
  Result = mmioDescend_(HMMIO,info_lpck,0,#MMIO_FINDLIST)
   
  If Result <> #MMSYSERR_NOERROR     
    Debug "Error:  Couldn't get the LIST named INFO!" :End
  EndIf
   
  Debug "---here we start exploring RIFF-Tags and Extended Information Tags---" 

  ; find all existing tag-chunks
  raushier = #False
  Repeat 

    Itag_lpck\ckid        =0
    Itag_lpck\cksize      =0
    Itag_lpck\fccType     =0
    Itag_lpck\dwDataOffset=0
    Itag_lpck\dwFlags     =0

    result = mmioDescend_(HMMIO,Itag_lpck,info_lpck,#MMIO_FINDCHUNK)
   
    If (result <> #MMSYSERR_NOERROR) Or  Itag_lpck\ckid = mmioStringToFOURCC_("JUNK",#MMIO_TOUPPER)
      raushier = #True
    Else
      result = mmioRead_(HMMIO,Itag_buff,Itag_lpck\ckSize)
      Debug PeekS(@Itag_lpck\ckid,4) +":   "+Itag_buff
    EndIf
   
  Until raushier = #True
  Debug "---finished exploring RIFF-Tags and Extended Information Tags---" 
  mmioClose_(HMMIO,0)
   
EndIf
Allerdings such ich nun schon fast 2 Stunden nach nem Source, aus dem ich das Verändern und Hinzufügen von Tags lernen kann.

Irgendwelche Vorschläge?
Zuletzt geändert von scholly am 28.10.2008 00:20, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Welche Infos willst du denn eigentlich?
Das MMIO System ist sehr veraltet und Dateien über 2GB bzw. 4GB können nicht verarbeitet werden (z.B. Captures).

Nimm für sowas AVIFILEINFO oder AVISTREAMINFO aus der M$ VFW Library oder via Directshow oooder am besten via LibavFormat, sprich MediaInfo Dll, und da meine ich hast du dich ja auch schon mit beschäftigt.
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

inc. hat geschrieben:Welche Infos willst du denn eigentlich?
Ich will an die RIFF-INFO-Tags ran. Lesen und schreiben. Das sind Meta-Daten (ähnlich ID3v2-Tags), zu finden in LIST INFO.
Das MMIO System ist sehr veraltet und Dateien über 2GB bzw. 4GB können nicht verarbeitet werden (z.B. Captures).
Diese Info ist neu für mich, hab ich bisher noch nicht auf MSDN in Zusammenhang mit den Resource Interchange File Format Services gefunden :o
Nimm für sowas AVIFILEINFO oder AVISTREAMINFO aus der M$ VFW Library oder via Directshow oooder am besten via LibavFormat, sprich MediaInfo Dll, und da meine ich hast du dich ja auch schon mit beschäftigt.
Bei AVIFILEINFO oder AVISTREAMINFO sehe ich keine Möglichkeit, an die Tags heranzukommen.
Auf Directshow und LibavFormat bin ich bei meinen Suchen in Zusammenhang mit diesen Tags noch nicht gestoßen.
(Wie) Sollte man die Tags damit lesen und schreiben können? AFAIK geht es da doch jeweils nur um die AV-Codecs.
---
Bei MediaInfo.dll steht Schreiben noch in weiter Ferne.
Bei abcAVI.dll steh ich auf verlorenem Posten, da komm ich allein auch nich mit weiter:http://www.purebasic.fr/german/viewtopic.php?t=17641.
---
MediaInfo (GUI/CLI) kann entsprechend b.a.w. auch nicht schreiben.
abcAVI bietet nur Tags an, die dem Autor damals bekannt/sinnvoll waren.
MMAviInf schreibt nur die Tags, die es selber kennt und reicht ihm unbekannte nicht durch.

Mehr Möglichkeiten, an diese Tags heranzukommen hab ich bisher nich gefindet.

Nach diesen Erkenntnissen bin ich zu dem Entschluß gekommen, es selber mit PB zu versuchen, aber wie schon so oft, steh ich irgendwann vor ner Wand und find den Durchgang nich. :(
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten