Как записывать микрофон ВО ВРЕМЯ видеозвонков с Daily.co в iOS Safari

Проблема

В Safari для iOS на моем iPad я могу использовать API видео Daily.co для вызова других устройств. Но как только я начинаю записывать свой локальный микрофон через библиотеку audio-recorder-polyfill, все остальные больше не смогут меня слышать, хотя я все еще могу их слышать и делиться своей камерой. Даже когда сеанс записи заканчивается, звуковой вызов остается прерванным (хотя диктофон работает успешно).

Это похоже на iOS, потому что у меня нет проблем с Windows Chrome на моем Surface.

Как воспроизвести

Занимает около 2 минут

  1. Посетите объясниться.mit.edu с iPad Safari или любым другим устройством. Нажмите зеленую кнопку вызова.
  2. Убедившись, что видеозвонок работает, нажмите кнопку записи на iPad.
  3. Обратите внимание, что другое устройство больше ничего не слышит

Что я пробовал

Во-первых, я предположил, что MediaRecorder аннулирует доступ ежедневного видеозвонка к микрофону, поэтому я использовал setLocalDevice для переназначения доступа к Daily каждые 5 секунд, чтобы посмотреть, что произойдет. Это не имело значения во время записи, но когда запись закончилась, он действительно восстановил аудиовызов.

Итак, остающаяся проблема заключается в том, что поток аудиовызовов просто не работает во время записи: я читал документы MDN об API MediaCapture, в нем упоминалось, что поток имеет один вход и один выход, но я не знаю, что это на самом деле означает, и могут ли к микрофонному потоку одновременно получить доступ две вещи.

Соответствующий код

Я использую только базовый минимальный API, который предоставляет Daily и audio-recorder-polyfill.

Видеозвонки (полный код здесь)

await this.CallObject.join({
  url: conferenceRoom.url,
  userName: this.sessionID
}); 

Аудиозапись (полный код здесь )

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.recorder = new MediaRecorder(stream); 
this.recorder.start(); 

Я не верю, что проблема вызвана где-то еще, но вот полный код репозитория при необходимости

Контекст реального мира Для контекста я работаю над https://explain.mit.edu . Вы приходите туда, просите о помощи, затем прибудет кто-то другой и воспользуется доской в ​​реальном времени и голосовым чатом, чтобы что-то вам объяснить - и видео KhanAcademy создается как побочный продукт. Но теперь, если кто-нибудь нажмет запись, голосовой чат перестанет работать.


comment
В настоящее время пытаюсь клонировать MediaStream: developer.mozilla.org/en -US / docs / Web / API / MediaStream / clone   -  person Elton Lin    schedule 02.07.2021
comment
Обновление: сработало. Инициализирую два независимых потока. Я передаю один в Daily (обратите внимание, что вам нужно развернуть MediaStream, чтобы получить настоящий MediaStream), а другой - для целей записи (в частности, для меня каждый раз, когда я начинаю новую запись, я также делаю еще одну копию, чтобы каждый сеанс записи был независимым, но это менее актуально для этого вопроса)   -  person Elton Lin    schedule 02.07.2021


Ответы (1)


Мы можем поработать над репродукцией для этого, но я догадываюсь, что происходит. В прошлом iOS Safari останавливал все текущие треки, поступающие с локального микрофона / камеры, при каждом вызове getUserMedia(). Таким образом, в отличие от настольных браузеров и Android Chrome, в iOS вы не можете запрашивать или использовать несколько потоков.

iOS Safari - это движущаяся цель, и в последнее время я не рассматривал эту конкретную проблему. Но если это то, что происходит, вероятно, вы сможете обойти это с помощью довольно небольшого изменения кода.

Вместо:

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });

Вы можете взять локальную звуковую дорожку из объекта Daily call и создать из нее поток:

const track = this.callObject.participants().local.tracks.audio.persistentTrack
if (!track) {
  throw new Error("can't start recording right now ... no audio track");
}
this.recorder = new MediaRecorder(new MediaStream([track]));
this.recorder.start();
person Kwindla Kramer    schedule 02.07.2021
comment
Большое спасибо! Я также получил поддержку в чате вашей компании (именно они предложили клонировать треки: один в Daily, а другой в рекордер ... Я пока буду придерживаться этого решения, чтобы записывать видео, даже если я я не участвую в звонке, но это объяснение помогло мне понять, что на самом деле происходит. В целом благодарю за тонну помощи :) - person Elton Lin; 02.07.2021