ffprobe zur Ermittlung der Dauer eines ts-Videos

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Nico81

Benutzer
Registriert
04. Jan. 2018
Beiträge
11
Reaktionspunkte
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?
 
  • Like
Reaktionen: Nico81
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
freut michEdit: deine Frage schaue ich mir morgen an.
 

Anhänge

  • IMG_4013.jpeg
    IMG_4013.jpeg
    135,4 KB · Aufrufe: 4
Danke! Dann lass es dir noch schmecken! ;)
 
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.

 
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.
 

Additional post fields

 

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