Ответ 1
Укажите ContentType:
ControllerContext.HttpContext.Response.ContentType = "video/x-ms-wmv";
ControllerContext.HttpContext.Response.BinaryWrite(bytesinfile);
У меня есть медиаплеер 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);
}
Когда я использую видео с размером около 10 тыс. или около того, он будет играть нормально. Но если я использую файл размером около 137 тыс. Или около того, файл никогда не будет воспроизводиться. Он слишком велик?
Когда я использую F12 для просмотра сетевой активности, я вижу, что файл пытается спуститься как text/html. Почему это? Я также вижу, что функция GET прерывается. Почему это? Я увеличил значение executeTimeout безрезультатно.
Информация от napuza была хорошей, я смог получить правильный тип контента, и кажется, что весь файл был передан в браузер, но он никогда не воспроизводится.
Укажите ContentType:
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.
Я дал кредит напузбе за ответ, потому что он привел меня в правильном направлении. Мне это удалось:
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, с которыми я работал, все еще не воспроизводятся. Я подозреваю, что это может иметь какое-то отношение к метаданным в файле. У кого-нибудь есть идеи по этому поводу?