0

Я создаю небольшое веб-приложение, которое построено на ядре ASP.NET. Мое приложение предназначено для потоковой передачи видео с клиентов клиентам через сервис.Поддерживать соединение для потоковой передачи в ASP.NET Core

Я следовал этот пост:

http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/

Я реализовал применение обучающей программы успешно, но это было для потокового видео от сервера к клиентам.

То, что я хочу сделать сейчас:

  • Клиенты зарегистрировать услугу для потоковой передачи. (с использованием видео или аудио-тегов)
  • Служба получает данные, отправленные клиентом (отправить через POSTMAN)
  • Служба передает данные своим зарегистрированным клиентам.

Вот что я реализовал:

(Index.cshtml)

<div> 
    <video width="480" 
      height="320" 
      controls="controls" 
      autoplay="autoplay"> 
     <source  src="/api/video/initiate" 
        type="video/mp4"> 
     </source> 
    </video> 
</div> 

StreamingService

public class StreamingService: IStreamingService 
{ 
    public IList<Stream> Connections {get;set;} 

    public StreamingService() 
    { 
     Connections = new List<Stream>(); 
    } 

    public byte[] AnalyzeStream(Stream stream) 
    { 
     long originalPosititon = 0; 
     if (stream.CanSeek) 
     { 
      originalPosititon = stream.Position; 
      stream.Position = 0; 
     } 

     try 
     { 
      var readBuffer = new byte[4096]; 
      int bytesReader; 

      while ((byteRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) 
      { 
       totalBytesRead += byteRead; 

       if (totalBytesRead == readBuffer.Length) 
       { 
        var nextByte = stream.ReadByte(); 
        if (nextByte != -1) 
        { 
         var temp = new byte[readBuffer * 2]; 
         Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); 
         Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); 
         readBuffer = temp; 
         totalBytesRead++; 
        } 
       } 
      } 

      var buffer = readBuffer; 
      if (readBuffer.Length != totalBytesRead) 
      { 
       buffer = new byte[totalBytesRead]; 
       Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); 
      } 

      return buffer; 
     } 
     finally 
     { 
      if (stream.CanSeek) 
       stream.Position = originalPosititon; 
     } 
    } 
} 

видеоконтроллер

public class VideoController: Controller 
{ 
    private readonly IStreamingService _streamingService; 

    private readonly IHostingEnvironment _hostingEnvironment; 

    public VideoController(IStreamingService streamingService, IHostingEnvironment hostingEnvironment) 
    { 
     _streamingService = streamingService; 
     _hostingEnvironment = hostingEnvironment; 
    } 

    [HttpGet("initiate")] 
    public IActionResult Initiate() 
    { 
     _streamingService.Connections.Add(Response.Body); 
    } 

    [HttpPost("broadcast")] 
    public async Task<IActionResult> Broadcast() 
    { 
     // Retrieve data submitted from POSTMAN. 
     var data = _streamingService.AnalyzeStream(Request.Body); 

     foreach (var stream in _streamingService.Connections) 
     { 
      try 
      { 
       await stream.WriteAsync(data, 0, data.Length); 
      } 
      catch (Exception exception) 
      { 
       stream.Dispose(); 
       _streamingService.Connections.Remove(stream); 
      } 
     } 
    } 
} 

Когда я отправляю данные с POSTMAN через api/video/broadcast. Для цикла работает, и я получил исключение, сказал, что поток был удален.

Мой вопрос:

  • Как я могу держать поток живой для потоковой передачи?

(поток создан в апи/видео/инициирует сохраняется живым, и когда клиент вызывает API/видео/вещание, все инициирован поток будет обновлять свою дату без избавившись)

Спасибо,

ответ

0

Возможно ли сохранить поток в кеше?

Подробнее об этом можно узнать here. Самый простой способ добавить кэш-службы в контейнер инъекции зависимостей и запросить конкретную реализацию IMemoryCache посредством встраивания конструктора в ваш VideoController (как вы это делали с IStreamingService и IHostingEnvironment).

Просто добавьте поток в кеш и используйте кешированный поток в следующий раз, когда будет атакован api/video/broadcast.

Помните, что если вы находитесь в веб-магазине или размещены в облаке, рекомендуется использовать Distributed Cache, например Redis Cache, иначе ваш кеш может неожиданно исчезнуть. Например, я использую Azure Redis Cache, который отлично работает!

+0

Но поток удаляется, когда я обращаюсь к нему. Могу ли я поддерживать связь между клиентом и сервером с помощью IMemoryCache? – Redplane

+0

Плохо, я должен был сначала спросить вас. Как зарегистрировать IStreamingService? какое время жизни? Переходный режим, область действия или синглтон? –

+0

Я использую IStreamingService как Singleton (services.AddSingeton ()) – Redplane

 Смежные вопросы

  • Нет связанных вопросов^_^