Loopback приложения WASAPI не может записывать команды MSC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Loopback приложения WASAPI не может записывать команды MS

Сообщение Anonymous »

Я пытаюсь разработать приложение для записи системного звука, которое использует метод обратной связи приложения, предоставляемый WASAPI. Я основываю свою реализацию на примере цикла обратной связи классического приложения Windows:
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 в браузере
Во всех этих случаях выходной WAV содержит допустимый звук, как и ожидалось.
Что не так
Проблема только с настольным приложением 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}
Для всех других приложений, таких как Slack, Zoom, Chrome и т. д., в этом сценарии я вижу только один сеанс рендеринга для каждого процесса на одном и том же устройстве.
Поэтому 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 использует специальный путь аудио, который не отображается через петлю процесса (и если да, то задокументировано ли это где-нибудь)?
Я не ищу решения, включающие виртуальные аудиодрайверы или внедрение в Teams; Я специально спрашиваю о том, что возможно с помощью зацикливания процесса WASAPI, используя ту же модель, что и образец ApplicationLoopback от Microsoft.

Подробнее здесь: https://stackoverflow.com/questions/798 ... d-ms-teams
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»