it-swarm.com.de

Erhalte die Länge von .wav aus der Sox-Ausgabe

Ich muss die Länge einer .wav-Datei ermitteln.

Mit:

sox output.wav -n stat

Gibt:

Samples read:            449718
Length (seconds):     28.107375
Scaled by:         2147483647.0
Maximum amplitude:     0.999969
Minimum amplitude:    -0.999969
Midline amplitude:     0.000000
Mean    norm:          0.145530
Mean    amplitude:     0.000291
RMS     amplitude:     0.249847
Maximum delta:         1.316925
Minimum delta:         0.000000
Mean    delta:         0.033336
RMS     delta:         0.064767
Rough   frequency:          660
Volume adjustment:        1.000

Wie verwende ich grep oder eine andere Methode, um nur den Wert der Länge in der zweiten Spalte auszugeben, d. H. 28.107375?

Vielen Dank

34
joshu

Der stat-Effekt sendet seine Ausgabe an stderr. Verwenden Sie 2>&1, um zu stdout umzuleiten. Verwenden Sie sed, um die relevanten Bits zu extrahieren:

sox out.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p'
32
phihag

Es gibt einen besseren Weg:

soxi -D out.wav
41

Dies kann gemacht werden mit: 

  • soxi -D input.mp3 Die Ausgabe erfolgt direkt in Sekunden
  • soxi -d input.mp3 Die Ausgabe erfolgt in der Dauer mit dem folgenden Format hh: mm: ss.ss
12
Hadi Salem

Ich habe nur eine Option für die JSON-Ausgabe für die Effekte 'stat' und 'stats' hinzugefügt. Dadurch sollte es einfacher werden, Informationen über ein Audiofile zu erhalten. 

https://github.com/kylophone/SoxJSONStatStats

$ sox somefile.wav -n stat -json
4
Kyle Swanson

Das funktionierte für mich (in Windows):

sox --i -D out.wav
4
Dragonfly

Es gibt meine Lösung für C # (leider liefert sox --i -D out.wav in manchen Fällen ein falsches Ergebnis):

public static double GetAudioDuration(string soxPath, string audioPath)
{
    double duration = 0;
    var startInfo = new ProcessStartInfo(soxPath,
        string.Format("\"{0}\" -n stat", audioPath));
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardError = true;
    startInfo.RedirectStandardOutput = true;
    var process = Process.Start(startInfo);
    process.WaitForExit();

    string str;
    using (var outputThread = process.StandardError)
        str = outputThread.ReadToEnd();

    if (string.IsNullOrEmpty(str))
        using (var outputThread = process.StandardOutput)
            str = outputThread.ReadToEnd();

    try
    {
        string[] lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        string lengthLine = lines.First(line => line.Contains("Length (seconds)"));
        duration = double.Parse(lengthLine.Split(':')[1]);
    }
    catch (Exception ex)
    {
    }

    return duration;
}
1
Ivan Kochurkin

In CentOS 

sox out.wav -e stat 2> & 1 | sed -n 's # ^ Länge (Sekunden): [^ 0-9] ([0-9.] ) $ #\1 # p'

0
dkapa

für Ruby:

string = `sox --i -D file_wav 2>&1` 
string.strip.to_f
0
urbanczykd

sox-Stat-Ausgabe an Array und Json-Codierung

        $stats_raw = array();
        exec('sox file.wav -n stat 2>&1', $stats_raw);
        $stats = array();

        foreach($stats_raw as $stat) {
            $Word = explode(':', $stat);
            $stats[] = array('name' => trim($Word[0]), 'value' => trim($Word[1]));
        } 
        echo json_encode($stats);
0
msz