在 Linux 中导出音频文件音量 dB 级别
Posted
技术标签:
【中文标题】在 Linux 中导出音频文件音量 dB 级别【英文标题】:Export audio file volume dB levels in Linux 【发布时间】:2013-04-28 16:00:28 【问题描述】:我希望能够生成某种文件来存储音频文件的音量。我对此非常灵活,但一个例子是每秒显示音量的 csv。我不需要这个数字那么精确。
您对如何解决这个问题有什么建议吗?我会很感激的。
【问题讨论】:
您找到解决方案了吗? 【参考方案1】:您可以使用BASS library(非商业免费)并使用BASS_ChannelGetLevel()。
这是获取级别并将其输出到 STDOUT 的代码:
#include <cstddef>
#include <stdio.h>
#include <stdlib.h>
#include "bass.h"
int main(int argc, char **argv)
BASS_Init(0 /* "NO SOUND" device */, 44100, 0, 0, NULL);
if ( argc == 3 )
int block = atoi( argv[2] ); // take levels every argv[2] ms
if ( block < 20 )
block = 20;
HSTREAM chan = BASS_StreamCreateFile(FALSE, argv[1], 0, 0, BASS_STREAM_DECODE);
if ( chan )
// BASS_ChannelGetLevel takes 20ms from the channel
QWORD len = BASS_ChannelSeconds2Bytes(chan, (float)block / (float)1000 - (float)0.02);
char data[len];
DWORD level, left, right;
while ( -1 != (level = BASS_ChannelGetLevel(chan) ) ) // takes 20ms
left=LOWORD(level); // the left level
right=HIWORD(level); // the right level
printf("%i, %i\n", left, right);
BASS_ChannelGetData(chan, data, len); // get data away from the channel
BASS_StreamFree( chan );
BASS_Free();
return 0;
从bass24-linux.zip 存档中提取 bass.h 和 libbass.so 并使用以下命令构建 cpp 文件:
g++ levels.cpp -o levels -lbass
如何执行:levels 文件名毫秒(20minimum)
./levels 1.mp3 5000 >levels.txt
这里是levels.txt,每5秒采集一次(左声道,右声道):
1, 2
23235, 20363
22704, 20601
27203, 22476
10384, 12082
12059, 13387
9600, 10063
14590, 12261
16428, 14745
17569, 14723
29628, 27913
20799, 23554
24056, 20564
20344, 21242
21318, 22888
25389, 29050
27185, 23924
25469, 22540
28453, 29037
19669, 19797
16497, 16086
12081, 11843
20030, 20050
20512, 19537
19347, 14610
27673, 26563
26414, 24696
19775, 22869
24137, 25127
22093, 23184
26563, 24422
27718, 23791
24456, 26598
29353, 22647
562, 508
级别线性范围从 0(静音)到 32768(最大)。
6mb mp3 文件的时间,100ms 周期:
# time ./levels 1.mp3 100 >levels.txt
real 0m0.981s
user 0m0.972s
sys 0m0.008s
大约 1 秒生成 22Kb 的levels.txt 文件,周期为 100ms。
【讨论】:
@user1322158 如果您有任何问题,请随时与我联系。 我把bass.h, levels.cpp, and libbass.so
放在他们自己的目录中,然后运行g++
编译命令,但我得到一个错误:/usr/bin/ld: cannot find -lbass
我添加了-L .
告诉g++
在哪里可以找到libbass.so
。但是,我仍然得到“/usr/bin/ld:在搜索 -lbas 时跳过不兼容的 ./libbass.so”
接下来我将-m32
添加为默认为 32 位,因为我使用的是 64 位操作系统。但是,现在它抱怨/usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
在运行应用程序之前尝试运行export LD_LIBRARY_PATH="/path/to/bass/lib"
【参考方案2】:
伪代码:
open input (audio) file
open output (data) file
for each one second chunk
read samples for current chunk
calculate RMS value (rms = sqrt(sum(x^2)/N))
convert RMS value to dB (db = 20 * log10(rms))
save dB value in output file
close input file
close output file
【讨论】:
感谢 Paul 抽出宝贵时间输入。你能解释一下我如何打开/读取音频数据吗?谢谢。 有多种第三方库可用于处理音频文件 - 选择取决于您的操作系统/平台/编程语言以及您需要使用的音频文件格式。 我正在开发一个 CentOS 机器,我希望能够通过 shell 创建文件,但我愿意用几乎任何语言工作(假设我不需要学习太多了),音频文件格式无所谓,我可以转换成任何方便的格式。 好的——我可能会先看看libsox 感谢您的建议...我目前有以下命令sox file.wav -r 1 file.dat
输出类似 ; Sample Rate 10 ; Channels 2 0 0.00085449219 -0.0007019043 0.1 0.01348877 -0.011260986 0.2 0.015930176 -0.013214111 0.3 0.014923096 -0.012390137
的内容您愿意解释什么是 x 和 N(如果我使用sox 的正确参数)?非常感谢。以上是关于在 Linux 中导出音频文件音量 dB 级别的主要内容,如果未能解决你的问题,请参考以下文章
使用 CLI omxplayer 调整音频音量级别 - Raspberry Pi