IIS请求视频文件的问题
我的服务器上有很多视频文件,我希望通过视频url,请求视频的时候,
视频长度小于5分钟的视频,正常展示,大于5分钟的视频,只展示前5分钟。可以这样操作么?
可以通过以下方式实现:
1.打开 Internet Information Services(IIS)管理器,找到你的网站,右键单击该网站,选择“添加应用程序”。
2.在“添加应用程序”对话框中,指定别名、应用程序池和物理路径等相关信息,然后单击“确定”按钮。
3.在应用程序的物理路径中,创建一个名为“Media”的文件夹,用于存放媒体文件。
4.在 IIS 中为该文件夹添加 MIME 类型,以便服务器能够正确地识别媒体文件的格式。例如,你可以添加以下 MIME 类型:
.mp4 video/mp4
.mov video/quicktime
.avi video/x-msvideo
.wmv video/x-ms-wmv
5.创建一个名为“StreamVideo.aspx”的 ASP.NET 网页,用于流式传输媒体文件。该网页可以使用以下代码实现:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string filePath = Request.QueryString["file"];
if (filePath != null)
{
string fileName = Path.GetFileName(filePath);
string extension = Path.GetExtension(filePath);
string contentType = "";
switch (extension)
{
case ".mp4":
contentType = "video/mp4";
break;
case ".mov":
contentType = "video/quicktime";
break;
case ".avi":
contentType = "video/x-msvideo";
break;
case ".wmv":
contentType = "video/x-ms-wmv";
break;
default:
Response.StatusCode = 404;
Response.End();
break;
}
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = false;
Response.ContentType = contentType;
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fileStream = new FileStream(Server.MapPath(filePath), FileMode.Open, FileAccess.Read))
{
long length = fileStream.Length;
long startBytes = 0;
int packSize = 1024 * 8; //10kb
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startBytes = Convert.ToInt64(range[1]);
}
Response.AddHeader("Content-Length", (length - startBytes).ToString());
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, length - 1, length));
fileStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int)Math.Ceiling((length - startBytes + 0.0) / packSize);
for (int i = 0; i < maxCount && Response.IsClientConnected; i++)
{
Response.BinaryWrite(fileStream.ReadBytes(packSize));
}
}
Response.Flush();
Response.End();
}
else
{
Response.StatusCode = 404;
Response.End();
}
}
</script>
6.可以通过以下格式请求媒体文件:
http:////StreamVideo.aspx?file=
其中, 是指你的服务器地址, 是指你的网站名称, 是指你要请求的媒体文件相对于 Media 文件夹的路径。
例如,如果你的服务器地址为 192.168.1.100,你的网站名称为 MyWebsite,你的媒体文件位于 Media 文件夹下的 video.mp4 文件,那么你可以使用以下 URL 请求该文件:
http://192.168.1.100/MyWebsite/StreamVideo.aspx?file=Media/video.mp4
请注意,在这个例子中,媒体文件的路径相对于 StreamVideo.aspx 文件的位置。因此,如果你的 StreamVideo.aspx 文件不是位于网站根目录下,你需要在文件路径前面添加适当的路径。
可以通过以下方式来实现您所述的操作:
1.在 IIS 中,打开网站或应用程序的 Web.config 文件,然后找到或添加以下内容:
<system.webServer>
<staticContent>
<mimeMap fileExtension=".mp4" mimeType="video/mp4" />
</staticContent>
<handlers>
<add name="MP4" path="*.mp4" verb="GET" type="System.Web.StaticFileHandler" modules="StaticFileModule" />
</handlers>
</system.webServer>
这将确保 MP4 文件的 MIME 类型正确设置,并且该文件将被处理为静态文件。
1.创建一个名为 "playVideo.aspx" 的新文件,并添加以下代码:
<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
// 获取视频文件的完整路径
string videoPath = Server.MapPath(Request.QueryString["video"]);
// 使用 FileInfo 类获取文件信息
System.IO.FileInfo video = new System.IO.FileInfo(videoPath);
// 检查文件是否存在
if (!video.Exists)
{
Response.StatusCode = 404;
Response.StatusDescription = "Video Not Found";
Response.End();
}
// 获取视频长度
TimeSpan videoLength = new TimeSpan();
using (var shell = new Shell32.Shell())
{
var folder = shell.NameSpace(System.IO.Path.GetDirectoryName(video.FullName));
var file = folder.ParseName(System.IO.Path.GetFileName(video.FullName));
var lengthProperty = folder.GetDetailsOf(file, 27);
videoLength = TimeSpan.FromSeconds(double.Parse(lengthProperty));
}
// 如果视频长度小于等于5分钟,直接输出整个视频
if (videoLength.TotalMinutes <= 5)
{
Response.ContentType = "video/mp4";
Response.WriteFile(video.FullName);
}
else
{
// 否则只输出前5分钟
Response.ContentType = "video/mp4";
Response.WriteFileRange(video.FullName, 0, (long)(5 * 60 * 1000 * 10000 - 1));
Response.AppendHeader("Content-Range", "bytes 0-" + (5 * 60 * 1000 * 10000 - 1) + "/" + video.Length);
}
}
</script>
此代码将为您处理视频文件请求,并根据视频长度决定是输出整个视频还是仅输出前5分钟。
```
请注意,"path/to/your/video.mp4" 应替换为实际视频文件的路径。