Breite und Höhe einer Videodatei auslesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Yadgar
Beiträge: 1007
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Breite und Höhe einer Videodatei auslesen

Beitrag von Yadgar » 05.05.2025 19:10:30

Hi(gh)!

Um automatisch Videodateien mit unterschiedlichen Seitenlängen und -verhältnissen in Einzelbilder zu zerlegen, habe ich mir dieses Script aus meinen übermüdeten, koffeinverseuchten Gehirnwindungen geleiert:

Code: Alles auswählen

source=$1 # Video-Dateiname
path="/media/yadgar/POVEARTH_MESH2/Videos/Video-Experimente (Yadgar)/"
: 'frn=$2 # Anzahl der Frames in Video
maxdigits=$3 # höchste vorkommende Stellenzahl
bsize=$4 # Größe der jeweils zu mittelnden Frame-Blöcke'

# Ermittlung der Seitenlängen des zu verarbeitenden Videos
# Breite:
widthraw=$(ffprobe -v quiet -print_format json -show_format -show_streams ${path}${source} | sed -n '12p;13q')
width=$(echo $widthraw | grep -oP '[0-9]+')
# Höhe:
heightraw=$(ffprobe -v quiet -print_format json -show_format -show_streams ${path}${source} | sed -n '13p;14q')
height=$(echo $heightraw | grep -oP '[0-9]+')

echo "Breite: "$width" Höhe: "$height
Gebe ich ein: ./avgprep.sh "720 by 720 by 720 - E.mp4"

bleiben aus einem mir unerfindlichen Grund die Variablen $width und $height leer - darf in ffprobe der Datei-Parameter grundsätzlich nicht substituiert werden oder liegt es womöglich an den Leerzeichen in Pfad- und Dateinamens-String?
Bis bald im Khyberspace!

Yadgar

If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Huo
Beiträge: 851
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von Huo » 05.05.2025 19:32:34

Yadgar hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 19:10:30
[...] oder liegt es womöglich an den Leerzeichen in Pfad- und Dateinamens-String?
Exakt! Einfach "${path}${source}" quoten.

Benutzeravatar
GregorS
Beiträge: 3447
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von GregorS » 05.05.2025 19:35:16

Yadgar hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 19:10:30
... oder liegt es womöglich an den Leerzeichen in Pfad- und Dateinamens-String?
Auf den ersten Blick: Ja, genau daran liegt's. Deshalb vermeide ich Leer- und andere potenziell problematischen Zeichen in Datei- und Verzeichnisnamen.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi und sog. Maker)

tobo
Beiträge: 2608
Registriert: 10.12.2008 10:51:41

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von tobo » 05.05.2025 19:46:30

Neben dem bereits Gesagten wäre in meiner Ausgabe width und height vertauscht. Das ist auch wenig gut, wenn man einfach die n-te Zeile nimmt und damit was macht. Du könntest besser die Zeilen nehmen, in denen width/height steht und dort die Ziffern extrahieren:

Code: Alles auswählen

... | sed -n '/"width"/s/[^0-9]//gp'
... | sed -n '/"height"/s/[^0-9]//gp'

Benutzeravatar
Yadgar
Beiträge: 1007
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von Yadgar » 05.05.2025 20:01:46

Hi(gh)!
Huo hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 19:32:34
Yadgar hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 19:10:30
[...] oder liegt es womöglich an den Leerzeichen in Pfad- und Dateinamens-String?
Exakt! Einfach "${path}${source}" quoten.
Yep! Das war's! Danke für den Tipp!
Bis bald im Khyberspace!

Yadgar

If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Yadgar
Beiträge: 1007
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von Yadgar » 05.05.2025 20:12:14

Hi(gh)!
tobo hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 19:46:30
Neben dem bereits Gesagten wäre in meiner Ausgabe width und height vertauscht. Das ist auch wenig gut, wenn man einfach die n-te Zeile nimmt und damit was macht. Du könntest besser die Zeilen nehmen, in denen width/height steht und dort die Ziffern extrahieren:

Code: Alles auswählen

... | sed -n '/"width"/s/[^0-9]//gp'
... | sed -n '/"height"/s/[^0-9]//gp'
Da hast du natürlich Recht... aber wie gesagt: übermüdete und koffeinverseuchte Gehirnwindungen, wenn man sich dann außerdem nur wenige Tage im Jahr mit bash-Skripting beschäftigt (d. h. kein kewler Unix-Guru ist...), kommt man vielleicht auf die bessere Vorgehensweise, hat aber keine Ahnung, wie die konkret umzusetzen wäre... (und sich durch Manpages zu wühlen funktioniert mit übermüdeten und koffeinverseuchten Gehirnwindungen nur ganz bedingt!) Ich habe es aber jetzt eingepflegt und es funktioniert prima! Danke für den Tipp!
Bis bald im Khyberspace!

Yadgar

If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

Benutzeravatar
Yadgar
Beiträge: 1007
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von Yadgar » 05.05.2025 21:08:09

Hi(gh)!

Das nächste Problem: ffmpeg kann mit den Variablen für Breite und Höhe nichts anfangen:

Code: Alles auswählen

frsize=$width"x"$height
ffmpeg -i $source -r 25 -s $frsize -f image2 /home/Video/Einzelbilder/%0${maxdigits}d.png
Starte ich das Gesamtskript, bricht ffmpeg immer mit der Fehlermeldung "720: No such file or directory" ab! Warum?
Bis bald im Khyberspace!

Yadgar

If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

rodney
Beiträge: 426
Registriert: 09.12.2016 04:15:59

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von rodney » 05.05.2025 21:36:20

Yadgar hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 21:08:09

Code: Alles auswählen

frsize=$width"x"$height
ffmpeg -i $source -r 25 -s $frsize -f image2 /home/Video/Einzelbilder/%0${maxdigits}d.png
Versuch es mal so:

Code: Alles auswählen

frsize="${width}x${height}"
ffmpeg -i $source -r 25 -s "${frsize}" -f image2 /home/Video/Einzelbilder/%0${maxdigits}d.png

tobo
Beiträge: 2608
Registriert: 10.12.2008 10:51:41

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von tobo » 05.05.2025 21:41:51

Yadgar hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 21:08:09
Hi(gh)!

Das nächste Problem: ffmpeg kann mit den Variablen für Breite und Höhe nichts anfangen:

Code: Alles auswählen

frsize=$width"x"$height
ffmpeg -i $source -r 25 -s $frsize -f image2 /home/Video/Einzelbilder/%0${maxdigits}d.png
Ohne das jetzt inhaltlich zu bewerten, du solltest die Variablen quoten und nicht die Textbausteine:

Code: Alles auswählen

frsize="${width}x${height}"
ffmpeg -i "$source" -r 25 -s "$frsize" -f image2 /home/Video/Einzelbilder/%0"${maxdigits}"d.png
Starte ich das Gesamtskript, bricht ffmpeg immer mit der Fehlermeldung "720: No such file or directory" ab! Warum?
Lass dir doch einfach mit echo die Variablen im Skript anzeigen oder setze im Skript zu Beginn ein set -x und betrachte fortan, was genau getan wird.

user8111
Beiträge: 270
Registriert: 24.07.2024 10:06:55

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von user8111 » 06.05.2025 14:11:43

sudo apt install jq

dann

Code: Alles auswählen

info=$(ffprobe -v quiet -print_format json -show_streams "${path}${source}")
width=$(echo "$info" | jq '.streams[0].width')
height=$(echo "$info" | jq '.streams[0].height')
Yadgar hat geschrieben: ↑ zum Beitrag ↑
05.05.2025 21:08:09
Hi(gh)!

Das nächste Problem: ffmpeg kann mit den Variablen für Breite und Höhe nichts anfangen
So:

Code: Alles auswählen

frsize="${width}x${height}"
ffmpeg -i "$source" -r 25 -s "$frsize" -f image2 "/home/Video/Einzelbilder/%0${maxdigits}d.png"

dakuan
Beiträge: 110
Registriert: 28.04.2011 22:09:39

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von dakuan » 06.05.2025 20:04:10

Ich benötige so etwas auch regelmäßig. Allerdings nicht im Script sondern in einem C++ Programm. Ich hatte mir damals die Parameter mühsam zusammen gegoogelt, daher kann ich jetzt aus dem Stand nicht alle Parameter erläutern. Hier mal ein Auszug aus meiner Konfigurationsdatei:

Code: Alles auswählen

#------------------------------------------------------------------------------
#   command to get the video width and height values in WWWWxHHH format
cmd_get_sizes=ffprobe -v error -select_streams v -show_entries stream=width,height -of csv=p=0:s=x %f
Das %f steht für den Dateinamen. Gestartet wird das dann mit fork() und execvp(), was mir dann auch das Quoten erspart.

tobo
Beiträge: 2608
Registriert: 10.12.2008 10:51:41

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von tobo » 06.05.2025 20:35:20

Wobei das ja auch schon so (HxV) in der ganz normalen ffmpeg-Ausgabe steht:

Code: Alles auswählen

ffprobe "${path}${source}" |& grep -oP "Video:.*\b\K\d+x\d+"
EDIT:
Nur mit Bordmitteln:

Code: Alles auswählen

resolution=`ffprobe "${path}${source}" |& grep -oP "Video:.*\b\K\d+x\d+"`
width=`cut -dx -f1 <<< "$resolution"`
height=`cut -dx -f2 <<< "$resolution"`

Benutzeravatar
Yadgar
Beiträge: 1007
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von Yadgar » 08.05.2025 15:44:45

Hi(gh)!

Zwischenstand: ich habe $frsize jetzt so definiert:

Code: Alles auswählen

frsize="${width}x${height}"
und dann so in den ffmpeg-Kommandostring eingefügt:

Code: Alles auswählen

ffmpeg -i "$path$source" -r 25 -s "${frsize}" -f image2 /home/Video/Einzelbilder/%0"${maxdigits}"d.png
...und jetzt läuft es einwandfrei!

Und jetzt die nächste Klippe: da ffprobe natürlich auch die Dauer eines Videos anzeigt (auf Mikrosekunden genau), würde ich diese Information natürlich auch auslesen und in meinem Skript verarbeiten - allerdings kommt "duration: ..." dummerweise zweimal in identischer Form vor. Wie bringe ich sed dazu, nur das erste Vorkommen auszulesen?

Google erzählt mir zwar von "g" im Flag am Ende weglassen, also:

Code: Alles auswählen

durraw=$(ffprobe -v quiet -print_format json -show_format -show_streams "${path}${source}"duration": "285.840000", "duration": "285.840000"," | sed -n '/"duration"/s/[^0-9]//p')
statt //gp, aber in der Variable landen dann trotzdem beide Zeilen:

Code: Alles auswählen

echo $durraw
ergibt "duration": "285.840000", "duration": "285.840000",

Was mache ich falsch?
Bis bald im Khyberspace!

Yadgar

If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

tobo
Beiträge: 2608
Registriert: 10.12.2008 10:51:41

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von tobo » 08.05.2025 16:04:24

Halt nach dem ersten Finden/Bearbeiten abbrehcen:

Code: Alles auswählen

sed -n '/"duration"/{s/[^0-9.]//gp;q}'
Und alternativ dann halt sowas:

Code: Alles auswählen

jq '.format.duration'
PS: Normales ffprobe zeigt das im Stunden:Minuten:Sekunden.Millisekunden-Format - also so, wie es lesbar ist und es jeder eigentlich gerne hätte...

Benutzeravatar
Yadgar
Beiträge: 1007
Registriert: 22.11.2010 22:11:08
Wohnort: Qal'a-ye Nil, Bergisch-Afghanistan (linksrheinische Exklave)
Kontaktdaten:

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von Yadgar » 08.05.2025 16:45:04

Hi(gh)!
tobo hat geschrieben: ↑ zum Beitrag ↑
08.05.2025 16:04:24
Halt nach dem ersten Finden/Bearbeiten abbrehcen:

Code: Alles auswählen

sed -n '/"duration"/{s/[^0-9.]//gp;q}'
Frage zum Verständnis: was bedeutet die geschweifte Klammerung?
tobo hat geschrieben: ↑ zum Beitrag ↑
08.05.2025 16:04:24
Und alternativ dann halt sowas:

Code: Alles auswählen

jq '.format.duration'
PS: Normales ffprobe zeigt das im Stunden:Minuten:Sekunden.Millisekunden-Format - also so, wie es lesbar ist und es jeder eigentlich gerne hätte...
Formatiert will ich das in meinem Anwendungsfall nicht haben, da ich die Anzahl der Frames (bei 25 fps) im Skript berechnen will, genügt mir der Sekundenwert als Fließkommazahl!
Bis bald im Khyberspace!

Yadgar

If operating systems were countries, Linux would be pre-1978 Afghanistan: an all-time favourite among alternative globetrotters, but shunned by mainstream tourists because of its lack of fancy beaches, shortage of alcoholic beverages and its fondness of beards...

tobo
Beiträge: 2608
Registriert: 10.12.2008 10:51:41

Re: Breite und Höhe einer Videodatei auslesen

Beitrag von tobo » 08.05.2025 17:10:53

Yadgar hat geschrieben: ↑ zum Beitrag ↑
08.05.2025 16:45:04
tobo hat geschrieben: ↑ zum Beitrag ↑
08.05.2025 16:04:24
Halt nach dem ersten Finden/Bearbeiten abbrehcen:

Code: Alles auswählen

sed -n '/"duration"/{s/[^0-9.]//gp;q}'
Frage zum Verständnis: was bedeutet die geschweifte Klammerung?
Guckst du:
info sed hat geschrieben: ‘{ CMD ; CMD ... }’
Group several commands together.
...
‘q[EXIT-CODE]’
(quit) Exit ‘sed’ without processing any more commands or input.
Die geschweifte Klammer bezieht sich ausschließlich auf einen Fund von "duration" - wird "duration" gefunden, dann mache die entsprechnde Substitution (s///), bei jeder/m Ziffer/Punkt (g), gebe das aus (p) und Beende (q; da nur einmalig gefordert).
tobo hat geschrieben: ↑ zum Beitrag ↑
08.05.2025 16:04:24
Und alternativ dann halt sowas:

Code: Alles auswählen

jq '.format.duration'
PS: Normales ffprobe zeigt das im Stunden:Minuten:Sekunden.Millisekunden-Format - also so, wie es lesbar ist und es jeder eigentlich gerne hätte...
Formatiert will ich das in meinem Anwendungsfall nicht haben, da ich die Anzahl der Frames (bei 25 fps) im Skript berechnen will, genügt mir der Sekundenwert als Fließkommazahl!
Das waren 2 unabhängige Hinweise:

Code: Alles auswählen

jq '.format.duration'
Wenn du schon - warum auch immer - die Ausgabe im JSON-Format erzwingst, dann ist das nicht völlig unlogisch, das dann auch mit jq auszulesen. Da hat user8111 einen Punkt und da muss man dann auch nicht inselbegabt sein, um zu diesem Schluss zu kommen. Das jq ist also als Alternative zum sed zu sehen. Vielleicht solltest du dich mal rudimentär mit dem beschäftigen, was hier so geschrieben wird!?

Antworten