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.