Ответ 1
Эффект stat
отправляет свой результат на stderr
, используйте 2>&1
для перенаправления на stdout
. Используйте sed
для извлечения соответствующих бит:
sox out.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p'
Мне нужно получить длину WAV файла.
Использование:
sox output.wav -n stat
дает:
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
Как использовать grep или какой-либо другой метод только для вывода значения длины во втором столбце, то есть 28.107375?
Спасибо
Эффект stat
отправляет свой результат на stderr
, используйте 2>&1
для перенаправления на stdout
. Используйте sed
для извлечения соответствующих бит:
sox out.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p'
Существует лучший способ:
soxi -D out.wav
Это можно сделать, используя:
soxi -D input.mp3
вывод будет длительностью непосредственно в секундахsoxi -D input.mp3
выход будет длительностью в следующем формате hh: mm: ss.ssЭто работало для меня (в Windows):
sox --i -D out.wav
Я просто добавил параметр для вывода JSON на эффекты "stat" и "stats". Это должно облегчить получение информации об аудиофайле.
https://github.com/kylophone/SoxJSONStatStats
$ sox somefile.wav -n stat -json
Есть мое решение для С# (к сожалению, sox --i -D out.wav
возвращает неверный результат в некоторых случаях):
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;
}
В CentOS
sox out.wav -e stat 2 > & 1 | sed -n 's # ^ Длина (секунды): [^ 0-9] ([0-9.]) $#\1 # p'
выход sox stat для массива и json encode
$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);