-
ancot (12.08.11 08:59) [0]Всем привет!
Работаю с bass.dll. Есть необходимость быстро просканировать mp3 файл и получить пиковые значение уровня громкости на на каждую десятую(лучше тысячную) секунды(для отображения графика а-ля soundforge).
BASS_ChannelGetLevel выдает уровень на текущую позицию канала.
Пытался в цикле последовательно переставлять позицию на 1 байт и замерять громкость. Работает дико медленно.
len := BASS_ChannelGetLength(chan, ASS_POS_BYTE);
for i := 0 to len do
begin
BASS_ChannelSetPosition(chan, i, BASS_POS_BYTE );
level := BASS_ChannelGetLevel(chan);
end;
Можно конечно получать значения громкости на каждую секунду, а не на байт. Но этого слишком большое разрешение.
Может есть другое решение? -
ancot (12.08.11 13:39) [1]Разобрался. ChannelBytes2Seconds и ChannelSeconds2Bytes работают не с целыми секундами, а с секундами с плавающей точкой
len := BASS_ChannelGetLength(chan, BASS_POS_BYTE); // Длинна в байтах
len_sec := BASS_ChannelBytes2Seconds(chan, len); // Длинна в секундах
pos := 0; //Позиция в секундах
while (pos <= len_sec) do
begin
byte_pos := BASS_ChannelSeconds2Bytes(chan, pos); // Позиция в байтах
BASS_ChannelSetPosition(chan, byte_pos, BASS_POS_BYTE);
level := BASS_ChannelGetLevel(chan);
...
pos := pos + 0.1; //Шаг 100 миллисекунд
end; -
QAZ (12.08.11 15:40) [2]ниправильно
-
ancot (16.08.11 08:15) [3]Может тогда намекнете какие еще есть варианты?
-
QAZ (16.08.11 11:29) [4]len := BASS_ChannelGetLength(chan, BASS_POS_BYTE); // Длинна в байтах
while (BASS_ChannelGetPosition(chan,BASS_POS_BYTE) < len) do
begin
level := BASS_ChannelGetLevel(chan);
left:=LOWORD(level);
right:=HIWORD(level);
...
end;
BASS_ChannelGetLevel декодирует данные размером с буфер и выдает среднее значение амплитуды
при этом позиция в файле смещается сама
и ссответсно чтобы получить большее "разрешение" нужно использовать другие методы