4

オーディオ ファイルの音量レベルを格納する何らかのファイルを生成できるようにしたいと考えています。私はこれについてかなり柔軟ですが、例として、毎秒ボリュームを示す csv があります。この数字はそれほど正確である必要はありません。

これにアプローチする方法について何か提案はありますか? 私はそれをお願い申し上げます。

4

2 に答える 2

5

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

実行方法: レベル ファイル名 ミリ秒(最小 20)

./levels 1.mp3 5000 >levels.txt

これは、5秒ごとに取得されたレベルを含むlevels.txtです(左チャンネル、右チャンネル):

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

100 ミリ秒周期で 22Kb の levels.txt ファイルを生成するのに約 1 秒。

于 2013-05-02T12:15:17.583 に答える
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
于 2013-04-28T16:24:04.657 に答える