6

У меня есть приложение asp.net webforms и для извлечения видео из базы данных, сохраненной в формате varbinary, и покажите его как тег видео html5.Stream.WriteAsync throws Удаленный хост закрыл исключение соединения

после Googled это, я нашел способ, что я должен играть асинхронно с помощью ASP.Net WebApi, он отлично работает

Первая проблема

Когда видео играл первый раз, и пользователь нажимает на кнопку воспроизведения воспроизведение видео, The remote host closed the connection. The error code is 0x800704CD Исключение составляет строка await outputStream.WriteAsync(buffer, 0, bytesRead);.

Вторая проблема

Когда пользователь нажимает на панели поиска, видео идет проигрываться из первых.

ПРИМЕЧАНИЕ

Internet Explorer 11 воспроизводит видео без каких-либо проблем, но светлячок и хром имеют обе проблемы.

как я могу решить эту проблему?

Вот мои коды:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.EnableCors(); 

     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "VideoApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

public class VideoController : ApiController 
{ 
    public IVideoRepository videoRepository; 

    public HttpResponseMessage Get(long id) 
    { 
     try 
     { 
      videoRepository = new VideoRepository(); 
      Video video = videoRepository.load(id); 

      if (video != null) 
      { 
       var videoStream = new VideoStream(video.fileContent); 
       string ext = video.extension; 

       var response = Request.CreateResponse(); 

       response.Content = new PushStreamContent((Action<Stream, HttpContent, TransportContext>)videoStream.WriteToStream, new MediaTypeHeaderValue("video/" + ext)); 

       response.Content.Headers.Add("Content-Disposition", "attachment;filename=" + video.fullName.Replace(" ", "")); 
       response.Content.Headers.Add("Content-Length", videoStream.FileLength.ToString()); 

       return response; 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.NotFound); 
      } 
     } 
     catch (Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, e); 
     } 
    } 
} 

public class VideoStream 
{ 
    private readonly byte[] _fileContent; 
    private long _contentLength; 

    public long FileLength 
    { 
     get { return _contentLength; } 
    } 

    public VideoStream(byte[] content) 
    { 
     _contentLength = content.Length; 
     _fileContent = content; 
    } 

    public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context) 
    { 
     try 
     { 
      var buffer = new byte[65536]; 

      MemoryStream memoryStream = new MemoryStream(); 
      memoryStream.Write(_fileContent, 0, _fileContent.Length); 
      memoryStream.Position = 0; 
      using (memoryStream) 
      { 
       var length = (int)memoryStream.Length; 
       var bytesRead = 1; 

       while (length > 0 && bytesRead > 0) 
       { 
        bytesRead = memoryStream.Read(buffer, 0, Math.Min(length, buffer.Length)); 
        await outputStream.WriteAsync(buffer, 0, bytesRead); 
        length -= bytesRead; 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      outputStream.Close(); 
     } 
    } 
} 

UPDATE

после того, как этот путь не работал должным образом, я должен был использовать this way, но новый способ иметь SeekBar проблему, когда пользователь нажимает на искать бара, чтобы искать время, чтобы он не работал в Chrome и FireFox.

ответ

0

ASP.NET не очень хорош в потоковой передаче видео. Решение сторонних видеопотоков - лучший вариант.

Существует несколько видеопотоковых серверов (например, Wowza), но они требуют установки, и вы должны купить лицензию.

Услуга облачного потока - еще один вариант. Я лично предпочитаю AWS Cloudfront. Они предлагают распространение в различных зонах распространения глобального контента. Это стоит очень дешево, и вы можете быть уверены, что он выдержит любой объем трафика (даже если все ваши пользователи будут смотреть одно и то же видео одновременно).

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