Как сохранить видеопоток в реальном времени и преобразовать его в MP4, используя Websocket и Javascript MediaRecorder API? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь загрузить видеопоток в реальном времени, используя Javascript и .NET Web Socket.Я передаю данные в кодировке Base64 каждую секунду на сервер веб-сокетов, где эти данные добавляются в один файл в формате WebM.Иногда видео не загружается из-за неизвестной ошибки или загружается частично.Может ли кто-нибудь помочь с лучшим подходом загружать видео на сервер в режиме реального времени и конвертировать его в MP4 без платных сторонних инструментов.Добавляю код, который я использую ниже-

//js code

var handleDataAvailable = function(event) {
      if (event.data && event.data.size > 0) {
          try{          
                var reader = new window.FileReader();                  
                reader.onloadend = function () {
                  var base64data = reader.result;
                  if (ws.readyState == WebSocket.OPEN){
                    ws.send(base64data);
                  }
                }
                reader.readAsDataURL(event.data);            
          }catch(ex){

          }      
      }
    }
const SERVER_URL = "ws://localhost:5029";
var ws = new WebSocket(SERVER_URL);
var mediaRecorder = new MediaRecorder(outputStream, options);
mediaRecorder.ondataavailable = handleDataAvailable;

// C# code
// System.Net.WebSockets;
// websocket connection handling code
//

//on message event of websocket
public async Task OnMessage(string message)
{
    var base64Data = Regex.Match(message, @"data:video/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
    var ByteArray = Convert.FromBase64String(base64Data);
    string path = "~//TempUploads//Recordings//test.webm";
    if (!Directory.Exists(HttpContext.Current.Server.MapPath(path)))
    {
        Directory.CreateDirectory(HttpContext.Current.Server.MapPath(path));
    }

    using (var stream = new FileStream(HttpContext.Current.Server.MapPath(path), FileMode.Append))
    {
      try
      {
        stream.Write(ByteArray, 0, ByteArray.Length);
      }
      catch (Exception ex)
      {


      }

    }

}
...