Zum Forum springen
Code für Komandozei...
 
Benachrichtigungen
Alles löschen

Code für Komandozeile mit Formular generieren (ffmpeg) ?

32 Beiträge
4 Benutzer
0 Reactions
1,708 Ansichten
ThePhantom
Beigetreten: 13.03.2007

also ich möchte mittels ffmpeg batchmässig aus knapp 40 stunden material einzelne clips schneiden, vorher wird das material gesichtet und die einzelnen zeitmarken für anfang und ende des clips notiert.

was ich jetzt nich möchte ist, jede code zeile fürs schneiden einzeln zu schreiben, auch copy paste ist schlecht, weil ich da immer noch mit der maus oder den pfeiltasten zu der stelle der codezeile navigieren muss wo die zeiten einzutragen sind, das ist bei ca. 500 clips sehr nervig und zeitraubend

auch hatte ich schon probiert den code in einer calc tabelle zu schreiben, wo ich ja komfortabel einfach in die jeweiligen zellen die zeit eintragen kann, allerdings kann ffmpeg / avconv den code daraus nicht verarbeiten, weil da jede menge freizeichen drin sind wenn ich den code aus der calc tabelle rauskopiere, selbiges problem besteht, wenn ich den code aus calc in ein plain text programm kopiere, auch da sind jede menge freizeichen drin die ich erst entfernen muss

ich suche also nach einer möglichkeit komfortabel den code für ffmpeg zu generieren und dabei in jeder neuen codezeile die zeiten auszutauschen, und dann irgendwie der code komplett so ausgegeben wird dass er für ffmpeg verarbeitbar ist ohne zusätzliche freizeichen!

wie mach ich das am besten? formular? datenbank?

der code je zeile ist ganz simpel

ffmpeg -i video.mp4 -c copy -ss 00:05:10 -t 00:00:08 clip.1.mp4

nur die zeiten und der dateiname des clips sind variabel


Antwort
Zitat
31 Antworten

schreib halt eine Datei (ich nenn sie mal lol.txt):
00:05:10 00:00:08
00:05:10 00:00:08
00:05:10 00:00:08
...

dann in der shell:
awk '{print "ffmpeg -i video.mp4 -c copy -ss", $1, "-t", $2, "clip." NR ".mp4"}' < lol.txt > executeme.sh


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

krass O_O so geht das ? wäre ja der hammer

ich hab ein unix system, also mac :/ geht deine zeile dafür sieht so nach windows shell aus?

executeme.sh ist doch ein script? und was ist awk ?

ja, bin noob :/


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

meine es sollte so auch auf dem mac funktionieren.

das awk(scriptsprache gern fuer csv benutzt) schreibt dir halt nur nen script mit deinem parametern. was du dann dannach noch selber starten musst

in die lol.txt gehoert aber noch der name des orginalfiles also nen $3 einfuegen, wenn du den name nach start stop nimmst

edit
awk '{print "ffmpeg -i ", $3," -c copy -ss", $1, "-t", $2, "clip." NR ".mp4"}' < lol.txt > executeme.sh

deine executeme.sh musste da nur vorne noch in die erste zeile

#!/bin/sh

einfuegen und dann sollte es rennen

zur erklearung vieleicht

awk wird durch < lol.txt erst damit gefuetter (eingabe pipe) und dann

das ganze durch > in das sh geschrieben (ausgabe pipe)

tip kannst auch erstmal alles nach dem lol.txt weglassen und kuckeen ob er ne valide ausgabezeile nach deinem codechema schreibt


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

Original von flowIIpoker
meine es sollte so auch auf dem mac funktionieren.

das awk(scriptsprache gern fuer csv benutzt) schreibt dir halt nur nen script mit deinem paarametern. was du dann dannach noch selber starten musst

in die lol.txt gehoert aber noch der name des orginalfiles also nen $3 einfuegen, wenn du den name nach start stop nimmst

O_O

wo ist denn dann das script das ich starten muss?

orginalfile ? also das quellvideo bzw. es sind ja diverse quellvideos
also schreibe ich quasi noch in die lol.txt noch den namen der jeweiligen quelldatei und linke das dann mit $3 in der codezeile?


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

#!/bin/sh

wo muss das hin?

und executeme.sh wird automatisch im hintergrund generiert oder wie ?


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

nachdem der awk durchgelaufen ist

hast du dieses exec.sh

ddie dann nochmal oeffnen und ganz nach vor in deine eigene zeile

sollte dann so aussehen

#!/bin/sh
ffmep .....
ffmep .....
ffmep .....
ffmep .....

dann noch rechte mit chmod u+x exec.sh setzen
und mit ./exec.sh starten


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

skype name man machen wir das zusammen


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

ach jetzt verstehe ich, die codezeile generiert die executeme.sh, in die datei muss ich oben noch den befehl einfügen und dann die datei ausführen okay das ist klar

ich hab jetzt dieses hier so eingefügt

awk '{print "ffmpeg -i ", $1," -c copy -ss",$2, "-t",$3, "clip." NR ".mp4"}' < cuts.txt >

in cuts.txt sieht es so aus

video.mp4 00:00:10 00:00:05

bekomme aber die meldung

-bash: syntax error near unexpected token `newline'

ebenso bei dieser zeile mit veränderten freizeichen

awk '{print "ffmpeg -i ", $1," -c copy -ss ",$2," -t ",$3," clip." NR ".mp4"}' < cuts.txt >

stimmt die zeile zumindest oben bei der mit den ganzen " und freizeichen? das das einzige was ich noch ned kapiere


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

so jetzt hab ich die zeile mal hier von dir rauskopiert und nur die $1 2 3 und den namen der txt verändert

awk '{print "ffmpeg -i ", $1," -c copy -ss", $2, "-t", $3, "clip." NR ".mp4"}' < cuts.txt >

kommt aber immer noch der fehler

-bash: syntax error near unexpected token `newline'


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

voll geil, ich hab hinten noch executeme.sh angehängt, dann generiert es die .sh datei, dann füge ich oben noch das zum ausführen ein, mache die datei ausführbar und losgehts, geht genauso wie das sein soll, perfekt jetzt kann ich mir einiges an arbeit sparen

vielen dank !


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

nachdem cuts.txt > mus dein scriptname stehen.
sonnst weis er ja nicht wohin mit der ausgabe

diese > ist doch die umleitungsaufforderung

oder du nimmst es erstmal weg das >

dann haut er das ersmal alles auf dem bildschirm raus

edit: dank lieber dem anderem user, ich hab eigentlich nie was mit awk gemacht
benutz fuer sowas neuerdings gerne python oder vorher shellscripting


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

hat sich erledigt :)

nochmal danke an alle :)


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

weiss jetzt gerad nicht was du meinst

aber general ist da escapen angesagt bei sowas

ich wuerde auch mit dem parametern weitermachen ($3 wenn da schon das quellfile drin steht) und einfach sowas wie croped oder cuted einfuegen

wenn du clip durch was ersetzen willst da mach doch einfach

awk '{print "ffmpeg -i ", $1," -c copy -ss", $2, "-t", $3, " "$4"" NR ".mp4"}' < cuts.txt > filename
das leerzeichen in underlined gekenzeichnet ist wichtig

musst halt immer maetzaelhlen mit den "

also

sagen wir $1= yyy

dann wird auf "bla"$1"blubs" .... blayyyblubs draus
hingegen aus "bla "$1" blubs" .... bla yyy blubs

thema aufbrechen von strings

und nochmal zum testen einfach > scriptfile weglassen und kucken ob das das ist, was du willst


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

ja ich habs jetzt so gemacht mit $4 wie du grade beschrieben hast, das geht

die quelladresse mit den freizeichen hab ich ned hinbekommen, aber ich bastel erstmal die scripts und führe die dann im jeweiligen ordner wo das video liegt aus, da muss ich dann keine grossen dateien rumkopieren, weil ich das halt nicht hinbekomme den pfad des jeweiligen videos mit den freizeichen in der cuts.txt in die jeweiligen zeilen mit reinzuschreiben

achso, ich habs jetzt so dass ich mit dem $4 individuelle dateinamen in der cuts.txt vergeben kann, das ist super

allerdings ist die automatische nummernvergabe mit NR fortlaufend, das heisst, es werden fortlaufende nummern vergeben obwohl sich der dateiname ändert :/

statt

file.abc.1
file.abc.2
file.def.1
file.ghi.1

bekomme ich

file.abc.1
file.abc.2
file.def.3
file.ghi.4

lässt sich da noch was machen ?


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

bin mir jetzt nicht sicher aber probier mal nf statt nr

edit: bin jetzt auch erstmal schlafen und kuck morgen gegen 9.45uhr wieder rein,
ich hab gaeste und die wollen auch mit mir fruehstueken... n8 und gl


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

bei NF bekommen alle genau die gleiche nummer verpasst :)

okay ich bin auch müde und geschafft von dem ganzen programmieren hier hehe

im nachinein betrachtet hab ich das alles verkompliziert mit vielen eingaben und zeilen und so auf einmal, ich hatte es anfangs grundlegend einfacher geplant, vllt muss ich morgen nochmal neu formulieren


Antwort
Zitat
ThePhantom
Beigetreten: 13.03.2007

bzw. jetzt hab ichs

gibt es die möglichkeit dass ich die executeme.sh komulativ mit datenzeilen füttern kann ?!

bisher ist es so, dass immer wenn ich

awk '{print "ffmpeg -i "source1.mp4" -c copy -ss", $1, "-t", $2, " "$3"" NR ".mp4"}' < cuts.txt > executeme.sh

ausführe

immer in der executeme.sh ab zeile 1 alles neu überschrieben wird

also kann man das so machen dass man beispielsweise mehrere cut.txt hat, also für jede videosource eine cuts.txt, also source.1.mp4 cuts.1.txt, source.2.avi, cuts.2.txt usw.

dann würde ich die txt dateien erstmal mit zeiten der jeweiligen videoquellen bestücken und dann einfach nach und nach abarbeiten und die executeme.sh nach und nach mit datenzeilen anfüllen!

nur im moment geht das halt nicht, weil immer wieder ab zeile 1 alles überschrieben wird! wenn das ginge, dass mit jeder neuen cuts.x.txt die ich abarbeite in der executeme.sh eine neue zeile begonnen wird, dann würde sich das mit der numerierung auch erübrigen, weil dann ja für jedes videosource von 1 angefangen werden können, da sich ja die dateinamen auch ändern!


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

edit: laeuft doch erstmal nicht
ach dem rauskopieren, sollte aber rennen


Antwort
Zitat
flowIIpoker
Beigetreten: 14.02.2007

speichern als blablubs.py datei

und aufruf

python blablubs.py

probier das mal

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os

cuts   = open("./lol.txt", "r")
script = open("./executeme.sh","w")
script.write("#!/bin/sh" + "\n")
oldfile = ""
for i in cuts:
	start 	= i.find(" ")
	stop 	= i.find(" ",start+1)
	source 	= i.find(" ",stop+1)
	dest 	= i.find(" ",source+1)
	tstart 	= i[:start]
	tstop	= i[start+1:stop]
	ifile 	= i[stop+1:source]
	ofile	= i[source+1:-1]
	if ifile != oldfile:
		offset = 1
	else:
		offset = offset + 1
	script.write("ffmpeg -i " + ifile + " -c copy -ss" + tstart + " -t" + tstop + " " + ofile + str(offset) + ".mp4\n")
	oldfile = ifile
script.close()
cuts.close()

Antwort
Zitat