ffprobe zur Ermittlung der Dauer eines ts-Videos

Nico81

Benutzer
Mitglied seit
04. Jan 2018
Beiträge
11
Punkte für Reaktionen
1
Punkte
3
Hallo zusammen,

ich möchte über ein Python-Script die Dauer bzw. Länge eines ts-Videos ermitteln.
Hier mal ein Ausschnitt des Codes:

Code:
def videoDuration(video_file_path):
    """Get video duration in sec from a ffprobe call, using json output"""
    #command is:  ffprobe -loglevel quiet -print_format json -show_format /full/path/to/videofile
    command     = ["ffprobe", "-loglevel", "quiet", "-print_format", "json", "-show_format ",  video_file_path]
    pipe        = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out, err    = pipe.communicate()
    js          = json.loads(out)
    return  int(float(js['format']['duration']) + 1.)

Dafür brauche ich allerdings ffprobe. Dies soll wohl eigentlich als Teil von ffmpeg installiert werden, was bei mir aber irgendwie nicht der Fall ist.
Ich habe FFmpeg 6 von Vincent Fortier auf meiner DS224+ installiert. Das Programm liefert allerdings folgenden Fehler:

Code:
FileNotFoundError: [Errno 2] No such file or directory: 'ffprobe'
Kann mir jemand vielleicht sagen wie ich entweder ffprobe zum Laufen bekomme oder wie ich alternativ die Dauer eines ts-Videos ermitteln kann?
 

ctrlaltdelete

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
30. Dez 2012
Beiträge
10.286
Punkte für Reaktionen
3.761
Punkte
414
  • Like
Reaktionen: Nico81

Nico81

Benutzer
Mitglied seit
04. Jan 2018
Beiträge
11
Punkte für Reaktionen
1
Punkte
3
Vielen Dank ctrlaltdelete,
deine Lösung hat funktioniert. Ich musste allerdings noch die Versionsnummer von ffmpeg ergänzen.

Hier mein aktueller Code:
Code:
def videoDuration(video_file_path):
    """Get video duration in sec from a ffprobe call, using json output"""
    #command is:  /volume1/@appstore/ffmpeg6/bin/ffprobe -loglevel quiet -print_format json -show_format /full/path/to/videofile
    command     = ["/volume1/@appstore/ffmpeg6/bin/ffprobe", "-loglevel", "quiet", "-print_format", "json", "-show_format ",  video_file_path]
    pipe        = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out, err    = pipe.communicate()
    print("command = ",command)
    print("pipe = ",pipe)
    print("out = ",out)
    print("err = ",err)
    js          = json.loads(out)
    return  int(float(js['format']['duration']) + 1.)

Ich bekomme immer noch einen Fehler in der Funktion. Allerdings jetzt an anderer Stelle.
Zur Erleichterung der Fehlersuche habe ich die 4 print-Befehle eingefügt.

Hier auch noch meine Fehlermeldung:
Code:
Datei =  /volume1/TV-Aufzeichnungen/2024-02-07_18-07-00_Tele 5_Stargate.ts
Start =  1707325200
command =  ['/volume1/@appstore/ffmpeg6/bin/ffprobe', '-loglevel', 'quiet', '-print_format', 'json', '-show_format ', '/volume1/TV-Aufzeichnungen/2024-02-07_18-07-00_Tele 5_Stargate.ts']
pipe =  <subprocess.Popen object at 0x7fb086e7ad30>
out =  b''
err =  None
Traceback (most recent call last):
  File "/volume1/TV-Aufzeichnungen/tvh_rec_import.py", line 95, in <module>
    importRecord(recdir+"/"+filename, mask, api_url)
  File "/volume1/TV-Aufzeichnungen/tvh_rec_import.py", line 81, in importRecord
    print("Dauer = ",videoDuration(filepath))
  File "/volume1/TV-Aufzeichnungen/tvh_rec_import.py", line 64, in videoDuration
    js          = json.loads(out)
  File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.8/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Ohne das ich Ahnung habe, finde ich den Wert von out irgendwie komisch?
Habt ihr eine Idee, wo mein Fehler liegt.
Ich habe das Gefühl, ich sehe den Wald vor lauter Bäumen nicht mehr...
 
  • Like
Reaktionen: ctrlaltdelete

ctrlaltdelete

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
30. Dez 2012
Beiträge
10.286
Punkte für Reaktionen
3.761
Punkte
414
freut michEdit: deine Frage schaue ich mir morgen an.
 

Anhänge

  • IMG_4013.jpeg
    IMG_4013.jpeg
    135,4 KB · Aufrufe: 4

Nico81

Benutzer
Mitglied seit
04. Jan 2018
Beiträge
11
Punkte für Reaktionen
1
Punkte
3
Danke! Dann lass es dir noch schmecken! ;)
 

Nico81

Benutzer
Mitglied seit
04. Jan 2018
Beiträge
11
Punkte für Reaktionen
1
Punkte
3
So, ich habe mich jetzt noch etwas weiter in das Thema eingelesen.
Vermutlich liegt der Fehler in diesem Kommando:
Code:
command     = ["/volume1/@appstore/ffmpeg6/bin/ffprobe", "-loglevel", "quiet", "-print_format", "json", "-show_format ",  video_file_path]
Dank ctrlaltdelete weiß ich schon, dass der erste Teil "/volume1/@appstore/ffmpeg6/bin/ffprobe" korrekt ist.
Der Ausdruck video_file_path steht für einen String bestehend aus Pfadangabe und Dateiname des ts-Videos.
Was ich noch nicht überblicke sind die vier Ausdrücke dazwischen.
Wenn ich es richtig gelesen habe, dann ist dieses Kommando ein Befehl, den ich auch so in der Kommandozeile ausführen könnte.
Ich werde das wohl heute Abend mal ausprobieren und schauen, was dabei herauskommt.
Bis dahin versuche ich mal mehr über die vier Ausdrücke in Verbindung mit ffprobe herauszubekommen.

 

Nico81

Benutzer
Mitglied seit
04. Jan 2018
Beiträge
11
Punkte für Reaktionen
1
Punkte
3
Ich habe endlich das Problem entdeckt.
Der Name der Datei enthält ein Leerzeichen!!!
Wenn ich den Dateinamen wie im folgenden Code in einfache Anführungszeichen setze funktioniert das Kommando in der Kommandozeile.

Code:
/volume1/@appstore/ffmpeg6/bin/ffprobe -loglevel quiet -print_format json -show_format '/volume1/TV-Aufzeichnungen/2024-02-07_18-07-00_Tele 5_Stargate.ts'

Jetzt habe ich versucht in meinem Script den Dateinamen ebenfalls in einfache Anführungszeichen zu setzen. Leider ohne Erfolg.
Hier mein aktueller Code:
Code:
#Funktion zum Ermitteln der Länge/Dauer eines Videos mit Hilfe des Programms ffprobe
def videoDuration(video_file_path):
    #Befehl zum Auslesen der Länge:  volume1/@appstore/ffmpeg6/bin/ffprobe -loglevel quiet -print_format json -show_format /full/path/to/videofile
    video_file_path  = "'"+video_file_path+"'"
    command     = ["volume1/@appstore/ffmpeg6/bin/ffprobe", "-loglevel", "quiet", "-print_format", "json", "-show_format ",  video_file_path]
    #Ausführen von "Command" und Rückgabe des Ausgabe-Strings (stdout) in die Variable "out" und des Fehlermeldungs-Strings (stderr) in die Variable "err"
    pipe        = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out, err    = pipe.communicate()
    print("command = ",command)
    #Ausgabe-String "out" in eine Python Datenstruktur "js" umwandeln
    js          = json.loads(out)
    #Umwandeln des Strings "js" in einen Ganzzahlwert (int)
    return  int(float(js['format']['duration']) + 1.)
Dadurch erhalte ich folgende Fehlermeldung:
Code:
MANI@MANI-SERV2:/$ python /volume1/TV-Aufzeichnungen/tvh_rec_import.py
Datei =  /volume1/TV-Aufzeichnungen/2024-02-07_18-07-00_Tele 5_Stargate.ts
command =  ['volume1/@appstore/ffmpeg6/bin/ffprobe', '-loglevel', 'quiet', '-print_format', 'json', '-show_format ', "'/volume1/TV-Aufzeichnungen/2024-02-07_18-07-00_Tele 5_Stargate.ts'"]
Traceback (most recent call last):
  File "/volume1/TV-Aufzeichnungen/tvh_rec_import.py", line 115, in <module>
    importRecord(recdir+"/"+filename, mask, api_url)
  File "/volume1/TV-Aufzeichnungen/tvh_rec_import.py", line 87, in importRecord
    video_duration = videoDuration(filepath)
  File "/volume1/TV-Aufzeichnungen/tvh_rec_import.py", line 71, in videoDuration
    js          = json.loads(out)
  File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.8/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Dabei finde ich meinen "ausgedruckten" Wert von command schon wieder komisch.
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat 

 
 
  AdBlocker gefunden!

Du bist nicht hier, um Support für Adblocker zu erhalten. Dein Adblocker funktioniert bereits ;-)

Klar machen Adblocker einen guten Job, aber sie blockieren auch nützliche Funktionen.

Das Forum wird mit hohem technischen, zeitlichen und finanziellen Aufwand kostenfrei zur Verfügung gestellt. Wir zeigen keine offensive Werbung und bemühen uns um eine dezente Integration.

Bitte unterstütze dieses Forum, in dem du deinen Adblocker für diese Seite deaktivierst.

Du kannst uns auch über unseren Kaffeautomat einen Kaffe ausgeben oder ein PUR Abo abschließen und das Forum so werbefrei nutzen.

Vielen Dank für Deine Unterstützung!