it-swarm.com.de

Wie extrahiere ich die Dauer aus der ffmpeg-Ausgabe?

Um viele Informationen über eine Mediendatei zu erhalten, kann man dies tun

ffmpeg -i <filename>

dort werden viele Zeilen ausgegeben, insbesondere eine

Duration: 00:08:07.98, start: 0.000000, bitrate: 2080 kb/s

Ich möchte nur 00:08:07.98 ausgeben, also versuche ich es

ffmpeg -i file.mp4 | grep Duration| sed 's/Duration: \(.*\), start/\1/g'

Aber es druckt alles und nicht nur die Länge.

Sogar ffmpeg -i file.mp4 | grep Duration gibt alles aus.

Wie bekomme ich nur die Dauerlänge?

54
Louise

ffmpeg schreibt diese Informationen an stderr, nicht an stdout. Versuche dies:

ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g'

Beachten Sie die Umleitung von stderr an stdout: 2>&1

BEARBEITEN:

Ihre sed-Anweisung funktioniert auch nicht. Versuche dies:

ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
46
Louis Marascio

Sie können ffprobe verwenden:

ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0"

Die Dauer wird in Sekunden ausgegeben, z. B .:

154.12

Durch Hinzufügen der Option -sexagesimal wird die Dauer als Stunden: Minuten: Sekunden.Mikrosekunden : ausgegeben.

00:02:34.12
104
Ivan Neeson

Aus meiner Erfahrung bieten viele Werkzeuge die gewünschten Daten in einer Art Tabelle/geordneter Struktur an und bieten auch Parameter zum Erfassen bestimmter Teile dieser Daten. Dies gilt für z. smartctl, nvidia-smi und ffmpeg/ffprobe ebenfalls. Einfach gesagt: Oft müssen keine Daten umgeleitet oder Subshells für eine solche Aufgabe geöffnet werden.

Als Konsequenz würde ich das richtige Werkzeug für den Job verwenden - in diesem Fall würde ffprobe den Wert der Rohdauer in Sekunden zurückgeben, danach könnte man selbst das gewünschte Zeitformat erstellen:

$ ffmpeg --version
ffmpeg version 2.2.3 ...

Der Befehl kann je nach verwendeter Version variieren.

#!/usr/bin/env bash
input_file="/path/to/media/file"

# Get raw duration value
ffprobe -v quiet -print_format compact=print_section=0:nokey=1:escape=csv -show_entries format=duration "$input_file"

Eine Erklärung:

"-v quiet": Geben Sie nur den gewünschten Rohdatenwert aus

"-print_format": Verwenden Sie ein bestimmtes Format, um die Daten auszudrucken

"compact =": Verwenden Sie ein kompaktes Ausgabeformat

"print_section = 0": Der Abschnittsname wird nicht gedruckt

": nokey = 1": Der Schlüssel des Schlüsselpaares "Wert" wird nicht gedruckt

": escape = csv": Der Wert kann entkommen

"-show_entries format = duration": Ruft Einträge eines Felds mit der Bezeichnung "duration" in einem Abschnitt mit dem Namen "Format" ab

Referenz: ffprobe Manpages

11
Saucier

Im Falle eines Anforderungsparameters ist es einfacher, mediainfo und seine Ausgabeformatierung so zu verwenden (für Dauer; Antwort in Millisekunden)

amber ~ > mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi 
24840
5
gemelen

Ich empfehle das Json-Format, es ist einfacher für das Parsen

ffprobe -i your-input-file.mp4 -v quiet -print_format json -show_format -show_streams -hide_banner

{
    "streams": [
        {
            "index": 0,
            "codec_name": "aac",
            "codec_long_name": "AAC (Advanced Audio Coding)",
            "profile": "HE-AACv2",
            "codec_type": "audio",
            "codec_time_base": "1/44100",
            "codec_tag_string": "[0][0][0][0]",
            "codec_tag": "0x0000",
            "sample_fmt": "fltp",
            "sample_rate": "44100",
            "channels": 2,
            "channel_layout": "stereo",
            "bits_per_sample": 0,
            "r_frame_rate": "0/0",
            "avg_frame_rate": "0/0",
            "time_base": "1/28224000",
            "duration_ts": 305349201,
            "duration": "10.818778",
            "bit_rate": "27734",
            "disposition": {
                "default": 0,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0
            }
        }
    ],
    "format": {
        "filename": "your-input-file.mp4",
        "nb_streams": 1,
        "nb_programs": 0,
        "format_name": "aac",
        "format_long_name": "raw ADTS AAC (Advanced Audio Coding)",
        "duration": "10.818778",
        "size": "37506",
        "bit_rate": "27734",
        "probe_score": 51
    }
}

sie können die Dauerinformationen im Formatbereich finden und funktioniert sowohl für Video als auch für Audio

2
vivisidea
ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

gibt Ausgabe

HH: MM: SS.milisecs

1
sparsh turkane

Wenn Sie die Länge (und möglicherweise alle anderen Metadaten) mit ffmpeg mithilfe eines Python-Skripts aus Ihrer Mediendatei abrufen möchten, können Sie Folgendes versuchen:

import subprocess
import json

input_file  = "< path to your input file here >"

metadata = subprocess.check_output(f"ffprobe -i {input_file} -v quiet -print_format json -show_format -hide_banner".split(" "))

metadata = json.loads(metadata)
print(f"Length of file is: {float(length["format"]["duration"])}")
print(metadata)

Ausgabe:

Length of file is: 7579.977143

{
  "streams": [
    {
      "index": 0,
      "codec_name": "mp3",
      "codec_long_name": "MP3 (MPEG audio layer 3)",
      "codec_type": "audio",
      "codec_time_base": "1/44100",
      "codec_tag_string": "[0][0][0][0]",
      "codec_tag": "0x0000",
      "sample_fmt": "fltp",
      "sample_rate": "44100",
      "channels": 2,
      "channel_layout": "stereo",
      "bits_per_sample": 0,
      "r_frame_rate": "0/0",
      "avg_frame_rate": "0/0",
      "time_base": "1/14112000",
      "start_pts": 353600,
      "start_time": "0.025057",
      "duration_ts": 106968637440,
      "duration": "7579.977143",
      "bit_rate": "320000",
      ...
      ...
0
petezurich

Für diejenigen, die dieselben Berechnungen ohne zusätzliche Software unter Windows ausführen möchten, finden Sie hier das Skript für das Befehlszeilenskript:

set input=video.ts

ffmpeg -i "%input%" 2> output.tmp

rem search "  Duration: HH:MM:SS.mm, start: NNNN.NNNN, bitrate: xxxx kb/s"
for /F "tokens=1,2,3,4,5,6 delims=:., " %%i in (output.tmp) do (
    if "%%i"=="Duration" call :calcLength %%j %%k %%l %%m
)
goto :EOF

:calcLength
set /A s=%3
set /A s=s+%2*60
set /A s=s+%1*60*60
set /A VIDEO_LENGTH_S = s
set /A VIDEO_LENGTH_MS = s*1000 + %4
echo Video duration %1:%2:%3.%4 = %VIDEO_LENGTH_MS%ms = %VIDEO_LENGTH_S%s

Gleiche Antwort hier: Wie man die letzten N Sekunden aus einem TS-Video schneidet

0
digitalfootmark

Beste Lösung: Schneiden Sie den Export etwas ab, wie00: 05: 03.22

ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
0
Mike