1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/auper-sipsorcery

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Начало работы с WebRTC

Спецификации WebRTC не включают указания о том, как должен осуществляться обмен сигналами (для VoIP протоколом обмена сигналами является SIP; в WebRTC эквивалента нет). В приведённом ниже примере используется простой обмен сообщениями JSON через веб-сокеты для обмена сигналами. Частично более длинный пример «Начало работы с WebRTC» по сравнению с примером «Начало работы с VoIP» обусловлен необходимостью пользовательского обмена сигналами.

Пример требует выполнения двух шагов:

  • Запустить консольное приложение dotnet,
  • Открыть HTML-страницу в браузере на том же компьютере.

Полный файл проекта и код доступны по адресу Начало работы с WebRTC.

В примере используется специфичный для Windows пакет SIPSorceryMedia.Encoders, который в основном представляет собой оболочку вокруг libvpx. Надеемся, что в будущем появятся аналогичные пакеты для других платформ.

Шаг 1:

dotnet new console --name WebRTCGetStarted
cd WebRTCGetStarted
dotnet add package SIPSorcery
dotnet add package SIPSorceryMedia.Encoders --prerelease
# Вставьте код ниже в Program.cs.
dotnet run
using System;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using SIPSorcery.Media;
using SIPSorcery.Net;
using SIPSorceryMedia.Encoders;
using WebSocketSharp.Server;

namespace demo
{
    class Program
    {
        private const int WEBSOCKET_PORT = 8081;

        static void Main()
        {
            Console.WriteLine("WebRTC Get Started");

            // Запуск сервера веб-сокетов.
            Console.WriteLine("Starting web socket server...");
            var webSocketServer = new WebSocketServer(IPAddress.Any, WEBSOCKET_PORT);
            webSocketServer.AddWebSocketService<WebRTCWebSocketPeer>("/", (peer) => peer.CreatePeerConnection = () => CreatePeerConnection());
            webSocketServer.Start();

            Console.WriteLine($"Waiting for web socket connections on {webSocketServer.Address}:{webSocketServer.Port}...");

            Console.WriteLine("Press any key exit.");
            Console.ReadLine();
        }

        private static Task<RTCPeerConnection> CreatePeerConnection()
        {
            var pc = new RTCPeerConnection(null);

            var testPatternSource = new VideoTestPatternSource(new VpxVideoEncoder());

            MediaStreamTrack videoTrack = new MediaStreamTrack(testPatternSource.GetVideoSourceFormats(), MediaStreamStatusEnum.SendOnly);
            pc.addTrack(videoTrack);

            testPatternSource.OnVideoSourceEncodedSample += pc.SendVideo;
            pc.OnVideoFormatsNegotiated += (formats) => testPatternSource.SetVideoSourceFormat(formats.First());

            pc.onconnectionstatechange += async (state) =>
            {
                Console.WriteLine($"Peer connection state change to {state}.");

                switch(state)
                {
                    case RTCPeerConnectionState.connected:
                        await testPatternSource.StartVideo();
                        break;
                    case RTCPeerConnectionState.failed:
                        pc.Close("ice disconnection");
                        break;
                    case RTCPeerConnectionState.closed:
                        await testPatternSource.CloseVideo();
                        testPatternSource.Dispose();
                        break;
                }
            };

            return Task.FromResult(pc);
        }
    }
}

Шаг 2: Создайте HTML-файл, вставьте в него приведённый ниже контент, откройте его в браузере, поддерживающем WebRTC, и, наконец, нажмите кнопку «start».

<!DOCTYPE html>
<head>
    <script type="text/javascript">
        const WEBSOCKET_URL = "ws://127.0.0.1:8081/"

        var pc, ws;

        async function start() {
            pc = new RTCPeerConnection();

            pc.ontrack = evt =>
``` document.querySelector('#videoCtl').srcObject = evt.streams[0];
pc.onicecandidate = evt => evt.candidate && ws.send(JSON.stringify(evt.candidate));

ws = new WebSocket(document.querySelector('#websockurl').value, []);
ws.onmessage = async function (evt) {
    var obj = JSON.parse(evt.data);
    if (obj?.candidate) {
        pc.addIceCandidate(obj);
    }
    else if (obj?.sdp) {
        await pc.setRemoteDescription(new RTCSessionDescription(obj));
        pc.createAnswer()
            .then((answer) => pc.setLocalDescription(answer))
            .then(() => ws.send(JSON.stringify(pc.localDescription)));
    };
};

async function closePeer() {
    await pc?.close();
    await ws?.close();
};

Асинхронная функция start() не представлена в тексте запроса.


<head>
    <video controls autoplay="autoplay" id="videoCtl" width="640" height="480"></video>

    <div>
        <input type="text" id="websockurl" size="40" />
        <button type="button" class="btn btn-success" onclick="start();">Start</button>
        <button type="button" class="btn btn-success" onclick="closePeer();">Close</button>
    </div>
</head>

<body>

В тексте запроса отсутствует скрипт <script>document.querySelector('#websockurl').value = WEBSOCKET_URL;</script>.


If successful the browser should display a test pattern image.
The [examples folder](https://github.com/sipsorcery-org/sipsorcery/tree/master/examples/WebRTCExamples) contains sample code to demonstrate other common WebRTC cases.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Эту библиотеку на C# можно использовать, чтобы добавить в приложения .NET функцию коммуникаций в реальном времени, обычно аудио- и видеозвонки. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/auper-sipsorcery.git
git@api.gitlife.ru:oschina-mirror/auper-sipsorcery.git
oschina-mirror
auper-sipsorcery
auper-sipsorcery
master