Pull to refresh

Решение проблемы звука в одно ухо у некоторых роликов на Youtube

Reading time2 min
Views16K
Не очень давно столкнулся со следующей проблемой: при просмотре некоторых роликов на youtube звук идет только на левый спикер. При прослушивании через наушники это доставляет некоторые неудобства.

Было найдено програмное решение для Windows 7 с использованием powershell и библиотеки для работы со звуком NAudio. Основная идея — преобразовать стерео в моно.


  1. Скачать и распаковать архив с библиотекой
  2. Запустить из меню пуск PowerShell ISE
  3. Подключить типы из библиотеки, заменив путь на собственный:
    add-type -path 'C:/Users/xxxxx/Downloads/NAudio-Release/NAudio.dll'
    
  4. Запомнить id устройства вывода звука по умолчанию:
    $devices = new-object NAudio.CoreAudioApi.MMDeviceEnumerator
    $defaultDevice = $devices.GetDefaultAudioEndpoint([NAudio.CoreAudioApi.DataFlow]::Render, [NAudio.CoreAudioApi.Role]::Multimedia)
    $defaultDeviceId = $defaultDevice.ID -replace '{.+}\.{(.+)}$', '$1'
    
  5. Сменить устройство для вывода звука по умолчанию на любое альтернативное(программы не должны иметь возможности его менять):
    Control Panel->Hardware and Sound->Sound->Playback
  6. Выполнить следующий код, предварительно заменив 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()


  7. Заходим на youtube и смотрим ролик
  8. Остановить перенаправление можно так:
    $waveIn.stopRecording()
    $waveOut.stop()
    
  9. Не забудьте вернуть обратно устройство по умолчанию.

Метод не идеален: требуется наличие второго выводящего аудио устройства и глобальная переконфигурация.
P.S. У описанного выше подхода была альтернатива: вставить коннектор в разъем для наушников не полностью.
Tags:
Hubs:
Total votes 9: ↑4 and ↓5-1
Comments0

Articles