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

Есть промежуточные билды? Если выложите - проверим и найдем точный номер билда на котором поломалось. Тогда скорее всего и решение сразу же будет вам очевидно, пропатчите. @Max
Поломалось между 7 и 10 мая - наверное отметил какой-то кодер хорошо
 

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
 

angedonik

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

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
 

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 или что-то подобное.
 

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
Могу я что-то ещё протрейсить в этой функции, чтобы помочь решить проблему более качественно?
 

Max

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

Max

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

SergeyP

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

Max

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

SergeyP

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

Max

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