Как заставить HTML5-видео очищаться в Chrome при доставке через службу?

Поэтому из-за того, что содержимое находится на другом диске, а не в виртуальном каталоге моего серверного приложения, мне пришлось реализовать службу получения файлов.

Я могу получить размер файла. Затем я хочу установить заголовки содержимого, чтобы браузер знал общий размер и, следовательно, знал, как пропорционировать панель поиска.

Здесь я устанавливаю заголовок общего размера:

   string bytes = Convert.ToString( fInfo.Length );                   
   Response.AddHeader("Content-Length", bytes );
   Response.AddHeader("Content-Range", "bytes 0-" + bytes + "/" + bytes);

В результате чего:

Content-Length: 1389363
Content-Type: video/ogg
Content-Range: bytes 0-1389363/1389364

Я скачал полученный файл и убедился, что байты совпадают. В файрфоксе работает нормально, в хроме все дурацко. В Chrome он воспроизводится до конца, но не перемещает полосу поиска, а затем показывает отрицательную бесконечность в текущем времени, когда она достигает конца. ТАКЖЕ я вообще не могу очистить видео, предположительно, потому что оно имеет недопустимую продолжительность.

воспроизведение того же файла непосредственно в chrome работает правильно, так что, может быть, это какой-то заголовок контента, который chrome хочет, чтобы firefox не обращал внимания на s #% t?

Любые идеи? Неверная единица измерения длины? встроенная кодировка g-zip на стороне сервера мешает?

Я использую стандартный видео объект:

<video class="videoplayer" controls="" autoplay="autoplay" tabindex="0">
<source type="video/ogg" src="http://vb_html.dev/GetFile.aspx?filename=c:/_assets/4c2c09c2-f2ff-e011-a992-009056af18ff/softsignage/softsignage-00000000600.ogv"></source>
Your browser does not support the video tag.
</video>

Для большей справки, вот как я передаю данные файла:

  FileStream mystream = new FileStream(anyFilePath, FileMode.Open, FileAccess.Read);
                    byte[] buffer = new byte[4096];
                    using (BinaryReader reader = new BinaryReader(mystream))
                    {

                        while (true)
                        {
                            int bytesRead = mystream.Read(buffer, 0, buffer.Length);
                            if (bytesRead == 0) break;
                            Response.OutputStream.Write(buffer, 0, bytesRead);
                        }
                    }

person FlavorScape    schedule 19.07.2012    source источник
comment
Кажется, что я должен использовать Response.WriteFile(), но все решения кажутся довольно сложными только для обработки запросов, специфичных для диапазона.   -  person FlavorScape    schedule 20.07.2012


Ответы (2)


Попробуйте установить код состояния на 206:

response.StatusCode = 206;
person shaz    schedule 28.09.2012

По сути, вы хотите получить диапазон запроса в байтах и ​​вернуть эту часть файла. Вы можете сделать это в MVC с помощью

     RangeFileStreamResult(Stream fileStream, string contentType, string fileName, DateTime modificationDate);

Используя пример Codeplex из этой библиотеки http://mvcresumingactions.codeplex.com/

--

person FlavorScape    schedule 29.07.2013