Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 10.12.2019, 23:53
Аватар для Опан1
Аспирант
Отправить личное сообщение для Опан1 Посмотреть профиль Найти все сообщения от Опан1
 
Регистрация: 10.09.2019
Сообщений: 35

Т. е., хотите сказать, что с помощью decodeAudioData() это можно определить? Каким образом?
К примеру, каждый семпл занимает байт Если в context.createBuffer() указать один канал, то каждый байт следует читать, как новый семпл, если указать 2 канала - то каждый первый байт будет для левого, а каждый второй для правого канала, и т. д. Если Каждый семпл занимает 2 байта, то первый из них следует читать, как младшую половину всего слова, второй - старшую. Если эти ещё и стерео, то на каждый семпл придётся соответственно 4 байта. Так и читать.
Да, как с помощью decodeAudioData() заставить массив байт играть с нужной частотой семплирования? Т. е., как это значение декодировать из массива байт?
Т. е., у аудиофайла стандартного формата есть заголовок - в таком-то байте находится количество каналов, в таком-то - количество байт на семпл, в таких-то байтах частота семплирования. Где эта информация в массиве байт?

Последний раз редактировалось Опан1, 11.12.2019 в 02:09.
Ответить с цитированием
  #12 (permalink)  
Старый 11.12.2019, 18:33
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Опан1,
decodeAudioData генерирует audioBuffer у которого есть свойства numberOfChannels, length, sampleRate, правда sampleRate там не оригинальный, возможно это недоработка технологии. Есть audioContext.sampleRate, определяется как new AudioContext({ sampleRate: 8000 }), если нет берется с устройства. На этой частоте воспроизводится всё что относится к этому контексту, автоматически ресемплится.

Последний раз редактировалось Rise, 11.12.2019 в 18:41.
Ответить с цитированием
  #13 (permalink)  
Старый 12.12.2019, 00:49
Аватар для Опан1
Аспирант
Отправить личное сообщение для Опан1 Посмотреть профиль Найти все сообщения от Опан1
 
Регистрация: 10.09.2019
Сообщений: 35

Я знаю, но перед этим Вы говорили, что без декодирования sampleRate будет неопределённым.

Последний раз редактировалось Опан1, 12.12.2019 в 00:52.
Ответить с цитированием
  #14 (permalink)  
Старый 12.12.2019, 08:24
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Опан1,
Я имел в виду, что для decodeAudioData не нужно знать sampleRate и numberOfChannels, чтобы получить AudioBuffer, просто передается ArrayBuffer всего файла и всё, а для createBuffer нужно знать, потому что, если использовать дефолтный sampleRate, то у разных пользователей он может оказаться разным и получится, например, разная продолжительность:
// Известна только длина массива
var length = 44100 * 100;

// Пользователь 1
var ctx1 = new AudioContext({ sampleRate: 44100 });

// Пользователь 2
var ctx2 = new AudioContext({ sampleRate: 48000 });

// Допустим это моно (непонятно откуда это известно):
var buf1 = ctx1.createBuffer(1, length, ctx1.sampleRate);
var buf2 = ctx2.createBuffer(1, length, ctx2.sampleRate);

// Проверим утверждение
console.assert(buf1.duration == buf2.duration, '%s != %s', buf1.duration, buf2.duration);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Соединение массива Artur_Hopf Общие вопросы Javascript 4 07.06.2018 16:48
Обход многомерного массива с задержкой после каждого цикла Walk Общие вопросы Javascript 2 14.08.2017 16:17
Помогите к js коду, написать html код Modrih Элементы интерфейса 8 16.06.2015 18:08
Ввод диапазона значений массива с клавиатуры Воскобоенко Общие вопросы Javascript 11 06.06.2015 22:34
Как проиграть звук на сайте один раз за сеанс. tuchkovo-auto Общие вопросы Javascript 3 21.05.2014 11:13