Как транслировать аудио / видео файлы, такие как MP3, MP4, AVI и т. Д., Используя сервлет
Я хотел бы передавать свои аудио / видео файлы в Интернет с помощью сервлета.
Я сделал попытку со следующим сервлетом:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File file = new File("/Users/myfolder/Documents/workspace/love.mp3");
response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength((int) file.length());
Files.copy(file.toPath(), response.getOutputStream());
}
И следующий HTML:
<a href="/media" data-format="mp3 ogg">Click Here!</a>
Тем не менее, плеер просто загружается... загружается... загружается...
Как это вызвано и как я могу решить это?
1 ответ
Многие медиаплееры требуют, чтобы сервер поддерживал так называемые запросы диапазона HTTP. Т.е. он должен иметь возможность возвращать определенные части медиа-файла по запросу с Range
заголовок. Например, только байты с индексом от 1000 до 2000 с файлом длиной 10 МБ. Это является обязательным для многих медиапроигрывателей, чтобы иметь возможность достаточно быстро пропускать определенный диапазон медиапотока и / или повысить скорость буферизации, создавая несколько соединений, каждое из которых запрашивает разные части файла.
Это, однако, много дополнительного кода в вашем сервлете, который требует хорошего понимания HTTP Range
Спецификация. Обычно собственный сервлет по умолчанию для сервлет-контейнера (Tomcat, JBoss AS, Glassfish и т. Д.) Уже поддерживает это сразу. Поэтому, если есть способ опубликовать папку мультимедиа в Интернете стандартными средствами, чтобы вам не нужно было доморощать сервлет для этого, я бы пошел по этому пути.
Непонятно, какой сервлетконтейнер вы используете, поэтому в этом примере я буду использовать Tomcat:
Просто бросьте
love.mp3
файл в общедоступном веб-контенте веб-проекта, чтобы он был доступен только<a href="love.mp3">
без необходимости целого сервлета.Или поставить
love.mp3
файл в новой подпапкеTomcat/webapps
папка, напримерTomcat/webapps/media/love.mp3
, Таким образом, это доступно<a href="/media/love.mp3">
,Или поставить
love.mp3
файл в другом месте на диске, например/path/to/media/love.mp3
и добавить/media
папка как новый контекст, добавив следующую строку в Tomcat's/conf/server.xml
:<Context docBase="/path/to/media" path="/media" />
Таким образом, это доступно
<a href="/media/love.mp3">
также.
В любом случае, собственный Tomcat DefaultServlet
, который имеет надлежащую поддержку Range
запросы, будут использоваться для потоковой передачи контента.
Но если нет абсолютно никакого способа использовать собственный сервлет по умолчанию для servletcontainer, то вам нужно переписать свой код сервлета таким образом, чтобы он правильно поддерживал Range
Запросы. Вы можете получить вдохновение из примеров с открытым исходным кодом, таких как Tomcat DefaultServlet
и OmniFaces FileServlet
,