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