Как получить аудио -образец данных естественным образом?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как получить аудио -образец данных естественным образом?

Сообщение Anonymous »

Я разрабатываю плагин Flutter, который сейчас нацелен только на Android. Это своего рода синтез; Пользователи могут загружать аудиофайл в память, и они могут настраивать шахту (не сдвиг шага) и воспроизводить несколько звуков с наименьшей задержкой, используя аудио библиотеку под названием гобо. в диапазоне от -1,0 до 1,0. Теперь я хочу поддерживать функцию панорамирования, как и то, что внутренний класс Android, такой как Soundpool. Я планирую следить за тем, как саунд -плюс справляется с панорамированием. Есть 2 значения, которые я должен передать в Soundpool при выполнении эффекта панорамирования: слева и справа. Эти 2 значения плавают и должны варьироваться от 0,0 до 1,0. < /P>
Например, если я прохожу (1,0F, 0,0F), то пользователи могут слышать звук только по левому уху. (1,0F, 1,0F) будет нормальным (в центре). Паннирование не было проблемой ... пока я не столкнулся с обработкой стерео звуков. Я знаю, что делать для выполнения панорамирования с помощью данных стерео PCM, но я не знаю, как выполнить естественный панорамирование. Напротив, если я попытаюсь изменить все звук на правую сторону, то левый канал звука должен быть воспроизведен в правой стороне. Я также заметил, что есть что -то, называемое правилом панорамирования , что означает, что звук должен быть немного громче, когда он смещен в сторону (около +3DB). Я попытался найти способ выполнить естественный эффект панорамирования, но я действительно не мог найти алгоритм или его ссылку.

Код: Выделить всё

[left_channel_sample_0, right_channel_sample_0, left_channel_sample_1, right_channel_sample_1,
...,
left_channel_sample_n, right_channel_sample_n]
< /code>
И я должен передать этот массив PCM к аудио -потоку, например, C ++ Код ниже < /p>
void PlayerQueue::renderStereo(float * audioData, int32_t numFrames) {
for(int i = 0; i < numFrames; i++) {
//When audio file is stereo...
if(player->isStereo) {
if((offset + i) * 2 + 1 < player->data.size()) {
audioData[i * 2] += player->data.at((offset + i) * 2);
audioData[i * 2 + 1] += player->data.at((offset + i) * 2 + 1);
} else {
//PCM data reached end
break;
}
} else {
//When audio file is mono...
if(offset + i < player->data.size()) {
audioData[i * 2] += player->data.at(offset + i);
audioData[i * 2 + 1] += player->data.at(offset + i);
} else {
//PCM data reached end
break;
}
}

//Prevent overflow
if(audioData[i * 2] > 1.0)
audioData[i * 2] = 1.0;
else if(audioData[i * 2] < -1.0)
audioData[i * 2] = -1.0;

if(audioData[i * 2 + 1] > 1.0)
audioData[i * 2 + 1] = 1.0;
else if(audioData[i * 2 + 1] < -1.0)
audioData[i * 2 + 1] = -1.0;
}

//Add numFrames to offset, so it can continue playing PCM data in next session
offset += numFrames;

if(offset >= player->data.size()) {
offset = 0;
queueEnded = true;
}
}
< /code>
Я исключил расчет воспроизведения, манипулирующего манипулированием для упрощения кода. Как видите, я должен вручную передавать данные PCM в Audiodata 
Float Array. Я добавляю данные PCM для выполнения смешивания нескольких звуков, включая тот же звук. Это будет хорошо, если мы сможем следовать механизмах Soundpool , но все будет хорошо, если я смогу правильно выполнить эффект панорамирования. (Пример: значение PAN может быть только от -1,0 до 1.0, 0 будет означать центрированное) < /p>
< /li>
[*] При применении правила панорамирования, какова взаимосвязь между PCM и Decibel? Я знаю, как изготовить звук громче, но я не знаю, как изготовить звук громче с точным децибелом. Есть ли формула для этого?



Подробнее здесь: https://stackoverflow.com/questions/670 ... -naturally
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»