Замороженный видеопоток

Я создаю простое приложение для видеочата, используя WebRTC через PeerJS с React.

Кажется, все работает, если видеопоток заморожен, если не выбрана вкладка Chrome с этим видео и пользователь не щелкает/прокручивает/вводит текст с клавиатуры. т.е. кажется, что видеопоток не перерисовывается, если только пользователь не отправляет события от клиента постоянно. Очевидно, это нежелательное поведение; он должен передавать аудио/видео независимо от того, выбрал ли пользователь эту вкладку или нет, и независимо от того, прокручиваются они или нет.

import React, { Component } from 'react';

import Peer from 'peerjs';

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {};
    }
    componentDidMount() {
        const peer = new Peer({key: 'lwjd5qra8257b9'});
        console.log('peer', peer);
        peer.on('open', (id) => {
            //this.setState({ peer, id })
            this.setState({ id })
            this.peer = peer;
        });
        // ANSWER
        peer.on('call', async (call) => {
            const localStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
            call.answer(localStream);
            call.on('stream', (remoteStream) => {
                this.setState({url: URL.createObjectURL(remoteStream)});
            });
        });
    }
    call = async (id) => {
        const localStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
        //const call = this.state.peer.call(id, localStream);
        const call = this.peer.call(id, localStream);
        call.on('stream', (remoteStream) => {
            this.setState({url: URL.createObjectURL(remoteStream)});
        });
    } 
    submitForm = (e) => {
        e.preventDefault();
        const idInp = e.currentTarget.querySelector('.id');
        const id = idInp.value;
        idInp.value = '';
        this.call(id);
    }
    render() {
        return (
            <div className="App">
                <header className="App-header">
                    <h2 className="myId">{ this.state.id || '' }</h2>
                </header>
                <form className="callForm" onSubmit={ this.submitForm }>
                    <input className="id" type="text" name='id' />
                    <button type="submit">Submit</button>
                </form>
                { this.state.url && <video autoplay src={this.state.url} /> }
            </div>
        );
    }
}

export default App;

person Casey    schedule 14.02.2018    source источник


Ответы (2)


Это смутно звучит как проблема с политиками автозапуска. Однако это должно происходить только в Chrome Beta и Canary. Это происходит, если вы запускаете Chrome с параметром --autoplay-policy=no-user-gesture-required (см. https://bugs.chromium.org/p/chromium/issues/detail?id=804091#).c13)

Вы также можете избавиться от URL.createObjectURL (который сейчас также устарел в Chrome) и установить видео srcObject в поток.

person Philipp Hancke    schedule 15.02.2018
comment
Спасибо за ответ. Проблема заключалась в том, что я использовал autoplay вместо autoPlay. Очень привередлив... - person Casey; 15.02.2018
comment
Возможно, это так. Однако, когда я устанавливаю его на autoPlay, он работает, а когда я устанавливаю на autoplay, он не работает. - person Casey; 15.02.2018
comment
Это все еще происходило, когда я запускал Chrome с --autoplay-policy=no-user-gesture-required - person Casey; 15.02.2018

Мне удалось решить проблему, изменив атрибут autoplay элемента video на autoPlay.

person Casey    schedule 15.02.2018