https://github.com/microsoft/Windows-cl ... onLoopback
Моя цель — использовать петлю обработки (через AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK), чтобы я может записывать системный микс через звуковой движок Windows, не устанавливая драйверы и не выполняя какие-либо инъекции/перехваты.
В моем основном случае использования я хочу записывать звук из всех приложений, кроме моего собственного, поэтому я использую PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE. Я также протестировал PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE, чтобы исключить это.
Что работает
Используя подход ApplicationLoopback с VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, мое приложение для захвата успешно записывает звук для:
- Slack
- Zoom
- Google Meet в Chrome/Edge
- Собрания Microsoft Teams в браузере (Edge/Chrome)
- Видео YouTube в браузере
Что не так
Проблема только с настольным приложением Microsoft Teams (
Код: Выделить всё
ms-teams.exe- С зацикливанием процесса (стиль ApplicationLoopback):
Запись имеет правильную продолжительность и формат. - Но аудиобуфер фактически все нули (тишина), когда источником звука является рабочий стол Teams. собрание.
Что странно, так это то, что я могу записывать, используя метод обратной связи старого устройства (иногда я буду называть это обратной связью конечной точки) https://learn.microsoft.com/en-us/windo ... g-a-stream
Несколько потоков MS Teams
Для дальнейшего исследования я написал небольшой диагностический инструмент, который перечисляет аудиосеансы для данного процесса с помощью IAudioSessionManager2 и считывает пиковые уровни с помощью IAudioMeterInformation.
Для устройства вывода, используемого Teams во время собрания, я вижу следующее:
- Два сеанса рендеринга для ms-teams.exe на одном устройстве рендеринга плюс один сеанс захвата.
- Оба сеанса рендеринга:
Имеют одинаковый идентификатор процесса ().Код: Выделить всё
ms-teams.exe - Показывать ненулевые пиковые и средние уровни во время воспроизведения звука собрания.
- Часто имеют одинаковые или очень похожие значения измерения.
Например (упрощенный вывод выборки):
Код: Выделить всё
Session [0]:
Session GUID: {0.0.0.00000000}.{6474f13d-839f-4be8-b36c-f653233effdd}|\Dev...
Grouping GUID: {C82CDF72-3957-4B52-ABF2-9ACA5F8153A1}
Samples w/ Audio: 32 / 50 (64%)
Max Peak Level: 49.6552%
Avg Peak Level: 12.5515%
*** THIS SESSION HAS SIGNIFICANT AUDIO ACTIVITY ***
Session [1]:
Session GUID: {0.0.0.00000000}.{6474f13d-839f-4be8-b36c-f653233effdd}|\Dev...
Grouping GUID: {C82CDF72-3957-4B52-ABF2-9ACA5F8153A1}
Samples w/ Audio: 32 / 50 (64%)
Max Peak Level: 49.6552%
Avg Peak Level: 12.642%
*** THIS SESSION HAS SIGNIFICANT AUDIO ACTIVITY ***
Код: Выделить всё
=== Render Devices ===
Speakers (Realtek(R) Audio) [48000 Hz, 32-bit, 2 ch (Float)] : 0 active sessions
ID: {0.0.0.00000000}.{357dc357-13e3-4cdb-90c9-ab54f23dedcf}
XG27ACS (Intel(R) Display Audio) [48000 Hz, 32-bit, 2 ch (Float)] : 0 active sessions
ID: {0.0.0.00000000}.{4af2ff2a-e7bf-4a47-8de4-876e9ba2d6ce}
Speakers (Razer BlackShark V2 HS 2.4) [48000 Hz, 32-bit, 2 ch (Float)] [Default: Console, Multimedia, Communications] : 2 active sessions
ID: {0.0.0.00000000}.{6474f13d-839f-4be8-b36c-f653233effdd}
- ms-teams.exe PID: 10596
- ms-teams.exe PID: 10596
CABLE Input (VB-Audio Virtual Cable) [48000 Hz, 32-bit, 2 ch (Float)] : 0 active sessions
ID: {0.0.0.00000000}.{65fbe74c-81c9-4c39-8a75-55033aa39f4c}
CABLE In 16ch (VB-Audio Virtual Cable) [48000 Hz, 32-bit, 2 ch (Float)] : 0 active sessions
ID: {0.0.0.00000000}.{a2a0ed57-95c3-4689-b0ff-efabb8c3efe1}
Поэтому Windows думает, что Teams активно рендерит звук (метры движутся в обоих сеансах), и петля конечной точки слышит это, но поток замыкания процесса, нацеленный на PID Teams, по-прежнему равен нулю.
/>Мне не известен какой-либо API, который позволил бы мне выбрать конкретный сеанс/поток рендеринга для обратной связи процесса; насколько мне известно, AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS позволяет мне указать только PID и режим включения/исключения.
Что я проверял
- Несколько машин (разные производители, разное аудиооборудование): поведение одинаковое.
- Разное Версии Teams, включая не менее 25306.804.4102.7193 (и более ранние сборки): поведение такое же.
- Проверено:
Teams определенно воспроизводит звук через устройство вывода по умолчанию. - Конечная точка «слышит» обратную связь это.
- Другие приложения нормально захватываются через циклическую проверку процесса на тех же компьютерах.
Я знаю, что другие люди наблюдают подобные симптомы (например, ActivateAudioInterfaceAsync циклическая проверка процесса не захватывает команды, одновременно захватывая другие приложения, и OBS/ win-capture-audio не захватывает новый клиент Teams посредством захвата каждого приложения, хотя захват устройства все еще работает), но я нигде не видел сообщения о каком-либо решении.
Что я хочу знать
- Существует ли какой-либо поддерживаемый способ гарантировать, что звук из настольного приложения Teams включен в поток обратной связи процесса, так же, как для других приложений и для Teams в браузере?
- Или рабочий стол Teams использует специальный путь аудио, который не отображается через петлю процесса (и если да, то задокументировано ли это где-нибудь)?
Подробнее здесь: https://stackoverflow.com/questions/798 ... d-ms-teams
Мобильная версия