audio grep pipe wav sox

audio - Obtenga la longitud de.wav de sox output



grep pipe (8)

Acabo de agregar una opción para salida JSON en los efectos ''stat'' y ''stats''. Esto debería facilitar un poco la obtención de información sobre un audiofilo.

https://github.com/kylophone/SoxJSONStatStats

$ sox somefile.wav -n stat -json

Necesito obtener la longitud de un archivo .wav.

Utilizando:

sox output.wav -n stat

Da:

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

¿Cómo uso grep o algún otro método para solo generar el valor de la longitud en la segunda columna, es decir, 28.107375?

Gracias


El efecto stat envía su salida a stderr , use 2>&1 para redirigir a stdout . Usa sed para extraer los bits relevantes:

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


En CentOS

sox out.wav -e stat 2> & 1 | sed -n ''s # ^ Longitud (segundos): [^ 0-9] ([0-9.] ) $ # / 1 # p''


Esto funcionó para mí (en Windows):

sox --i -D out.wav


Esto se puede hacer usando:

  • soxi -D input.mp3 la salida será la duración directamente en segundos
  • soxi -d input.mp3 la salida será la duración con el siguiente formato hh: mm: ss.ss

Existe mi solución para C # (desafortunadamente sox --i -D out.wav devuelve resultados incorrectos en algunos casos):

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; }


Hay una mejor manera:

soxi -D out.wav


Sox Stat salida a array y json codificar

$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);