Seite 1 von 1

Wie Key Frames in Videos erkennen ?

Verfasst: 30.05.2007 21:05
von Captn. Jinguji
In den Movie-Befehlen von PB scheint nichts vorhanden zu sein (allerdings war ich schon überrascht, was da ansonsten alles Nettes für'n Anfang schon vorhanden ist) um Key Frames zu erkennen.
In der Hilfe und mit der Suchfunktion habe ich nichts gefunden, auf purearea auch net.
Gibt's eine einfach zu benutzende lib für diesen Zweck (die am besten auch noch freeware ist)?

Merci schonmal im Voraus.

Verfasst: 31.05.2007 09:03
von DarkDragon
Mit der avifil32.dll in deinem Systemverzeichnis geht das zumindest für AVI Dateien. Ich habe vor kurzem auch damit angefangen ein kleines Program zum skalieren von Videostream-Bildern zu machen. Es funktioniert bisher ganz gut. Nur gibts noch keine Komprimierung. Leider gottes hat man die avifil32.dll so verwurschtelt, dass ich erst 3 weitere Streams erstellen muss um letztendlich 2 von denen wieder zu löschen.

Aber hier mal die Imports:

Code: Alles auswählen

Structure WAVEFORMATEX
  wFormatTag.w
  nChannels.w
  nSamplesPerSec.l
  nAvgBytesPerSec.l
  nBlockAlign.w
  wBitsPerSample.w
  cbSize.w
EndStructure

Structure AVISTREAMINFO
  fccType.l
  fccHandler.l
  dwFlags.l
  dwCaps.l
  wPriority.w
  wLanguage.w
  dwScale.l
  dwRate.l
  dwStart.l
  dwLength.l
  dwInitialFrames.l
  dwSuggestedBufferSize.l
  dwQuality.l
  dwSampleSize.l
  rcFrame.RECT
  dwEditCount.l
  dwFormatChangeCount.l
  szName.c[64]
EndStructure

Structure AVIFILEINFO
  dwMaxBytesPerSec.l
  dwFlags.l
  dwCaps.l
  dwStreams.l
  dwSuggestedBufferSize.l
  dwWidth.l
  dwHeight.l
  dwScale.l
  dwRate.l
  dwLength.l
  dwEditCount.l
  szFileType.c[64]
EndStructure

Structure AVICOMPRESSOPTIONS
  fccType.l
  fccHandler.l
  dwKeyFrameEvery.l
  dwQuality.l
  dwBytesPerSecond.l
  dwFlags.l
  *lpFormat
  cbFormat.l
  *lpParms
  cbParms.l
  dwInterleaveEvery.l
EndStructure

Macro MAKEFOURCC(ch0, ch1, ch2, ch3)
  (ch0 | (ch1 << 8)) | (ch2 << 16) | (ch3 << 24)
EndMacro

Macro mmioFOURCC(ch0, ch1, ch2, ch3)
  MAKEFOURCC(ch0, ch1, ch2, ch3)
EndMacro

#streamtypeVIDEO = 1935960438
#streamtypeAUDIO = 1935963489
#streamtypeMIDI  = 1935960429
#streamtypeTEXT  = 1937012852

#AVIIF_KEYFRAME  = $10

#AVISTREAMREAD_CONVENIENT = -1

#ICMF_CHOOSE_KEYFRAME       = $01
#ICMF_CHOOSE_DATARATE       = $02
#ICMF_CHOOSE_PREVIEW        = $04
#ICMF_CHOOSE_ALLCOMPRESSORS = $08

Import "avifil32.lib"
  AVIBuildFilter(lpszFilter.p-unicode, cbFilter.l, fSaving.l) As "_AVIBuildFilterW@12"
  AVIClearClipboard()
  AVIFileAddRef(pfile.l)
  AVIFileCreateStream(pfile.l, ppavi.l, *psi.AVISTREAMINFO) As "_AVIFileCreateStreamW@12"
  AVIFileEndRecord()
  AVIFileExit()
  AVIFileGetStream(pfile.l, *pavi.IAVIStream, fccType.l, lParam.l)
  AVIFileInfo(pfile.l, *pfi.AVIFileInfo, lSize.l) As "_AVIFileInfoW@12"
  AVIFileInit()
  AVIFileOpen(*ppfile.l, szFile.p-unicode, uMode.l, lpHandler.l) As "_AVIFileOpenW@16"
  AVIFileReadData(pfile.l, ckid.l, lpData.l, *lpcbData.l)
  AVIFileRelease(pfile.l)
  AVIFileWriteData(pfile.l, ckid.l, lpData.l, cbData.l)
  AVIGetFromClipboard(*lppf.l)
  AVIMakeCompressedStream(ppsCompressed.l, ppsSource.l, *lpOptions.AVICOMPRESSOPTIONS, *pclsidHandler.l)
  AVIMakeFileFromStreams(*ppfile.l, nStreams.l, papStreams.l)
  AVIMakeStreamFromClipboard(cfFormat.l, hGlobal.l, ppstream.l)
  AVIPutFileOnClipboard(pf.l)
  AVISave(szFile.p-unicode, *pclsidHandler.l, lpfnCallback.l, nStreams.l, pfile.l, *lpOptions.AVICOMPRESSOPTIONS, OptionalArguments.l) As "_AVISaveW"
  AVISaveOptions(hwnd.l, uiFlags.l, nStreams.l, ppavi.l, *plpOptions.AVICOMPRESSOPTIONS)
  AVISaveOptionsFree(nStreams.l, *plpOptions.AVICOMPRESSOPTIONS)
  AVISaveV(szFile.p-unicode, *pclsidHandler.l, lpfnCallback.l, nStreams.l, ppavi.l, *plpOptions.AVICOMPRESSOPTIONS) As "AVISaveVW@24"
  AVIStreamAddRef(pavi.l)
  AVIStreamBeginStreaming(pavi.l, lStart.l, lEnd.l, lRate.l)
  AVIStreamCreate(ppavi.l, lParam1.l, lParam2.l, *pclsidHandler.l)
  AVIStreamEndStreaming(pavi.l)
  AVIStreamFindSample(pavi.l, lPos.l, lFlags.l)
  AVIStreamGetFrame(pg.l, lPos.l)
  AVIStreamGetFrameClose(pg.l)
  AVIStreamGetFrameOpen(pavi.l, *lpbiWanted.BITMAPINFOHEADER)
  AVIStreamInfo(pavi.l, *psi.AVISTREAMINFO, lSize.l) As "_AVIStreamInfoW@12"
  AVIStreamLength(pavi.l)
  AVIStreamOpenFromFile(ppavi.l, szFile.p-unicode, fccType.l, lParam.l, mode.l, *pclsidHandler.l) As "_AVIStreamOpenFromFileW@24"
  AVIStreamRead(pavi.l, lStart.l, lSamples.l, lpBuffer.l, cbBuffer.l, *plBytes.l, *plSamples.l)
  AVIStreamReadData(pavi.l, fcc.l, lp.l, *lpcb.l)
  AVIStreamReadFormat(pavi.l, lPos.l, lpFormat.l, *lpcbFormat.l)
  AVIStreamRelease(pavi.l)
  AVIStreamSampleToTime(pavi.l, lSample.l)
  AVIStreamSetFormat(pavi.l, lPos.l, lpFormat.l, cbFormat.l)
  AVIStreamStart(pavi.l)
  AVIStreamTimeToSample(pavi.l, lTime.l)
  AVIStreamWrite(pavi.l, lStart.l, lSamples.l, lpBuffer.l, cbBuffer.l, dwFlags.l, *plSampWritten.l, *plBytesWritten.l)
  AVIStreamWriteData(pavi.l, fcc.l, lp.l, cb.l)
  CreateEditableStream(ppsEditable.l, psSource.l)
  EditStreamClone(pavi.l, ppResult.l)
  EditStreamCopy(pavi.l, *plStart.l, *plLength.l, ppResult.l)
  EditStreamCut(pavi.l, *plStart.l, *plLength.l, ppResult.l)
  EditStreamPaste(pavi.l, *plPos.l, *plLength.l, pstream.l, lStart.l, lEnd.l)
  EditStreamSetInfo(pavi.l, *lpInfo.AVISTREAMINFO, cbInfo.l) As "_EditStreamSetInfoW@12"
  EditStreamSetName(pavi.l, lpszName.p-unicode) As "_EditStreamSetNameW@8"
EndImport
Ich weiß nicht ob alle funktionieren, da PureBasic das erst ausspuckt wenn man auch alle in seinem code benutzt. Falls nicht bitte ich um Rückmeldung.

Verfasst: 31.05.2007 10:14
von dige
Kann man mit dem vfw modell auch meta infos aus dem avi stream ziehen?
Oder geht das nur über wdm? Und wenn ja, wie?

Verfasst: 31.05.2007 19:15
von Captn. Jinguji
DarkDragon hat geschrieben:Mit der avifil32.dll in deinem Systemverzeichnis geht das zumindest für AVI Dateien. Ich habe vor kurzem auch damit angefangen ein kleines Program zum skalieren von Videostream-Bildern zu machen. Es funktioniert bisher ganz gut. Nur gibts noch keine Komprimierung. Leider gottes hat man die avifil32.dll so verwurschtelt, dass ich erst 3 weitere Streams erstellen muss um letztendlich 2 von denen wieder zu löschen.

Aber hier mal die Imports:

Code: Alles auswählen

Structure WAVEFORMATEX
.
.
.
EndImport
Ich weiß nicht ob alle funktionieren, da PureBasic das erst ausspuckt wenn man auch alle in seinem code benutzt. Falls nicht bitte ich um Rückmeldung.
Hallo, DarkDragon.
Vielen herzlichen Dank - und sorry, auf das MS SDK hätte ich aber auch wirklich selbst kommen müssen. Hast Du zufällig auch noch eine Literaturempfehlung zu dem Thema ? Das Lesen der Online-SDK Doku ist ja nicht so das Wahre, und eine solide Buchgrundlage kann nie schaden, finde ich. Ein kurzer Scan bei Amazon hat mich zu diesem
http://www.amazon.de/Audio-Video-Grafik ... 727&sr=8-2 geführt, ich kann mich aber nicht recht entscheiden.

Achja: und noch "Dank 2" für die Imports.

Verfasst: 31.05.2007 19:41
von DarkDragon
dige hat geschrieben:Kann man mit dem vfw modell auch meta infos aus dem avi stream ziehen?
Oder geht das nur über wdm? Und wenn ja, wie?
Komisch, stimmt :? ? Ich blick das nicht: Zum schreiben haben die die Funktionen und zum lesen nicht?! :freak: Komisches System nachdem das aufgebaut ist. Ich hätte schwören können irgendwo eine Lese Funktion gesehen zu haben.

@Captn. Jinguji: Entschuldigung, war wohl keine sehr große Hilfe. Vielleicht hilft es dir aber was wenn du mal nach "WDM" suchst (dige hat das ja so gläubig in den Raum geworfen :-) ).

Verfasst: 31.05.2007 20:26
von Captn. Jinguji
DarkDragon hat geschrieben:@Captn. Jinguji: Entschuldigung, war wohl keine sehr große Hilfe. Vielleicht hilft es dir aber was wenn du mal nach "WDM" suchst (dige hat das ja so gläubig in den Raum geworfen :-) ).
Doch doch, eigentlich war das - für den Anfang - ziemlich genau das, was ich mir gewünscht habe, denn von da aus kann ich selbst weitermachen. Allerdings habe ich beim Forschen in der SDK Hilfe gemerkt, dass ich sicher noch an meinem Grundlagenwissen arbeiten muss, um die Funktionen sinnvoll einzusetzen. Es ist auch völlig ok, dass sich das erstmal nur auf AVIs bezieht (da meine neulich bei Pearl erworbenen Recorderfestplatten genau diese erzeugen ) ;).

Ich dachte nur, dass Du evtl. auch für Dein Projekt einschlägige Literatur benutzt haben könntest.
Werde aber dennoch auch mal nach WDM googlen.

Mein gegenwärtiges Projekt ist noch ein ganz Kleines, im Prinzip nur so eine Art GUI, um "narrensicher" die Parameterisierung für VLC zusammenzustellen, um aus (von digitalisierten VHS-Cassetten stammenden) grossen Dateien Kleine zu machen ;) [schliesslich hatte die Boardsuche hier ja ergeben, dass es Jahre dauern soll, selbst ein Videoschnittprogramm 'from scratch' zu schreiben] ;-]

Das "Danke" war daher ehrlich gemeint !

Verfasst: 31.05.2007 23:57
von jear
Captn. Jinguji hat geschrieben:...da meine neulich bei Pearl erworbene Recorderfestplatte genau diese erzeugt
Aufpassen. AVI ist nur ein Containerformat. Dein Recorder zeichnet doch wohl nicht in DivX-AVI auf?

Verfasst: 01.06.2007 07:32
von Captn. Jinguji
jear hat geschrieben:
Captn. Jinguji hat geschrieben:...da meine neulich bei Pearl erworbene Recorderfestplatte genau diese erzeugt
Aufpassen. AVI ist nur ein Containerformat. Dein Recorder zeichnet doch wohl nicht in DivX-AVI auf?
Keine Sorge, er zeichnet natürlich im XVID-Format, nicht DivX auf ;)

Nein, mal im Ernst. Mir ist schon klar, was das heisst .
Deswegen "schneide" ich ja auch per Parametrisierung des VLC, das erspart mir das Kümmern um 1000 Videoformate.

Das ist zwar nur "sekunden- " und nicht "framegenau", reicht aber völlig, um auf den Cassetten aufgezeichnete Fernsehfilme "zu verewigen". Manuell ist das auf die Dauer nur etwas nervend, die Parameter zu ermitteln und dem VLC einzutrichtern (ich will so ca. 200 Cassetten durchsehen, das herausholen, was ich behalten will und dann die Dinger wegschmeissen.)

Also mache ich ein "Gui", mit dem man sich durchspinnern und durchslidern kann, bis man "von - bis" das sieht, was man will,(und dafür brauche ich halt Möglichkeit der Einzelframdarstellung auf dem Window); dann kommt nur noch ein Knopfdruck, und der Ausschnitt wird als eigner "Clip" erzeugt.

Klar "gibt's das doch schon besser in Form von VirtualDub + AVISynth", aber es beteht auch im Freundeskreis Interesse an so einem einfachen Programm wie meinem, und die Leute haben einfach weder Lust noch Zeit noch Interesse, sich mit Vdub etc. auseinanderzusetzen, fehlenden CODECS hinterherzugooglen usw, usf.

Nichts desto Trotzky: Danke für die Warnung. ;)

Verfasst: 01.06.2007 08:26
von DarkDragon
Naja dann:

http://www.binary-universe.net/index.ph ... language=d

Und dort ganz unten findest du einen Link auf

http://www.shrinkwrapvb.com/

Verfasst: 01.06.2007 12:24
von Captn. Jinguji
Jessas... Danke, abermals.

Das war aber jetzt heimtückisch ! :mrgreen: Denn :

nun fange ich schon wieder an, weiterzuspinnen und darüber nachzudenken, ob man nicht z.B. Senderlogos durch Kopieren/Verschmieren benachbarter Bildinhalte "kaschieren" kann - wenn man schonmal dabei ist und die Einzelbilder im Speicher hat.

Dabei sollte das eigentliche Projekt doch ein "in einer Woche bin ich fertig, wenn ich feierabends so 2-3 Stunden investiere"- Projektchen sein. :cry:

Naja, muss mich dann wohl zu einer "Releaseplanung" bequemen, sonst gerät das Ganze out of hand und bleibt irgendwann zu 73% erledigt liegen ;)