AudioContext przesuwanie dźwięku odtwarzanych mediów
Zastanawiam się, czy istnieje sposób na przesuwanie dźwięku wideo za pomocą JavaScript.
W ten sam sposób, w jaki można regulować głośność, muszę przesuwać dźwięk stereo w lewo do prawej lub od prawej do lewej.
Ta funkcja byłaby przydatna w przypadku wydarzeń wielojęzycznych, w których można utworzyć wideo w dwóch językach za pomocą stereo, na przykład pan english audio do lewego i niemieckiego do prawej. Następnie odtwarzacz może przekształcić ścieżkę stereo w mono muting jednego z języków w zależności od wyboru użytkownika.
Zaimplementowałem tę funkcję w pamięci flash przy użyciu klasy SoundTransformhttp://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundTransform.html#pan.
Myślę, że odpowiednikiem html SoundTransform jest AudioContexthttp://www.w3.org/TR/webaudio/#AudioContext-section.
Czy mogę uzyskać dostęp do kontekstu audio odtwarzanego wideo?
AKTUALIZACJA: Po kilku intensywnych badaniach odkryłem rozwiązanie. Oto kod javascript, którego użyłem do stworzenia wtyczki videjs-stereopanner:
//Init AudioContext
var context = new AudioContext();
var gainL = context.createGainNode();
var gainR = context.createGainNode();
gainL.gain.value = 1;
gainR.gain.value = 1;
var merger = this.context.createChannelMerger(2);
var splitter = this.context.createChannelSplitter(2);
//Connect to source
var source = context.createMediaElementSource(node);
//Connect the source to the splitter
source.connect(splitter, 0, 0);
//Connect splitter' outputs to each Gain Nodes
splitter.connect(gainL, 0);
splitter.connect(gainR, 1);
//Connect Left and Right Nodes to the Merger Node inputs
//Assuming stereo as initial status
gainL.connect(merger, 0, 0);
gainR.connect(merger, 0, 1);
//Connect Merger output to context destination
merger.connect(context.destination, 0, 0);
//Disconnect left channel and connect right to both stereo outputs
var function = panToRight(){
gainL.disconnect();
gainR.connect(merger, 0, 1);
};
//Disconnect right channel and connect left to both stereo outputs
var function = panToLeft(){
gainR.disconnect();
gainL.connect(merger,0,0);
}
//Restore stereo
var function = panToStereo(){
gainL.connect(merger, 0, 0);
gainR.connect(merger, 0, 1);
}
To działa dla mnie tylko w Chrome. Jeśli spróbuję wykonać ten skrypt na iPadzie / Safari, otrzymuję denerwujący dźwięk, który prawie mnie ogłuszył. Czekam, aż Safari zaimplementuje całe API audio.