Wie Key Frames in Videos erkennen ?
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
Wie Key Frames in Videos erkennen ?
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.
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.
Ist das Kunst hier, oder kann das weg ?
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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:
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.
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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
Hallo, DarkDragon.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: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.Code: Alles auswählen
Structure WAVEFORMATEX . . . EndImport
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.
Ist das Kunst hier, oder kann das weg ?
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Komisch, stimmtdige 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?


@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

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
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 )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).

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

Das "Danke" war daher ehrlich gemeint !
Zuletzt geändert von Captn. Jinguji am 01.06.2007 12:29, insgesamt 1-mal geändert.
Ist das Kunst hier, oder kann das weg ?
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
Keine Sorge, er zeichnet natürlich im XVID-Format, nicht DivX aufjear hat geschrieben:Aufpassen. AVI ist nur ein Containerformat. Dein Recorder zeichnet doch wohl nicht in DivX-AVI auf?Captn. Jinguji hat geschrieben:...da meine neulich bei Pearl erworbene Recorderfestplatte genau diese erzeugt

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.

Ist das Kunst hier, oder kann das weg ?
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Naja dann:
http://www.binary-universe.net/index.ph ... language=d
Und dort ganz unten findest du einen Link auf
http://www.shrinkwrapvb.com/
http://www.binary-universe.net/index.ph ... language=d
Und dort ganz unten findest du einen Link auf
http://www.shrinkwrapvb.com/
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
Jessas... Danke, abermals.
Das war aber jetzt heimtückisch !
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.
Naja, muss mich dann wohl zu einer "Releaseplanung" bequemen, sonst gerät das Ganze out of hand und bleibt irgendwann zu 73% erledigt liegen
Das war aber jetzt heimtückisch !

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.

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

Ist das Kunst hier, oder kann das weg ?