2017-04-08 5 views
1

Ich bin auf der Suche nach einer Möglichkeit in OS X/Python3.5, eine .avi Videodatei zu nehmen, jeden 100. Rahmen zu subsamples und diese Rahmen zu einem eigenen Video zu kombinieren.Beispiel-Frames von Video

In meinem speziellen Fall ist das Video 30 Sekunden bei 20 Bildern pro Sekunde, so dass das neue Video nur 6 Bilder lang wäre (Ich möchte dies für mehrere Videos tun, dann kombinieren Sie sie alle später zusammen).

Ich habe opencv installiert, habe aber Probleme, eine Dokumentation dazu zu finden. Ich könnte auch eine andere Bibliothek verwenden, wenn es einfacher ist.

+1

Vielleicht erwägen Sie 'ffmpeg' mit Subprozess; Ich denke, 'OpenCV' erfordert es trotzdem, also schneide einfach den Mittelsmann heraus ... –

+0

Ich bin offen für alles, aber ich muss das für Zehntausende von Videos tun, die Hunderte von Unterverzeichnissen umfassen. Hat 'ffmpeg' irgendeine Möglichkeit, dies zu automatisieren oder wäre es ein Video nach dem anderen? Wollte Python benutzen, weil ich etwas Erfahrung mit der 'os' Bibliothek habe. – Austin

+1

In 'bash' könnte man rekursiv Verzeichnisse mit Hilfe von' find' durchqueren. Gibt es einen Grund, warum du 'Python' brauchst? Und ja, 'ffmpeg' kann leicht mit der richtigen Skriptfähigkeit automatisiert werden. Ein solches Beispiel: http://stackoverflow.com/a/41657131/499581 –

Antwort

1

ffmpeg verwenden und ein paar benutzerdefinierten bash Funktionen erstellen:

subsample() { export target=$2 ; find . -type f -name "*$1*" \ 
       -execdir bash -c 'ffmpeg -i "${0}" -vf "select=not(mod(n\,100))" \ 
       -vsync vfr -q:v 2 "${target}/${0}_%03d.png"' {} \; \ 
       -execdir bash -c 'ffmpeg -r 60 -f image2 -i "${target}/${0}_%03d.png" \ 
       -vcodec libx264 -crf 25 -pix_fmt yuv420p "${target}/clip_${0}"' {} \; \ 
       ; rm -f ${target}/*$1_*.png ; 
      } 

subconcat() { export target=$2 ; ffmpeg -f concat -safe 0 -i \ 
       <(printf "file '$PWD/%s'\n" ./clip_*.${1}) -copytb 1 \ 
       -c copy ${2}/combined_output.${1} ; 
      } 

Speichern Sie die Funktionen in Ihrem ~/.bash_profile.

$ source ~/.bash_profile 

Synopse

subsample|subconcat <ext> <target path> 

(. ZB PWD /path/movies):

subsample avi /path/to/output 

subsample - rekursiv alle avi finden und jeden 100. Frame in eine neue v kombinieren ideo @ Ziel.

subconcat - kombiniert alle clip_*.ext Videos der bezeichneten Erweiterung @ Ziel.

It's presumed you'll want to adjust the ffmpeg settings to suit you, although the examples above should give you a general idea of what is possible using only ffmpeg and bash find.

+1

Danke das funktionierte großartig, jede Funktion separat ausgeführt. Ich habe den Pfad für die 2. Funktion bearbeitet, so dass das Piping funktioniert, weil es versucht hat, in '/./vid.avi' zu gehen. – Austin

+1

Gern geschehen! Ich war mir nicht sicher, ob es alles machen würde, was du wolltest, also bin ich wirklich froh, dass es für dich funktioniert hat. Die Art, wie es mit Wegen umgeht, könnte definitiv verbessert werden (aber im Allgemeinen ziemlich einfach). Der schwierigste Teil zu verstehen ist in der Regel die arkanen Befehle 'ffmpeg' verwendet ... –

+1

Generell in der Regel" cd "in das Verzeichnis, in dem ich starten möchte und dann den Befehl ausführen - auf diese Weise werden Sie wissen, dass es ist Arbeiten am richtigen Ort und nicht irgendwo unerwünscht. Die Verwendung bestimmter Befehle mit 'find' kann leicht zu einer Katastrophe führen, wenn Sie nicht darauf achten, wo es beginnt ... –

2

einfache Logik mit needed functions:

make 
    VideoCapture 
    VideoWriter 

do 
    fr = cv.GrabFrame until file end 
    if 0 = (counter % 100) 
     WriteFrame(writer, fr) 

Python examples

+0

Danke, obwohl das mit meiner begrenzten Erfahrung sehr lange dauern kann, wenn überhaupt. Als erstes habe ich versucht, 'cv2.VideoWriter.open()': 'AttributeError: 'builtin_function_or_method' Objekt hat kein Attribut 'open'' – Austin

+1

@Jake Ich habe keine Erfahrung mit Python-Implementierung, also Beispielseite zu meiner Antwort hinzugefügt – MBo

+0

Das War ordentlich und sauber :) @MBo – ZdaR