2010-09-02 167 views
4

有没有一种很好的方法通过asp.net将视频流式传输到普通的网页和移动设备上?我尝试了以下方法,但在我的索尼爱立信K810i上无法使用。当我在浏览器中尝试它时,我可以看到剪辑(不知道它是否是流式传输)。使用ASP.NET流媒体视频

HTML:

<object type="video/3gpp" 
     data="handlers/FileHandler.ashx" 
     id="player" 
     width="176" 
     height="148" 
     autoplay="true"></object> 

FileHandler.ashx(Best way to stream files in ASP.NET):

public void ProcessRequest (HttpContext context) { 

    string path = "~/files/do.3gp"; 

    string localPath = context.Server.MapPath(path); 

    if (!File.Exists(localPath)) 
    { 
     return; 
    } 

    // get info about contenttype etc 
    FileInfo fileInfo = new FileInfo(localPath); 
    int len = (int)fileInfo.Length; 
    context.Response.AppendHeader("content-length", len.ToString()); 
    context.Response.ContentType = FileHelper.GetMimeType(fileInfo.Name); // returns video/3gpp 

    // stream file 
    byte[] buffer = new byte[1 << 16]; // 64kb 
    int bytesRead = 0; 
    using(var file = File.Open(localPath, FileMode.Open)) 
    { 
     while((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      context.Response.OutputStream.Write(buffer, 0, bytesRead); 
     } 
    } 

    // finish 
    context.Response.Flush(); 
    context.Response.Close(); 
    context.Response.End(); 

} 

回答

6

什么你得是不是 “技术上” 流。这是一个文件下载。您的客户端(浏览器/电话)发送了一个HTTP请求,您的FileHandler.ashx打开了该文件并将这些字节写入响应流。这与网页请求的交互完全相同,除了数据是html文本而不是表示视频的二进制数据。

如果手机不支持视频,它可能是不兼容的编码。如果您确定该视频可以通过手机播放,请查看该手机是否需要渐进式下载支持(例如,iPhone/iPad/iPod Touch需要媒体播放器“流式播放”视频)。如果是这样,您会需要查看大量可用于处理字节范围数据请求的解决方案,并使用指定范围内的文件中的字节响应请求。

我写了一个library for ASP.NET MVC来解决这个问题,我的工作主要是基于这个guidance and source code完成的。