2014-12-17 2 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")); 
} 

이 잘 작동을 모두 가지고 있고, 나는 파일 유형 중 하나를 다운로드 할 수 있습니다.

이제 오디오 파일을 듣기위한 하나와 비디오를보기위한 하나의 면도기 뷰를 추가하려고합니다. 나는 오디오보기에서 다음을했고, 그것은 그러나

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

, 이것은 시스템을 제공합니다 ...

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

내가 다음 비디오보기에 대해 동일한 작업을 수행하려고 ... 잘 작동 .OutOfMemoryException 그것을 실행할 때. 비디오 평균 약 400-500Mb.

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

그때 다음과 같이 Response.TransmitFile 방법을 사용하여 시도

... 그러나 그것은 작동하지 않습니다. Chrome에서는 콘솔에서 "문서로 해석되었지만 MIME 유형 비디오/mp4로 전송 된 리소스"라는 메시지가 표시되고 FireFox에서는 비디오 컨트롤에서 동일한 메시지가 표시됩니다.

누구든지 어떻게 해결할 수 있습니까? 이상적으로, 파일을 스트리밍하여 파일이 완전히 다운로드 될 때까지 기다리지 않고 첫 번째 바이트가 사용자에게 도달하자 마자 재생이 시작되도록하는 것이 좋습니다.

몇 가지 자바 스크립트 비디오 플레이어를 사용해 보았지만 그 중 어떤 것도 성공했습니다.

업데이트 업데이트가 제대로 작동하지 않는다면 비디오 파일에서 웹 브라우저를 직접 가리켜봤을 때 오디오 플레이어처럼 보이지만 비디오는 보이지 않습니다. 재생 버튼을 클릭해도 아무런 변화가 없습니다. 도움이되는지 확실하지 않습니다.

답변

3

FileMvcController의 방법은 FileContentResult을 반환합니다. 후자는 콘텐츠를 스트리밍하지 않습니다. 아는 한, MvcController은 스트리밍을 전혀 지원하지 않습니다.

ApiControllerPushStreamContent을 사용해보십시오. 후자는 콜백 메소드를 통해 비동기 적으로 출력 스트림에 쓸 수있는 가능성을 제공합니다. 이를 위해 솔루션에서 실제 스트림으로 작업해야합니다. byte[]으로 작업하면 항상 전체 파일 내용이 메모리로로드됩니다.데이터베이스에서 비디오를 재생하는 Asynchronously streaming video with ASP.NET Web API

0

가능한 방법/

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

소스 속성이없는 문자열 URL을 얻을 필요가 PC, 그래서

@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 

VIEWS (나는 면도기를 사용)

<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> 
관련 문제