Я ХОЧУ: Играть .mp3 только через один динамик - PullRequest
1 голос
/ 27 октября 2019

Я использую javascript и пытаюсь написать программу, которая, помимо прочего, будет воспроизводить mp3 через левый или правый динамик (он будет отличаться), но не оба одновременно. Однако я хочу, чтобы он был абсолютно бесшумным на другом громкоговорителе.

В прошлом я находил способы громко воспроизводить звук через один громкоговоритель, и хотя он должен быть бесшумным в другом громкоговорителе, он всегдаиграет через (хотя и тихо). Я думал, что это была ошибка моего компьютера, пока я не нашел тест левого и правого динамиков YouTube, который правильно воспроизводит только один динамик.

Я искал часы, пробуя узлы pannerNode, сплиттер, но что бы я ни делал,кажется, что он никогда не работает правильно (или вообще не работает).

Любая помощь будет принята с благодарностью!

В идеале вот что я хотел бы добавить:

sound1 = new Audio();
sound1.src = 'pizza.mp3';
sound1.play();

Если можно добавить код, чтобы он воспроизводился только через левый (или правый) динамик, это было бы здорово. И если это возможно, то не читайте дальше!

Я пробовал код сплиттера, который я получил в Интернете, и он должен быть в состоянии отключить звук влево или вправо, но, похоже, он будет толькоиграть на левом уровне громкости (или, точнее, на том, который я прикрепляю к точке 0 «splitter.connect (что-то, 0);» Кроме того, он воспроизводится через оба динамика на левом уровне громкости. Это может быть потому, что яЯ использую осциллятор в качестве теста (я не был уверен, как прикрепить к нему mp3), или это может быть, я делаю что-то радикально неправильное. Как я уже говорил, часы пробовал разные вещи, а аудио в javascript не моесила.

Ниже приведено то, что я пытался использовать, основываясь на чем-то, из чего я читал: MarijnS95. Однако, как я уже сказал, я не могу заставить его играть в .mp3, и он всегда будет играть слевагромкость, но через оба динамика. оригинальный пост

tone = new AudioContext();
tone.createGain = tone.createGain||tone.createGainNode; //fallback for gain naming
gainL = tone.createGain();
gainR = tone.createGain();

splitter = this.tone.createChannelSplitter(2);

//Connect splitter' outputs to each Gain Nodes
splitter.connect(gainR, 1);
splitter.connect(gainL, 0);

//Connect to source
source = tone.createOscillator();

//Connect the source to the splitter
source.connect(splitter,0,0);

//Connect Left and Right Nodes to the output
//Assuming stereo as initial status
gainL.connect(tone.destination, 0);
gainR.connect(tone.destination, 0);

//Mute left channel and set the right gain to normal
gainL.gain.value = 1;
gainR.gain.value = 0;

source.start();

Надеюсь, что это имеет какой-то смысл.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 октября 2019

Вы можете использовать StereoPannerNode вместо усиления и делителя:

var audioCtx = new AudioContext();

// Create a stereo panner
var pan = audioCtx.createStereoPanner();

// Shift panning to the left
pan.pan.value = -1;

//Connect to source
var source = audioCtx.createOscillator();
source.connect(pan);
pan.connect(audioCtx.destination, 0);

source.start();
...