在Linux中导出audio文件音量dB级别

我希望能够生成某种文件,将存储audio文件的音量级别。 我对此非常灵活,但是一个例子就是每秒钟都会显示音量的csv。 我不需要这个数字是那么精确。

你有什么build议如何解决这个问题? 我会很感激。

您可以采取BASS库 (免费为非商业),并使用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 filename毫秒(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 

大约一秒产生22Kb levels.txt文件,周期为100ms。

伪代码:

 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