Apollo75
Anmeldungsdatum: 9. November 2005
Beiträge: 256
|
Hallo zusammen, ich würde gerne aus der Kommandozeile heraus eine Diashow aus unterschiedlichen Bildern erstellen, diese aber mit klarer Zeitvorgabe, wann jedes Bild erscheinen soll. Hierfür habe ich eine Datei, in der in Sekunden steht, an welcher Stelle das jeweils nächste Bild erscheinen soll. Hier mal ein Beispiel: 8,612109
10,763764
94,089660
188,031429 Die Bilder liegen alle schon in richtiger Größe und im richtigen Format vor. Ich bräuchte also lediglich eine Möglichkeit, ein Video daraus zu erstellen, welches mir (nach diesem Beispiel) in Sekunde 8,6 das erste Bild zeigt bis Sekunde 10,7 - hier dann das zweite Bild usw. Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken. Vielleicht kann mir hier jemand mit einer möglichst eleganten Lösung helfen. Besten Dank und viele Grüße
Christoph
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Das geht mit ffmpeg. Es gibt mehrere Möglichkeiten. Die einfachste ist IMHO die mit ffconcat. Dazu erstellst du einfach eine Datei "ffconcat.txt":
ffconcat version 1.0
file image01.png
duration 8.612109
file image02.png
duration 10.763764
...
(Punkte statt Kommata) Anschließend:
ffmpeg -i ffconcat.txt -c:a copy -vf fps=25 out.avi Links:
|
Apollo75
(Themenstarter)
Anmeldungsdatum: 9. November 2005
Beiträge: 256
|
Hallo misterunknown, diese Seite hatte ich schon gefunden, aber ich glaube, das ist nicht exakt das, was ich suche. Hier wird die "duration" angegeben, also wie lange ein Bild gezeigt wird. Ich möchte jedoch den Zeitstempel angeben, zu dem das Bild angegeben wurde. Das wäre also für das erste Bild nach 8.6 Sekunden, das zweite Bld nach weiteren 2.1 Sekunden (bei Sekunde 10.7).
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Apollo75 schrieb: diese Seite hatte ich schon gefunden, aber ich glaube, das ist nicht exakt das, was ich suche.
Wenn es nicht exakt das ist, dann wandel es nach deinen Vorstellungen ab 😉
Hier wird die "duration" angegeben, also wie lange ein Bild gezeigt wird. Ich möchte jedoch den Zeitstempel angeben, zu dem das Bild angegeben wurde. Das wäre also für das erste Bild nach 8.6 Sekunden, das zweite Bld nach weiteren 2.1 Sekunden (bei Sekunde 10.7).
Naja, dann konvertiere deine Datei, sodass sie nicht mehr absolute Werte enthält, sondern relvative:
| $ sed -i "s/,/./" deine_datei
$ PREV=0; while read line; do echo "$line-$PREV" | bc; PREV=$line; done < deine_datei > neue_datei_mit_durations
|
|
Apollo75
(Themenstarter)
Anmeldungsdatum: 9. November 2005
Beiträge: 256
|
Ja, daran hatte ich auch schon gedacht - hätte es aber nicht so schnell hinbekommen, wie Du gerade ☺ Besten Dank dafür, ich werde es testen!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Hier mal eine Skript, dass aus der Datei mit den Zeitstempeln eine passende Datei erzeugt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
output="$2"
input="$1"
echo "ffconcat version 1.0" >> "$output"
file_no=1
t1=0
while read line; do
t2=$(sed 's/,/./' <<< "$line")
printf "file image%02d.png\n" "$file_no" >> "$output"
echo duration $(echo "$t2 - $t1" | bc) >> "$output"
t1="$t2"
file_no=$(($file_no + 1))
done < "$input"
|
Das sieht für die gegebenen Daten so aus:
$ cat data.txt
8,612109
10,763764
94,089660
188,031429
$ ./convert.sh data.txt output.txt
$ cat output.txt
ffconcat version 1.0
file image01.png
duration 8.612109
file image02.png
duration 2.151655
file image03.png
duration 83.325896
file image04.png
duration 93.941769
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Vorzeiten hatten wir schon ein paar Mal solche Fragen zu skriptbaren Diashow-Maschinen hier gehabt. Damals war regelmäßig feh der Renner, als eierlegende Wollmilchsau für sowas. (im Moment finde ich aber nur diesen und diesen Beitrag) Vielleicht solltest Du Dir das Ding mal angucken ? Klar ist, dass Du in jedem Fall Deine Liste vom Format her umsetzen musst, damit sie für den konkreten Bildbetrachter passt. (jedenfalls wenn Du dieses Format unbedingt beibehalten möchtest) - aber das ist dann eine Aufgabe für sed oder so, daraus eine passende Steuerliste zu machen, egal welchen Bildbetrachter Du nimmst. LG, track
|
Apollo75
(Themenstarter)
Anmeldungsdatum: 9. November 2005
Beiträge: 256
|
Hallo track, danke für die Antwort. Mit feh habe ich schon häufiger gearbeitet, aber ich bin mir nicht so ganz sicher, ob dies für mich die Lösung ist. Der Plan ist, dass ich Bilder im Takt zur Musik wechsel. Diesen Takt kann ich mir in Vorm von Zeitstempeln ganz gut generieren - den Bilderwechsel synchron zur Musik hinzubekommen ist schon schwieriger. Die entsprechenden Beiträge für feh schaue ich mir trotzdem noch mal an, besten Dank für den Hinweis! LG,
Christoph
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Beim Blick auf man feh habe ich gerade gesehen, dass Du für deinen Anwendungsfall womöglich direkt, "just in time" steuern kannst. Mit der Option --filelist - kannst Du offenbar die Bilderliste direkt über eine Pipe übergeben. Du müsstest jetzt mal probieren, ob er auch brav wartet, bis die nächste Zeile kommt. Sollte das funktionieren, könntest Du direkt aus dem Musikspieler heraus Deine Diashow steuern, ganz ohne Timing-Liste ... (alternativ geht natürlich auch ein Skript, das die Zeitangaben abarbeitet. - nur bedenke dabei, dass sleep Nebenzeiten hat, die sich kumulieren. Man muss also ggf. nachsynchronisieren, wie z.B. hier.) LG, track
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
In diesem Fall ist Beitrag 4292712 von moonlight in dem zweiten von track verlinkten Thema recht interessant. Man kann man mit VLC eine XSPF-Wiedergabeliste erstellen lassen, in der die Wiedergabedauer jedes Bildes als Element bereits eingefügt ist und manuell angepasst werden kann. XML lässt sich auf der Befehlszeile gut ändern oder auch generieren und mit cvlc gibt es einen vollwertigen Befehlszeilenclient für den Medienplayer. Mit feh ... sehe ich da gerade keine direkte Möglichkeit eine variable Verzögerung für eine Slideshow zu verwenden. Müsste man also einen manuellen Bildwechsel zeitgesteuert über xdotool skripten. ... könnte man die Bilder einfach immer mit einer eigenen Instanz des Bildbetrachters aufrufen, also quasi die Slideshow immer nur mit einem Bild. Zum Beispiel: feh -F -D 3.54 --cycle-once Bild-1.jpg ; feh -F -D 1.23 --cycle-once Bild-2.jpg ; feh -F -D 5.1 --cycle-once Bild-3.jpg Da eine Schleife in einem Skript erst weiterlaufen würde, wenn die Instanz von feh geschlossen würde könnte man da ein relativ einfaches Konstrukt versuchen. Beispiel Wiedergabeliste (CSV):
Bild-1.jpg,3.54
Bild-2.jpg,1.23
Bild-3.jpg,5.1 Beispiel Schleife (track würde noch erläutern, wie das in schön auszusehen hat):
| cat wiedergabe.liste | while read line
do
feh -F -D "${line%,*}" --cycle-once "${line#*,}"
done
|
Ist halt die Frage, ob sich das alles immer so synchron umsetzen lässt.
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Vielleicht ist der erste Gedanke mit feh und xdotool doch sinnvoller als einzelne Instanzen zu verwenden. Beispiel Zeitstempel: 3.54
1.23
5.1 Beispiel Schleife: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | lines="$(wc -l zeitstempel.liste)"
c="0"
feh -p -F -. *.bilder &
play lied.audio &
cat zeitstempel.liste | while read line
do
if [ "$c" == "$lines" ]
then
sleep "$line"
xdotool key q
else
sleep "$line"
xdotool key n
let c++
fi
done
|
Ich weiß jetzt nicht, wie genau die Abweichungen bei sleep entstehen. Messe ich das auf diesem Rechner mit time, dann sind das konstant 0,003 Sekunden, die jeder Aufruf daneben liegt. Mit jeder weiteren Abfrage bzw. Aufruf verzögert sich das natürlich weiter.
|