Не очень давно столкнулся со следующей проблемой: при просмотре некоторых роликов на youtube звук идет только на левый спикер. При прослушивании через наушники это доставляет некоторые неудобства.
Было найдено програмное решение для Windows 7 с использованием powershell и библиотеки для работы со звуком NAudio. Основная идея — преобразовать стерео в моно.
Метод не идеален: требуется наличие второго выводящего аудио устройства и глобальная переконфигурация.
P.S. У описанного выше подхода была альтернатива: вставить коннектор в разъем для наушников не полностью.
Было найдено програмное решение для Windows 7 с использованием powershell и библиотеки для работы со звуком NAudio. Основная идея — преобразовать стерео в моно.
- Скачать и распаковать архив с библиотекой
- Запустить из меню пуск PowerShell ISE
- Подключить типы из библиотеки, заменив путь на собственный:
add-type -path 'C:/Users/xxxxx/Downloads/NAudio-Release/NAudio.dll'
- Запомнить id устройства вывода звука по умолчанию:
$devices = new-object NAudio.CoreAudioApi.MMDeviceEnumerator $defaultDevice = $devices.GetDefaultAudioEndpoint([NAudio.CoreAudioApi.DataFlow]::Render, [NAudio.CoreAudioApi.Role]::Multimedia) $defaultDeviceId = $defaultDevice.ID -replace '{.+}\.{(.+)}$', '$1'
- Сменить устройство для вывода звука по умолчанию на любое альтернативное(программы не должны иметь возможности его менять):
Control Panel->Hardware and Sound->Sound->Playback - Выполнить следующий код, предварительно заменив id устройства на собственное:
$waveIn = new-object NAudio.Wave.WasapiLoopbackCapture $waveOut = new-object NAudio.Wave.DirectSoundOut($defaultDeviceId, 100) $waveInProvider = new-object NAudio.Wave.WaveInProvider($waveIn) $waveProvider16 = new-object NAudio.Wave.WaveFloatTo16Provider($waveInProvider) $monoProvider16 = new-object NAudio.Wave.StereoToMonoProvider16($waveProvider16) $monoProvider16.leftVolume = 1 $monoProvider16.rightVolume = 1 $waveOut.init($monoProvider16) $waveOut.play() $waveIn.startRecording()
подробное описаниеЗахватываем весь звук, выводящийся на новое устройство по умолчанию:
$waveIn = new-object NAudio.Wave.WasapiLoopbackCapture
Выводим звук на предыдущее устройство по умолчанию(к его разъему подключены наушники) с задержкой 100мс для предотвращения щелчков:
$waveOut = new-object NAudio.Wave.DirectSoundOut($defaultDeviceId, 100)
У нас есть конвертер стерео в моно, но он работает только с 16 битным форматом. Также есть конвертер в соответствующий формат. Применяя их последовательно, достигаем желаемого результата:
$waveProvider16 = new-object NAudio.Wave.WaveFloatTo16Provider($waveInProvider) $monoProvider16 = new-object NAudio.Wave.StereoToMonoProvider16($waveProvider16)
Устанавливаем громкость для правого и левого каналов:
$monoProvider16.leftVolume = 1 $monoProvider16.rightVolume = 1
Привязываем выходу:
$waveOut.init($monoProvider16)
Запускаем процесс:
$waveOut.play() $waveIn.startRecording()
- Заходим на youtube и смотрим ролик
- Остановить перенаправление можно так:
$waveIn.stopRecording() $waveOut.stop()
- Не забудьте вернуть обратно устройство по умолчанию.
Метод не идеален: требуется наличие второго выводящего аудио устройства и глобальная переконфигурация.
P.S. У описанного выше подхода была альтернатива: вставить коннектор в разъем для наушников не полностью.