2014-12-17 3 views
6

Я разрабатываю веб-сайт, где люди могут получить доступ к аудио- и видеофайлам. У меня есть код для загрузки файлов, которая состоит из двух методов действий следующим образом ...Как передать видеофайл с помощью ASP.NET MVC?

public ActionResult GetAudioFile(int id) { 
    return GetFile(id, true); 
} 

public ActionResult GetVideoFile(int id) { 
    return GetFile(id, false); 
} 

private ActionResult GetFile(int id, bool isAudio) { 
    // Code to get info about the file, etc omitted for clarity 
    string downloadFileName = // full path to audio/video file 
    byte[] bytes = GetFileBytes(fileName); // also omitted 
    return File(bytes, (isAudio ? "audio/mpeg" : "video/mp4"), downloadFileName + (isAudio ? ".mp3" : ".mp4")); 
} 

Они оба работает хорошо, и я могу загрузить любой тип файла.

Теперь я хочу добавить два вида Razor, один для прослушивания аудиофайла и один для просмотра видео. Я сделал следующее на аудио взгляд, и она отлично работает ...

<audio src='@Url.Action("GetAudioFile", "Search", new {ID = @Model.ID})' 
       controls preload="auto"></audio> 

Затем я попытался сделать то же самое для просмотра видео ...

<video src='@Url.Action("GetVideoFile", "Search", new {ID = @Model.ID})' 
       controls preload="auto" width="640" height="368"></video> 

Однако это дает систему .OutOfMemoryException, когда я пытаюсь запустить его. Видеоролики в среднем около 400-500 МБ каждый.

Затем я попытался с помощью метода Response.TransmitFile следующим образом ...

Response.ContentType = "video/mp4"; 
    Response.AddHeader("content-disposition", "attachment; filename=myvideo.mp4")); 
    Response.TransmitFile(fileName); 
    Response.End(); 
    return null; 

... но это не работает. В Chrome я вижу сообщение «Ресурс, интерпретируемый как Документ, но переданный с MIME-типом видео/mp4» в консоли, а в FireFox я получаю такое же сообщение в видеоконтроллере.

Кто-нибудь знает, как я могу это исправить? В идеале, я хотел бы передать файл, чтобы он начинал играть, как только первые байты достигают пользователя, вместо того, чтобы ждать, пока файл не будет полностью загружен.

Я пробовал пару видеопроигрывателей Javascript, но имел и успех с ними.

Update мне интересно, если это не действие контроллера, что проблема вообще, как я пытался указывать свой веб-браузер непосредственно на видеофайл, и я получил то, что выглядело как аудио-плеер, но без видео , и ничего не происходит, когда я нажимаю кнопку воспроизведения. Не уверен, что это помогает.

ответ

3

Метод FileMvcController возвращает FileContentResult. Последний не передает поток контента. Насколько мне известно, MvcController не поддерживает потоковую передачу вообще.

Возможно, вы захотите попробовать ApiController и PushStreamContent. Последнее дает возможность асинхронно записывать в выходной поток через метод обратного вызова. Для этого вам нужно будет работать с реальными потоками в вашем решении. Работа с byte[] всегда будет загружать весь файл в память.

Смотрите подробный учебник здесь: Asynchronously streaming video with ASP.NET Web API

0

Возможный способ воспроизведения видео из базы данных/PC

<div height="240" width="320" controls> 
     <video> 
      <source src="@Url.Content(Model.VideoTable.VideoPath)" type='video/mp4' /> 
     </video> 
</div> 

источник недвижимости необходимо получить URL не строка,

так @Url.Content Преобразует видео-путь в качестве URL-адреса

-1

Контролер

Imports System.Web.Mvc 

Namespace Controllers 
    Public Class HomeController 
     Inherits Controller 

     Function Index() As ActionResult 
      Return View() 
     End Function 

     Sub movie(id As Integer) 'As ActionResult 

      Dim fm As String = "D:\Downloads\Rhoma Irama Riza Umami - Suratan (Official Music Video).mp4" 

      If id = 2 Then fm = "D:\Downloads\JERA riza umami lagu dangdut YouTube.mp4" 
      If id = 3 Then fm = "D:\Downloads\FTV Trans TV CINTANYA ANAK HITS KEKINIAN RIDWAN GHANI.mp4" 

      Dim fi As New IO.FileInfo(fm) 
      Dim fs As IO.FileStream = IO.File.OpenRead(fm) 
      Dim buff_size As Integer = 1048576 '1Mb buffering 
      Dim buff(buff_size) As Byte, max_l As Integer = fs.Length - 1 

      If Not Request.ServerVariables("HTTP_RANGE") Is Nothing Then 

       Dim r() As String = Request.ServerVariables("HTTP_RANGE").Split("=") 
       Dim s() As String = r(1).Split("-") 
       Dim bs As Integer = 0, be As Integer = 0, l As Integer = 0 

       If IsNumeric(s(0)) Then bs = s(0) 
       If IsNumeric(s(1)) Then be = s(1) 

       If bs >= 0 And bs <= max_l Then 

        Response.StatusCode = 206 
        Response.ContentType = "video/" & fi.Extension 
        Response.AddHeader("Accept-Ranges", "0-" & max_l) 
        Response.AddHeader("Content-Range", "bytes " & bs & "-" & bs + buff_size & "/" & max_l) 
        Response.AddHeader("Content-Length", buff_size) 

        fs.Position = bs 
        l = fs.Read(buff, 0, buff.Length) 
        If l > 0 Then Response.OutputStream.Write(buff, 0, buff.Length) 

       End If 

      End If 

     End Sub 
    End Class 
End Namespace 

МНЕНИЯ (я использую бритву)

<body> 
    <button onclick="video1.src='@Url.Action("movie", "home", New With {.id = 1})'">1</button> 
    <button onclick="video1.src='@Url.Action("movie", "home", New With {.id = 2})'">2</button> 
    <button onclick="video1.src='@Url.Action("movie", "home", New With {.id = 3})'">3</button> 
    <video controls autoplay="autoplay" id="video1" width="920"> 
     <source src="@Url.Action("movie", "home", New With {.id = 1})" type="video/mp4"> 
     Your browser does not support HTML5 video. 
    </video> 
</body> 
Смежные вопросы