C:\Program Files\sox-14-4-0>sox Sample.wav -n stat
上面的代码给出了下面的结果
Samples read: 26640
Length (seconds): 3.330000
Scaled by: 2147483647.0
Maximum amplitude: 0.515625
Minimum amplitude: -0.734375
Midline amplitude: -0.109375
Mean norm: 0.058691
Mean amplitude: 0.000122
RMS amplitude: 0.101146
Maximum delta: 0.550781
Minimum delta: 0.000000
Mean delta: 0.021387
RMS delta: 0.041831
Rough frequency: 526
Volume adjustment: 1.362
现在我只需要平均振幅。如何做到这一点?
最佳答案
有几种方法。
方法一:
"C:\Program Files\sox-14-4-0\sox" Sample.wav -n stat | find "Mean amplitude: " > %TMP%\amp.tmp
set /p meanAMP=<%TMP%\amp.tmp
set meanAMP=%meanAMP:*: =%
del %TMP%\amp.tmp
echo %meanAMP%
方法2:
for /f "tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat') do (
if "%%x %%y"=="Mean amplitude:" set meanAMP=%%z
)
echo %meanAMP%
最快:
方法3:
for /f "skip=7 tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat') do (
if "%%x %%y"=="Mean amplitude:" set meanAMP=%%z
)
echo %meanAMP%
方法4:
for /f "tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat ^| find "Mean amplitude:"') do (
set meanAMP=%%z
)
echo %meanAMP%
我怀疑方法 3 是最快的,因为:
方法一使用了很多步骤,包括外部程序find
,临时文件的创建、访问和删除,以及变量的重新定义。
方法 2 检查 SOX
的所有输出。
方法 4 使用外部程序 find
,这会减慢执行速度。
方法 3 实际上跳过了 SOX
的前 7 行输出,然后开始评估输出。
注意:方法 2-4 都可以在一行中完成,只需删除 (
和 )
即可。
编辑:修复了代码中的一些错误。
注意:从命令提示符使用方法 1 应该按原样工作。方法 2-4 需要将所有 %%
更改为 %
。
例如,您可以将其直接粘贴到 cmd
中:
for /f "skip=7 tokens=1-3" %%x in ('"%ProgramFiles%\sox-14-4-0\sox" Sample.wav -n stat') do (
if "%x %y"=="Mean amplitude:" set meanAMP=%z
)
echo %meanAMP%
请注意,这几乎是方法 3 的精确副本,只是我更改了 %%x
、%%y
和 %%z
分别为 %x
、%y
和 %z
。
关于cmd - 从 sox 获取 .wav 的平均振幅(仅),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12383496/