WMV 流媒体文件大小限制
WMV streaming file size limit
我的网页视图中嵌入了 windows 媒体播放器:
<div id="divCourseVideo" style="width:100%;margin:0 auto;" class="container">
<OBJECT style="display:inline-block" ID="CoursePlayer" HEIGHT="400" WIDTH="400" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="video/x-ms-wmv">
<param name='URL' value="@Url.Action("ShowMovie", "OLT", new { courseId = Model.ID })" />
<param name='autoStart' value="true" />
<param name='currentPosition' value="false" />
<param name='showControls' value="true" />
</OBJECT>
</div>
ShowMovie 操作从数据库中提取视频流并将其发送到视图:
public void ShowMovie(string courseId)
{
CourseVideo video = Repository.GetCourseVideoStream(courseId);
var bytesinfile = new byte[video.VideoStream.Length];
video.VideoStream.Read(bytesinfile, 0, (int)video.VideoStream.Length);
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
}
当我使用大小在10K左右的视频时可以正常播放。但是,如果我使用一个大约 137K 左右的文件,则该文件永远不会播放。它太大了吗?
当我使用 F12 查看网络 activity 时,我看到文件正试图下载为 text/html。这是为什么?我还在 GET 函数上看到它正在中止。这是为什么?我增加了 executionTimeout 值但无济于事。
来自 napuza 的信息很好,我能够获得正确的内容类型,似乎整个文件都流式传输到浏览器,但它从未播放。
指定内容类型:
ControllerContext.HttpContext.Response.ContentType = "video/x-ms-wmv";
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
尝试分块发送文件:
response = ...
byte[] buffer = new byte[4096];
response.ContentType = "video/x-ms-wmv";
response.AppendHeader("content-length", video.VideoStream.Length);
while ( response.IsClientConnected) {
int bytesRead = video.VideoStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0 ) {
break;
}
response.OutputStream.Write(buffer, 0, bytesRead);
response.Flush();
}
response.End();
您可以尝试实现HTTP range requests。
我感谢 napuzba 的回答,因为他引导我朝着正确的方向前进。我成功了:
CourseVideo video = Repository.GetCourseVideoStream(courseId);
var bytesinfile = new byte[video.VideoStream.Length];
video.VideoStream.Read(bytesinfile, 0, (int)video.VideoStream.Length);
byte[] buffer = new byte[4096];
ControllerContext.HttpContext.Response.ContentType = "video/x-ms-wmv";
ControllerContext.HttpContext.Response.AppendHeader("content-length", video.VideoStream.Length.ToString());
video.VideoStream.Seek(0, SeekOrigin.Begin);
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
ControllerContext.HttpContext.Response.End();
但是,我一直使用的某些 WMV 文件仍然无法播放。我怀疑它可能与文件中的元数据有关。有人对此有想法吗?
我的网页视图中嵌入了 windows 媒体播放器:
<div id="divCourseVideo" style="width:100%;margin:0 auto;" class="container">
<OBJECT style="display:inline-block" ID="CoursePlayer" HEIGHT="400" WIDTH="400" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="video/x-ms-wmv">
<param name='URL' value="@Url.Action("ShowMovie", "OLT", new { courseId = Model.ID })" />
<param name='autoStart' value="true" />
<param name='currentPosition' value="false" />
<param name='showControls' value="true" />
</OBJECT>
</div>
ShowMovie 操作从数据库中提取视频流并将其发送到视图:
public void ShowMovie(string courseId)
{
CourseVideo video = Repository.GetCourseVideoStream(courseId);
var bytesinfile = new byte[video.VideoStream.Length];
video.VideoStream.Read(bytesinfile, 0, (int)video.VideoStream.Length);
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
}
当我使用大小在10K左右的视频时可以正常播放。但是,如果我使用一个大约 137K 左右的文件,则该文件永远不会播放。它太大了吗?
当我使用 F12 查看网络 activity 时,我看到文件正试图下载为 text/html。这是为什么?我还在 GET 函数上看到它正在中止。这是为什么?我增加了 executionTimeout 值但无济于事。
来自 napuza 的信息很好,我能够获得正确的内容类型,似乎整个文件都流式传输到浏览器,但它从未播放。
指定内容类型:
ControllerContext.HttpContext.Response.ContentType = "video/x-ms-wmv";
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
尝试分块发送文件:
response = ...
byte[] buffer = new byte[4096];
response.ContentType = "video/x-ms-wmv";
response.AppendHeader("content-length", video.VideoStream.Length);
while ( response.IsClientConnected) {
int bytesRead = video.VideoStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0 ) {
break;
}
response.OutputStream.Write(buffer, 0, bytesRead);
response.Flush();
}
response.End();
您可以尝试实现HTTP range requests。
我感谢 napuzba 的回答,因为他引导我朝着正确的方向前进。我成功了:
CourseVideo video = Repository.GetCourseVideoStream(courseId);
var bytesinfile = new byte[video.VideoStream.Length];
video.VideoStream.Read(bytesinfile, 0, (int)video.VideoStream.Length);
byte[] buffer = new byte[4096];
ControllerContext.HttpContext.Response.ContentType = "video/x-ms-wmv";
ControllerContext.HttpContext.Response.AppendHeader("content-length", video.VideoStream.Length.ToString());
video.VideoStream.Seek(0, SeekOrigin.Begin);
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
ControllerContext.HttpContext.Response.End();
但是,我一直使用的某些 WMV 文件仍然无法播放。我怀疑它可能与文件中的元数据有关。有人对此有想法吗?