Seite 1 von 1

Einzelnes Frame aus MP4 in Image kopieren?

Verfasst: 18.09.2018 14:10
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?

Re: Einzelnes Frame aus MP4 in Image kopieren?

Verfasst: 18.09.2018 15:06
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.

Re: Einzelnes Frame aus MP4 in Image kopieren?

Verfasst: 18.09.2018 15:39
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.

Re: Einzelnes Frame aus MP4 in Image kopieren?

Verfasst: 02.10.2018 21:39
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.