web-dev-qa-db-fra.com

Obtenir la longueur de .wav à partir de la sortie de sox

Je dois obtenir la longueur d'un fichier .wav.

En utilisant:

sox output.wav -n stat

Donne:

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

Comment utiliser grep ou une autre méthode pour ne générer que la valeur de la longueur dans la deuxième colonne, par exemple 28.107375?

Merci

34
joshu

L'effet stat envoie sa sortie à stderr, utilisez 2>&1 pour rediriger vers stdout Utilisez sed pour extraire les bits pertinents:

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

Il y a un meilleur moyen:

soxi -D out.wav
41
Andrew Kuklewicz

Cela peut être fait en utilisant: 

  • soxi -D input.mp3 la sortie sera la durée directement en secondes
  • soxi -d input.mp3 la sortie sera la durée au format suivant: hh: mm: ss.ss
12
Hadi Salem

Je viens d'ajouter une option pour la sortie JSON sur les effets 'stat' et 'stats'. Cela devrait vous faciliter un peu l’information sur un fichier audio. 

https://github.com/kylophone/SoxJSONStatStats

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

Cela a fonctionné pour moi (sous Windows):

sox --i -D out.wav
4
Dragonfly

Il y a ma solution pour C # (malheureusement, sox --i -D out.wav renvoie parfois un résultat erroné):

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

En CentOS 

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

0
dkapa

pour Ruby:

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

sox stat output to array et json encoder

        $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