Как работает «по согласованию» при попытке потоковой передачи с помощью gstreamer webrtc? - PullRequest
0 голосов
/ 17 декабря 2018

Как конвейер webrtc получает какую-либо информацию о своих пирах?

Это то, что я предполагаю, что делает обратный вызов on_negotiation_needed?

def start_pipeline(self):
        self.pipe = Gst.parse_launch(PIPELINE_DESC)
        self.webrtc = self.pipe.get_by_name('sendrecv')
        **self.webrtc.connect('on-negotiation-needed', self.on_negotiation_needed)**
        self.webrtc.connect('on-ice-candidate', self.send_ice_candidate_message)
        self.webrtc.connect('pad-added', self.on_incoming_stream)
        self.pipe.set_state(Gst.State.PLAYING)

Я вижу, что он имеет обратный вызов on_negotiation_needed, нонеясно, откуда берется переменная элемента?Я посмотрел здесь: http://blog.nirbheek.in/2018/02/gstreamer-webrtc.html и здесь: https://github.com/centricular/gstwebrtc-demos, и я все еще не понимаю, как эти переговоры работают?Из того, что я понимаю, есть 2 (или более) одноранговых узла, и они оба должны подключиться к серверу сигнализации, тогда один из них должен создать предложение.

Я жду сообщения от (я полагаю)gstreamer webrtcbin на сервере сигнализации:

print (websocket.remote_address)
#get message from client
message = await asyncio.wait_for(websocket.recv(), 3000)

, и я получаю эту ошибку при запуске конвейера:

('192.168.11.138', 44120)
Error in connection handler
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/websockets/protocol.py", line 674, in transfer_data
    message = yield from self.read_message()
  File "/usr/local/lib/python3.6/dist-packages/websockets/protocol.py", line 742, in read_message
    frame = yield from self.read_data_frame(max_size=self.max_size)
  File "/usr/local/lib/python3.6/dist-packages/websockets/protocol.py", line 815, in read_data_frame
    frame = yield from self.read_frame(max_size)
  File "/usr/local/lib/python3.6/dist-packages/websockets/protocol.py", line 884, in read_frame
    extensions=self.extensions,
  File "/usr/local/lib/python3.6/dist-packages/websockets/framing.py", line 99, in read
    data = yield from reader(2)
  File "/usr/lib/python3.6/asyncio/streams.py", line 672, in readexactly
    raise IncompleteReadError(incomplete, n)
asyncio.streams.IncompleteReadError: 0 bytes read on a total of 2 expected bytes

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/websockets/server.py", line 169, in handler
    yield from self.ws_handler(self, path)
  File "signaling_server.py", line 34, in signaling
    message = await asyncio.wait_for(websocket.recv(), 3000)
  File "/usr/lib/python3.6/asyncio/tasks.py", line 358, in wait_for
    return fut.result()
  File "/usr/local/lib/python3.6/dist-packages/websockets/protocol.py", line 434, in recv
    yield from self.ensure_open()
  File "/usr/local/lib/python3.6/dist-packages/websockets/protocol.py", line 646, in ensure_open
    ) from self.transfer_data_exc
websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 1006 (connection closed abnormally [internal]), no reason

1 Ответ

0 голосов
/ 21 декабря 2018

Я не могу сказать о Python (к сожалению, не могу заставить привязки Python для GStreamer работать в Windows), однако, демоверсия работает из C # (я только что проверил).

Сначала вы должны подключиться к браузеру на https://webrtc.nirbheek.in/, и получите значение «Наш идентификатор».

Ваш Python Gstreamer должен подключиться к wss: //webrtc.nirbheek.in: 8443 и использовать значение Id из браузера.

Браузер получит поток тестового изображения от GStreamer, а приложение GStreamer получит изображение веб-камеры из браузера.

HTH, Том

Вот скриншот:

enter image description here

...