Ich habe ein HD-Video von einem Sprecher, der einen Vortrag hält. Ich möchte die Größe des Videos ändern, indem ich jedes Bild beschneide, aber das beschnittene Rechteck muss auf dem Kopf des Sprechers zentriert sein, wenn er sich auf der Bühne bewegt.
Ich kann eine Datei erstellen, die das X, Y, die Breite und die Höhe des zugeschnittenen Rechtecks für jedes Bild im Video enthält.
Was ist der beste Weg, um diese bewegte Ernte auf das Video anzuwenden?
Es sollte funktionieren, wenn ich ..
- Verwenden Sie ffmpeg, um jeden Frame in einen Ordner zu extrahieren
- Verwenden Sie ein anderes Programm, um jede Bilddatei zuzuschneiden
- Verwenden Sie ffmpeg, um das Video mithilfe der zugeschnittenen Bilddateien neu zu erstellen
Gibt es einen besseren Weg, dies zu tun?
Antworten:
Ähnlich wie bei Gyans Overlay-Antwort kann eine etwas einfachere Version ein einfaches -filter_script mit den Filtern "Swaprect" und "Crop" verwenden. Bewegen Sie das Zuschneideziel auf 0,0 und beschneiden Sie den Zielbereich auf 0,0. Das Ziel muss auf 0,0 getauscht werden, da sich sonst das andere getauschte Rechteck überlappen kann. Dies funktionierte mit ffmpeg Version 3.4.6-0ubuntu0.18.04.1
Stellen Sie sicher, dass die Frame-Nummern relativ zum mit "-ss" übergebenen Offset sind.
Ein Beispiel für 1280 x 720 Pflanzen aus einer 4096 x 2160-Quelle. Die Quelle ist 24fps und die Tracking-Informationen sind 8fps.
Crop-Filter-Skript:
ffmpeg -ss [start offset] -t [duration] -i input.mov -filter_script:v:0 crop-filter-script -acodec copy out.mov
quelle
Ich habe bereits zu geändert
avconv
, also entschuldige ich mich, wenn die Antwort im klassischen ffmpeg etwas anders sein mag, aber ich glaube, dass es keinen großen Unterschied geben sollte.Sie können einen sich bewegenden Ausschnitt haben, wenn Sie eine Formel zwischen der Rahmennummer und der Position des Ausschnitts erstellen können. Dafür stehen jedoch keine Analysetools zur Verfügung. Das heißt, wenn sich der Lautsprecher vorhersehbar bewegt, können Sie dies theoretisch ohne eine externe Anwendung tun.
Nehmen wir zum Beispiel an, dass sich der Lautsprecher im Bild von oben links nach unten rechts bewegt. Sie könnten etwas in der Art von:
Hier bewege ich 1 Pixel pro Frame, was sehr unwahrscheinlich ist, wie sich jemand bewegen würde.
Denken Sie daran, dass die Filterschnittstelle von avconv eine Menge mathematischer Funktionen bietet (und ich bin sicher, dass ffmpeg ähnlich ist).
Stellen Sie sich also vor, Sie möchten 1 Pixel pro Bild verschieben, jedoch nur von 200 auf 350 Bilder. Sie können dann tun
Für die Frames <200
max(n,200)
würde 200 generiert, dann nehmen wir 200 weg, um 0 zu machen, und geben dannmin
den ersten Teil bis zu 350 Frames zurück, wobei dieses Ergebnis mehr als 150 werden würde und die Konstante beginnt, zurückgegeben zu werden.Obwohl das Schreiben einer solchen Formel von Hand ziemlich mühsam wäre, kann es in einigen Fällen auch hilfreich sein.
Wenn ich jedoch die Möglichkeit hätte, auf die Software zuzugreifen, mit der Bilder Frame für Frame bearbeitet werden können, würde ich diesen Weg gehen.
quelle
Da ich an genau derselben Herausforderung arbeite, denke ich derzeit daran, den ffmpeg vidstabtransform- Filter mit einer generierten trf-Datei zu missbrauchen . Aber ich habe die Details noch nicht ausgearbeitet.
Infos zum trf-Dateiformat.
quelle
Vorausgesetzt, Sie haben " eine Datei, die X, Y, Breite und Höhe des zugeschnittenen Rechtecks für jeden Frame enthält ", können Sie die Option filter_script verwenden, um dies in FFmpeg zu tun. Der Zuschneidefilter unterstützt keine Timeline-Bearbeitung, der Overlay-Filter jedoch. Wenn Sie also eine leere Leinwand mit der gleichen Auflösung wie Ihr Video erstellen und das Video dann mit Koordinaten überlagern, sodass Ihre beabsichtigte Region im sichtbaren Bereich überlagert ist, ist das Ziel erreicht.
Grundlegende Syntax ist
wo
file.txt
sieht das so aus:Die Leinwand
W
undH
sollte den (festen / statischen) Ernteabmessungen entsprechen und gleich seinFPS
. Dann wird jedes Bild des Videos mit ( - X, - Y) überlagert , sodass sich die obere linke Ecke des gewünschten Bereichs bei (0,0) der Leinwand befindet. Jede Überlagerung erfolgt für einen Frame. Wenn Sie aus Effizienzgründen Intervalle haben, in denen der Erntegut statisch ist, sollten Sie den Zwischenauswerter verwenden, zSie können auch einen Zeitstempel
t
anstelle eines Frame-Index verwenden.quelle