Перестал работать микрофон

Discussion in 'Общие вопросы' started by angedonik, Nov 25, 2018.

  1. angedonik

    angedonik Member

    Методом половинного деления определил, что из https://flashphoner.com/downloads/builds/WCS/5.0/x8664/wcs5_monitoring/
    FlashphonerWebCallServer-5.1.3097.tar.gz - работает микрофон
    FlashphonerWebCallServer-5.1.3115.tar.gz - не работает микрофон
    Если есть промежуточный версии - проверю и их.
  2. Есть промежуточные билды? Если выложите - проверим и найдем точный номер билда на котором поломалось. Тогда скорее всего и решение сразу же будет вам очевидно, пропатчите. @Max
    Поломалось между 7 и 10 мая - наверное отметил какой-то кодер хорошо
  3. Max

    Max Administrator Staff Member

    Промежуточных сборок нет.
    Если действительно есть проблема, то она появилась в 3115.
    В этой сборке были только фиксы по протоколу RTMP и ничего больше.
    Поэтому есть предположение что ваш браузер по какой-то причине использует Flash Player.

    1. Пришлите пожалуйста дамп в виде pcap файла, снятый в Wireshark.
    Мы надеемся в нем увидеть WebRTC или RTMP
    https://docs.flashphoner.com/display/WCS5EN/WebRTC
    https://docs.flashphoner.com/display/WCS5EN/RTMP

    2. Пришлите графики
    chrome://webrtc-internals
    для аудио
    на графиках видно аудио битрейт, а в статистике видно кодек и другие параметры захвата с микрофона

    upload_2018-11-29_18-25-23.png
  4. angedonik

    angedonik Member

    Я считаю, что проблема в web-sdk (flashphoner.js), который изменился между этими версиями.
    Не совсем понял причём тут Flash Player, если Stream Recording тоже без звука. Но думаю тут видно, что это не флеш:
    upload_2018-11-29_13-49-47.png
  5. angedonik

    angedonik Member

    Графики пустые:
    upload_2018-11-29_13-53-5.png
  6. angedonik

    angedonik Member

    на 5.1.3097 графики не пустые
    upload_2018-11-29_13-56-52.png

    Attached Files:

  7. Max

    Max Administrator Staff Member

    Мы разделяем сборки Web SDK (flashphoner.js) и сервера.
    Вы указали на серверную сборку 3115. В ней были изменения только по Flash RTMP части. Отсюда предположение про флэш.

    В каждую сборку сервера пакуется сборка Web SDK. В папку WCS_HOME/client2
    Номер версии сборки Web SDK указан в файле client2/client.version
    Так вот, для серверной сборки, которую вы указали, упакованный Web SDK имеет версию:
    Code:
    0.5.28.2747-414a73563037ad176b0ed7a34a2756372645e9bb
    Если посмотреть по коммитам, то можно найти:
    https://github.com/flashphoner/flashphoner_client/commit/414a73563037ad176b0ed7a34a2756372645e9bb
    и соответствующая сборка SDK от 8 мая 2018.
    https://flashphoner.com/downloads/b...4a73563037ad176b0ed7a34a2756372645e9bb.tar.gz
    В этой сборке был фикс проставления microphoneGain для publish потока примера Media Devices.

    Далее, в сборке 3097 упакована версия Web SDK
    0.5.28.2747-c306c1bbf49bfcbd8e24be927ae95f63b7dbaaba
    https://github.com/flashphoner/flashphoner_client/commit/c306c1bbf49bfcbd8e24be927ae95f63b7dbaaba
    Сборка Web SDK: https://flashphoner.com/downloads/b...06c1bbf49bfcbd8e24be927ae95f63b7dbaaba.tar.gz
    от 27 апреля.

    Таким образом, регрессия, которая повлияла на ваш микрофон, случилась между 27 апреля и 8 мая. Между следующими двумя сборками:
    [Нет бага] https://flashphoner.com/downloads/b...06c1bbf49bfcbd8e24be927ae95f63b7dbaaba.tar.gz
    [Есть баг] https://flashphoner.com/downloads/b...4a73563037ad176b0ed7a34a2756372645e9bb.tar.gz
    История:
    https://github.com/flashphoner/flas...r=eaaea65e10e481b6022222fe57f4a420232f1a5b 69
    Скорее всего манипуляции с gain на что-то повлияли.
    upload_2018-11-29_19-17-0.png
  8. Max

    Max Administrator Staff Member

    Основные изменения были в коммите
    https://github.com/flashphoner/flashphoner_client/commit/e1ddd1e4077449630f7b47fff0e2ad36a977f03c
    и в файле src/webrtc-media-provider.js
    Быстрый хак - заменить в текущем файле flashphoner.js эту строку:
    Code:
    if(stream.getAudioTracks().length > 0 && adapter.browserDetails.browser == "chrome") {
            microphoneGain = createGainNode(stream);
        }
    Заменить "chrome" на "xyz", тогда не будет попыток создать Gain Node в Chrome и скорее всего микрофон у вас заработает.
    Не понятно только почему он отказывается создавать Gain Node на вашем Chrome
    Код:
    Code:
    var createGainNode = function(stream) {
        var audioCtx = audioContext;
        var source = audioCtx.createMediaStreamSource(stream);
        var gainNode = audioCtx.createGain();
        var destination = audioCtx.createMediaStreamDestination();
        var outputStream = destination.stream;
        source.connect(gainNode);
        gainNode.connect(destination);
        var newTrack = outputStream.getAudioTracks()[0];
        var originalTrack = stream.getAudioTracks()[0];
        stream.addTrack(newTrack);
        stream.removeTrack(originalTrack);
        return gainNode;
    };
    Возможно в браузере отключен AudioContext или что-то подобное.
  9. angedonik

    angedonik Member

    Да! Помогло! Спасибо!
    После я вернул как было и сделал:
    Code:
    var createGainNode = function(stream) {
        var audioCtx = audioContext;
        console.log('audioCtx',audioCtx);
        var source = audioCtx.createMediaStreamSource(stream);
        console.log('source',source);
        var gainNode = audioCtx.createGain();
        console.log('gainNode',gainNode);
        var destination = audioCtx.createMediaStreamDestination();
        console.log('destination',destination);
        var outputStream = destination.stream;
        console.log('outputStream',outputStream);
        source.connect(gainNode);
        gainNode.connect(destination);
        var newTrack = outputStream.getAudioTracks()[0];
        console.log('newTrack',newTrack);
        var originalTrack = stream.getAudioTracks()[0];
        console.log('originalTrack',originalTrack);
        stream.addTrack(newTrack);
        stream.removeTrack(originalTrack);
        console.log('gainNode',gainNode);
        return gainNode;
    };
    
    И вот результат:
    Code:
    flashphoner.js:9266 audioCtx AudioContext {baseLatency: 0.01, destination: AudioDestinationNode, currentTime: 7.78, sampleRate: 192000, listener: AudioListener, …}audioWorklet: AudioWorklet__proto__: AudioWorkletbaseLatency: 0.01currentTime: 18.08destination: AudioDestinationNodechannelCount: 2channelCountMode: "explicit"channelInterpretation: "speakers"context: AudioContext {baseLatency: 0.01, destination: AudioDestinationNode, currentTime: 21.49, sampleRate: 192000, listener: AudioListener, …}maxChannelCount: 2numberOfInputs: 1numberOfOutputs: 0__proto__: AudioDestinationNodelistener: AudioListenerforwardX: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParamforwardY: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParamforwardZ: AudioParamautomationRate: "a-rate"defaultValue: -1maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: -1__proto__: AudioParampositionX: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParampositionY: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParampositionZ: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParamupX: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParamupY: AudioParamautomationRate: "a-rate"defaultValue: 1maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 1__proto__: AudioParamupZ: AudioParamautomationRate: "a-rate"defaultValue: 0maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 0__proto__: AudioParam__proto__: AudioListeneronstatechange: nullsampleRate: 192000state: "running"__proto__: AudioContext
    flashphoner.js:9268 source MediaStreamAudioSourceNode {mediaStream: MediaStream, context: AudioContext, numberOfInputs: 0, numberOfOutputs: 1, channelCount: 2, …}channelCount: 2channelCountMode: "max"channelInterpretation: "speakers"context: AudioContextaudioWorklet: AudioWorklet {}baseLatency: 0.01currentTime: 52.68destination: AudioDestinationNode {maxChannelCount: 2, context: AudioContext, numberOfInputs: 1, numberOfOutputs: 0, channelCount: 2, …}listener: AudioListener {positionX: AudioParam, positionY: AudioParam, positionZ: AudioParam, forwardX: AudioParam, forwardY: AudioParam, …}onstatechange: nullsampleRate: 192000state: "running"__proto__: AudioContextmediaStream: MediaStreamactive: trueid: "CRYM1cvuiQPFid7g8OGPnZyWFV5lCuU1NSb0"onactive: nullonaddtrack: nulloninactive: nullonremovetrack: null__proto__: MediaStreamnumberOfInputs: 0numberOfOutputs: 1__proto__: MediaStreamAudioSourceNode
    flashphoner.js:9270 gainNode GainNode {gain: AudioParam, context: AudioContext, numberOfInputs: 1, numberOfOutputs: 1, channelCount: 2, …}channelCount: 2channelCountMode: "max"channelInterpretation: "speakers"context: AudioContextaudioWorklet: AudioWorklet {}baseLatency: 0.01currentTime: 62.55destination: AudioDestinationNode {maxChannelCount: 2, context: AudioContext, numberOfInputs: 1, numberOfOutputs: 0, channelCount: 2, …}listener: AudioListener {positionX: AudioParam, positionY: AudioParam, positionZ: AudioParam, forwardX: AudioParam, forwardY: AudioParam, …}onstatechange: nullsampleRate: 192000state: "running"__proto__: AudioContextgain: AudioParamautomationRate: "a-rate"defaultValue: 1maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 1__proto__: AudioParamnumberOfInputs: 1numberOfOutputs: 1__proto__: GainNode
    flashphoner.js:9272 destination MediaStreamAudioDestinationNode {stream: MediaStream, context: AudioContext, numberOfInputs: 1, numberOfOutputs: 1, channelCount: 2, …}channelCount: 2channelCountMode: "explicit"channelInterpretation: "speakers"context: AudioContext {baseLatency: 0.01, destination: AudioDestinationNode, currentTime: 78.98, sampleRate: 192000, listener: AudioListener, …}numberOfInputs: 1numberOfOutputs: 1stream: MediaStreamactive: trueid: "a21c9d3b-0de3-4685-93bd-ec8771730f53"onactive: nullonaddtrack: nulloninactive: nullonremovetrack: null__proto__: MediaStream__proto__: MediaStreamAudioDestinationNode
    flashphoner.js:9274 outputStream MediaStream {id: "a21c9d3b-0de3-4685-93bd-ec8771730f53", active: true, onaddtrack: null, onremovetrack: null, onactive: null, …}active: trueid: "a21c9d3b-0de3-4685-93bd-ec8771730f53"onactive: nullonaddtrack: nulloninactive: nullonremovetrack: null__proto__: MediaStream
    flashphoner.js:9278 newTrack MediaStreamTrack {kind: "audio", id: "cb49641e-0044-4b3a-a3ce-97d5bdd31d71", label: "MediaStreamAudioDestinationNode", enabled: true, muted: false, …}contentHint: ""enabled: trueid: "cb49641e-0044-4b3a-a3ce-97d5bdd31d71"kind: "audio"label: "MediaStreamAudioDestinationNode"muted: falseonended: nullonmute: nullonunmute: nullreadyState: "live"__proto__: MediaStreamTrack
    flashphoner.js:9280 originalTrack MediaStreamTrack {kind: "audio", id: "bca6ee3b-2f9e-4658-abe1-2cf4d9704c5f", label: "Оборудование - Микрофон (Realtek High Definition Audio)", enabled: true, muted: false, …}contentHint: ""enabled: trueid: "bca6ee3b-2f9e-4658-abe1-2cf4d9704c5f"kind: "audio"label: "Оборудование - Микрофон (Realtek High Definition Audio)"muted: falseonended: nullonmute: nullonunmute: nullreadyState: "live"__proto__: MediaStreamTrack
    flashphoner.js:9283 gainNode GainNode {gain: AudioParam, context: AudioContext, numberOfInputs: 1, numberOfOutputs: 1, channelCount: 2, …}channelCount: 2channelCountMode: "max"channelInterpretation: "speakers"context: AudioContextaudioWorklet: AudioWorklet {}baseLatency: 0.01currentTime: 92.92destination: AudioDestinationNode {maxChannelCount: 2, context: AudioContext, numberOfInputs: 1, numberOfOutputs: 0, channelCount: 2, …}listener: AudioListener {positionX: AudioParam, positionY: AudioParam, positionZ: AudioParam, forwardX: AudioParam, forwardY: AudioParam, …}onstatechange: nullsampleRate: 192000state: "running"__proto__: AudioContextgain: AudioParamautomationRate: "a-rate"defaultValue: 1maxValue: 3.4028234663852886e+38minValue: -3.4028234663852886e+38value: 1__proto__: AudioParamnumberOfInputs: 1numberOfOutputs: 1__proto__: GainNode
    
    Могу я что-то ещё протрейсить в этой функции, чтобы помочь решить проблему более качественно?
  10. Max

    Max Administrator Staff Member

    Создали втутренний тикет WCS-1651
    Протестируем, сравним с вашими трейсами.
    Предположительно связано с AudioContext или русскоязычными лэйблами "Оборудование-Микрофон". Или же какие-то настройки в Chrome или плагины конфликтуют.
    Gain Node создается для того чтобы в Chrome можно было управлять вручную уровнем звука с микрофона.
    По какой-то причине этот код у вас не работает. Нужно его минимизировать и разобраться в чем причина.
  11. Max

    Max Administrator Staff Member

    Добрый день.
    В сборку WebSDK 0.5.28.2747.45 добавлен параметр инициализации, при помощи которого можно отключить создание Gain Node в Chrome, например:
    Code:
            Flashphoner.init({
                flashMediaProviderSwfLocation: '../../../../media-provider.swf',
                createMicGainNode: false
            });
    
    В этом случае Gain Node не будет создан, как побочный эффект, не будет работать регулировка усиления микрофона.
    Проверьте, будет ли у Вас работать микрофон с этой настройкой.
  12. angedonik

    angedonik Member

    Работает с этой опцией новое WebSDK. Спасибо!
  13. SergeyP

    SergeyP Member

    Скажите пожалуйста, опция createMicGainNode=false еще актуальна в последних версиях WebSDK?
    Например вижу в версии 0.5.28.2753.57 какой-то фикс, связаный со звуком в Chrome.
    Хотелось бы и звук регулировать и чтобы стрим не отваливался через минуту с ошибкой "Failed by RTP activity".
    Спасибо
  14. Max

    Max Administrator Staff Member

    Добрый день.
    Фиксы, связанные со звуком в Chrome - это результат изменения autoplay policy в Chrome 70 и выше: теперь для создания аудиоконтекста необходимы действия пользователя.
    Такая ошибка означает, что в течение минуты (по умолчанию) от публикующей стороны не было получено никаких медиаданных. С регулировкой звука и аудиоконтекстом это никак не связано. Если Ваши трансляции предполагают отсутствие медиаданных в течение длительного времени (например, данные передаются только по изменению картинки, и картинка статичная), можно отключить или увеличить таймаут, это регулируется настройкой
    Code:
    rtp_activity_detecting=true,60
    Для отключения укажите false, для изменения таймаута задайте другое значение в секундах.
  15. SergeyP

    SergeyP Member

    Уже 2 недели как отключил (поставил rtp_activity_detecting=false,60) - никаких улучшений не заметил, часть трансляций продолжает прерываться ровно через минуту.
    Поэтому ищу другие варианты.
    Версия сервера - WCS 5.1.3714.
    До прекращения трансляции она работает нормально - передается и звук и видео.
  16. Max

    Max Administrator Staff Member

    https://docs.flashphoner.com/display/WCS5RU/Release notes
    В 3720 была внесена регрессия от которой сломались настройки управления битрейтом webrtc_cc.
    В 3753 проблема была исправлена.
    Попробуйте обновиться до 3753. Там было сделано много оптимизаций, связанных именно с публикацией видео и трансляциями.
    Если проблема останется, создайте пожалуйста отдельную тему или поднимите вашу существующую.
    Нужны логи с примером прерывания трансляции.
    Трансляции могут рваться из-за высокого битрейта.
    Если битрейт не ограничен, видео трафик резко раскручивается вверх по битрейту и забивает канал.
    В этом случае рвутся даже не трансляции а само Websocket-соединение.
    Поэтому сборка 3753 может решить эту проблему.

Share This Page