Einzelnes Frame aus MP4 in Image kopieren?

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
dangerfreak
Beiträge: 1
Registriert: 12.02.2010 12:24

Einzelnes Frame aus MP4 in Image kopieren?

Beitrag von dangerfreak »

Ich möchte ein MP4-Video in Einzelbilder (z.B. JPG) umwandeln - bitte fragt nicht nach dem warum, das zu erklären dauert zu lange, es ist definitiv nicht für illegale Zwecke.

Mit LoadMovie komme ich schonmal nicht weiter, denn es erkennt das Format nicht.

Ich suche daher nach einer externen DLL, mit der ich das bewerkstelligen kann. Wenn ich damit ein bestimmtes Frame des Videos in ein Purebasic-Image kopieren könnte, wäre das perfekt.

Hat jemand eine Idee?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Einzelnes Frame aus MP4 in Image kopieren?

Beitrag von NicTheQuick »

Im englischen Forum scheinen sich ein paar damit auszukennen: https://www.purebasic.fr/english/viewto ... 79#p434579
Aber ich hab das noch nie gemacht, deswegen ist das nur eine kleine Hilfestellung.

Wieso hast du eigentlich in Offtopic gepostet? Willst du das nicht mit Purebasic machen? Wenn dir auch andere Tools reichen, dann geht das wohl mit fast jedem Videobearbeitungsprogramm, wahrscheinlich sogar mit VLC.
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Einzelnes Frame aus MP4 in Image kopieren?

Beitrag von Mijikai »

Mit ffmpeg geht es, wie schnell das ist im Vergleich zu anderen Verfahren kann ich aber nicht sagen.
ffmpeg muss bei diesem Beispiel im gleichen Verzeichnis wie das Video und Sourcefile liegen!
ffmpeg gibt es hier: https://www.ffmpeg.org

Beispiel (extrahieren der Einzelframes JPG):

Code: Alles auswählen

UseJPEGImageEncoder()

Global Programm.i
Global Output.s
Global *Blob
Global BlobSize.i
Global Image.i
Global Frame.i
Global X.i
Global Y.i
Global Offset.i
Global Color.i

#VIDEO_WIDTH  = 1280
#VIDEO_HEIGHT = 720
#VIDEO_COLOR  = 3
#VIDEO_TOOL   = "ffmpeg.exe"
#VIDEO_TASK   = "-i XYZ.mp4 -f image2pipe -vcodec rawvideo -pix_fmt rgb24 -";<- change name of MP4!

BlobSize = #VIDEO_WIDTH * #VIDEO_HEIGHT * #VIDEO_COLOR
*Blob = AllocateMemory(BlobSize)
If *Blob
  Image = CreateImage(#PB_Any,#VIDEO_WIDTH,#VIDEO_HEIGHT)
  If Image
    Programm = RunProgram(#VIDEO_TOOL,#VIDEO_TASK,#Null$,#PB_Program_Open|#PB_Program_Read)
    While ProgramRunning(Programm)
      Frame + 1
      If ReadProgramData(Programm,*Blob,BlobSize) = BlobSize
        If StartDrawing(ImageOutput(Image))
          For Y = 0 To #VIDEO_HEIGHT - 1
            For X = 0 To #VIDEO_WIDTH - 1
              Offset = (Y * (#VIDEO_WIDTH * #VIDEO_COLOR)) + (X * #VIDEO_COLOR)
              CopyMemory(*Blob + Offset,@Color,3)
              Plot(X,Y,Color)
            Next
          Next
          SaveImage(Image,"Frame_" + Str(Frame) + ".jpg",#PB_ImagePlugin_JPEG)
          StopDrawing()
        EndIf
      EndIf
;       If Frame = 10
;         Break
;       EndIf
    Wend
    FreeImage(Image)
  EndIf
  FreeMemory(*Blob)
EndIf
Das Ganze geht auch direkt mit ffmpeg.
Der Beispielcode zeigt jedoch wie auf die Einzelbilder zwecks Manipulation in PureBasic zugegriffen werden kann.
Autonomus
Beiträge: 30
Registriert: 20.02.2015 18:21

Re: Einzelnes Frame aus MP4 in Image kopieren?

Beitrag von Autonomus »

NicTheQuick hat geschrieben:Im englischen Forum scheinen sich ein paar damit auszukennen: https://www.purebasic.fr/english/viewto ... 79#p434579
Aber ich hab das noch nie gemacht, deswegen ist das nur eine kleine Hilfestellung.

Wieso hast du eigentlich in Offtopic gepostet? Willst du das nicht mit Purebasic machen? Wenn dir auch andere Tools reichen, dann geht das wohl mit fast jedem Videobearbeitungsprogramm, wahrscheinlich sogar mit VLC.
Ja, dass kann der VLC.
[Aktuelles Projekt: Core Project | Media Library (Core Project based)]
  • OS: Windows 7 Ultimate x64 | PB: PureBasic 5.40 x86/x64

    CPU: AMD Phenom(TM) II X4 965 BE (4x 3.4GHz @3.8GHz) | GPU: nVidia GeForce 8200 (512MB), nVidia GeForce GT 730 (4096MB)
    RAM: 8GB | HDD: 250GB Samsung, 1TB Samsung
Antworten