Обработка Waveform | JS

Рейтинг: 0Ответов: 1Опубликовано: 11.07.2023

На сервере waveform создается с помощью команды:

ffprobe -hide_banner -v error -f lavfi -i amovie=${file_path},astats=metadata=1:reset=1 -show_entries frame=pkt_pts_time:frame_tags=lavfi.astats.Overall.RMS_level -of csv=p=0

А на фронте звук анализируется с помощью АудиоКонтекста:

const audioContext = new AudioContext();
const source = audioContext.createMediaStreamSource(mediaStream);
const analyser = audioContext.createAnalyser();
analyser.fftSize = 64;
source.connect(analyser);

const dataLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(dataLength);
let isDestroyed = false;

function tick() {
    if (isDestroyed) {
        return;
    }

    analyser.getByteFrequencyData(dataArray);

    const sum = dataArray.reduce((acc, current) => acc + current, 0);
    const mean = (sum / dataLength);
    const volume = mean / 255;

    cb(volume < 0.1 ? 0 : volume) <- просто добавляется как новый элемент в массив;

    tick;
}

tick();

Проблема в том, что на фронте все значения массива [0, 0, 0, 0, 0.2, 0.3, ...] положительны и от 0 до 1, а с сервера приходят [-100.455, -104.73, -104.671, -107.294, -108.371, -66.827, -76.958, -56.94, -70.662, -71.7, -71.834, -73.791, -73.803, -76.743, -66.634, -76.693, -81.131, -63.331, -62.145, -71.967, -78.733, -58.017, -18.086, -14.999, -14.719, -16.134, -16.677, -17.088, -17.472, -18.019, -17.907, -18.71, -19.181, -19.564, -19.985, -20.719, -20.738, -20.834, -21.234, -21.566, -21.843, -26.398, -51.685, -68.449, -82.437, -85.498, -89.719, -84.046]. Мало того, что они отрицательны, так ещё и не понятно, как их обработать так, чтобы они прошли к тому же виду, что и на фронте (не понятно, как определять мин/cред/макс значения)

Как привести серверные данные к формату фронта или наоборот?

Ответы

▲ 0

Преобразование одного диапазона чисел в другой - это всего лишь математическая операция. Допустим, входные данные начинаются числом -100 и заканчиваются нулём, а на выходе нам нужно получить диапазон от 0 до 1, то для этого подойдёт такая формула:

let out = (in + 100) / 100;

, где in - входное значение.