2014-12-17 11 views
6

Sto sviluppando un sito Web in cui le persone possono accedere ai file audio e video. Ho il codice per scaricare i file, che si compone di due metodi d'azione come segue ...Come faccio a riprodurre in streaming un file video utilizzando 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")); 
} 

Questi vanno bene entrambi, e posso scaricare entrambi i tipi di file.

Ora desidero aggiungere due viste del rasoio, una per ascoltare il file audio e una per la visualizzazione del video. Ho fatto la seguente sulla vista audio, e funziona bene ...

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

Allora ho provato a fare lo stesso per la visualizzazione di video ...

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

Tuttavia, questo dà un sistema di .OutOfMemoryException quando provo ad eseguirlo. I video hanno una media di circa 400-500 Mb ciascuno.

poi ho provato ad utilizzare il metodo Response.TransmitFile come segue ...

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

... ma questo non funziona. In Chrome, posso vedere il messaggio "Risorsa interpretata come documento ma trasferito con tipo MIME video/mp4" nella console, e in FireFox, ottengo lo stesso messaggio nel controllo video.

Qualcuno ha idea di come posso risolvere questo problema? Idealmente, mi piacerebbe far scorrere il file, in modo che inizi a giocare non appena i primi byte raggiungono l'utente, piuttosto che aspettare che il file venga scaricato completamente.

Ho provato un paio di lettori video Javascript, ma ho avuto un successo con quelli.

Aggiornamento Mi chiedo se non è proprio l'azione del controller a risolvere il problema, poiché ho provato a puntare il mio browser direttamente sul file video e ho ottenuto quello che sembrava un lettore audio, ma senza un video riquadro, e non succede nulla quando clicco sul pulsante di riproduzione. Non sono sicuro che questo aiuti.

risposta

3

Il metodo File di MvcController restituisce un FileContentResult. Quest'ultimo non esegue lo streaming del contenuto. Per quanto ne so, lo MvcController non supporta affatto lo streaming.

Si consiglia di provare ApiController e PushStreamContent. Quest'ultimo offre la possibilità di scrivere in modo asincrono sul flusso di output tramite un metodo di callback. Avrai bisogno di lavorare con flussi reali nella tua soluzione per questo. Lavorare con byte[] caricherà sempre l'intero contenuto del file in memoria.

Consulta l'tutorial dettagliato qui: Asynchronously streaming video with ASP.NET Web API

0

Il modo possibile riprodurre un video dal database/PC

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

proprietà source ha bisogno di ottenere URL non la stringa,

così @Url.Content convertiti il percorso video come Url

-1

Controller

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 

IMMAGINI (io uso Razor)

<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> 
Problemi correlati