HTML5 - jak przesyłać strumieniowo duże pliki. mp4?
Próbuję skonfigurować bardzo podstawową stronę html5, która ładuje. mp4 wideo, które jest 20MB. Wygląda na to, że przeglądarka musi pobrać całość, a nie tylko odtwarzać pierwszą część wideo i przesyłać strumieniowo resztę.
Ten post jest najbliższą rzeczą, jaką znalazłem podczas wyszukiwania... Próbowałem zarówno Hamulca ręcznego, jak i danych nie widać różnicy:
Jakieś pomysły jak to zrobić lub czy to możliwe?Oto kod I ' m użycie:
<video controls="controls">
<source src="/video.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
2 answers
-
Upewnij się, że
moov
(metadane) znajduje się przedmdat
(Dane audio/wideo) . Jest to również nazywane "szybkim startem" lub "zoptymalizowanym Internetem". Na przykład, hamulec ręczny ma pole wyboru "Web Optimized" , a ffmpeg i avconv mają opcję wyjścia-movflags faststart
. - Upewnij się, że serwer WWW zgłasza prawidłowy typ treści (wideo / mp4).
- upewnij się, że serwer WWW jest skonfigurowany do obsługi żądań zakresu bajtów.
- Upewnij się, że Twój serwer WWW nie stosuje kompresji gzip ani deflate oprócz kompresji w pliku mp4.
Możesz sprawdzić nagłówki wysyłane przez serwer WWW za pomocą curl -I http://yoursite/video.mp4
lub za pomocą narzędzi programistycznych w przeglądarce (Chrome, Firefox ) (przeładuj stronę, jeśli jest buforowana). Nagłówek odpowiedzi HTTP powinien zawierać Content-Type: video/mp4 i Accept-Ranges: bytes oraz no Content-Encoding: .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:43
Oto rozwiązanie, którego użyłem do stworzenia kontrolera Web API w C# (MVC), który będzie obsługiwał pliki wideo z zakresami bajtów (częściowe żądania). Częściowe żądania pozwalają przeglądarce pobrać tylko tyle wideo, ile trzeba odtworzyć, zamiast pobierać cały film. To sprawia, że jest o wiele bardziej wydajny.
Uwaga To działa tylko w najnowszych wersjach.
var stream = new FileStream(videoFilename, FileMode.Open, FileAccess.Read , FileShare.Read);
var mediaType = MediaTypeHeaderValue.Parse($"video/{videoFormat}");
if (Request.Headers.Range != null)
{
try
{
var partialResponse = Request.CreateResponse(HttpStatusCode.PartialContent);
partialResponse.Content = new ByteRangeStreamContent(stream, Request.Headers.Range, mediaType);
return partialResponse;
}
catch (InvalidByteRangeException invalidByteRangeException)
{
return Request.CreateErrorResponse(invalidByteRangeException);
}
}
else
{
// If it is not a range request we just send the whole thing as normal
var fullResponse = Request.CreateResponse(HttpStatusCode.OK);
fullResponse.Content = new StreamContent(stream);
fullResponse.Content.Headers.ContentType = mediaType;
return fullResponse;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 12:13:54