Простейший медиасервер прямо на коленке.

Решил написать статейку, возможно, кому-то подобный "хэлоуворлд" будет интересен и расскажет что-то новое, или сподвигнет на дальнейшее изучение фич, которые были использованы, ну и проч проч. Задача - в десяток строк кода сделать видеохостинг. Все опыты проводились на Ubuntu 16.04.

Все, что для этого (ffmpeg, python, bash) вроде как есть из коробки.

Для начала вкратце объясню, как это работает. Есть такая технология - CGI. Оно выполняет скрипты на стороне сервера и показывает stdout в виде либо текста, либо html. Запилим такой скрипт:


#!/bin/bash


echo "Content-Type: text/html"

echo

echo "<html>"

echo "<head><title>Media_test</title></head>"

echo "<body>"

for file in *; do if [[ "$file" == *.mp4 ]]; then

echo "<h3> "$file" <h3>"

echo "<video src=\"../$file\" controls type="video/mp4"></video>";

fi

done

echo "</body></html>"


Назовем его, скажем, test, создадим в папке с вашими медиафайлами папочку cgi-bin, кинем туда этот скрипт (не забудьте сделать его исполняемым).

Что делает скрипт?

Сначала - стандартная заглушка для html, заголовок, потом он перебирает файлы, и если находит видео mp4, выводит название и само видео тегом <video>.

Где подвох?

Подвох в том, что html5 умеет очень ограниченное количество форматов, и обычные mkv, которые, как правило, h264+ac3, в этот список не входят. Но можно перепаковать их сравнительно малой кровью в mp4 h264+aac такой командой в папке с медиафайлами:


for i in *mkv; do ffmpeg -i "$i" -strict experimental -c:v copy -c:a aac -b:a 192k "$i".mp4; done


И, в финале, нам нужен http-сервер. Т.к пример у нас хэллоуворлдный, воспользуемся встроенным в питон. Выполним в папке с медиафайлами:


python3 -m http.server --cgi


Все! Вы великолепны! Перейдите по адресу 127.0.0.1:8000/cgi-bin/test и полюбуйтесь проделанной работой))

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

GNU/Linux

1K постов15.5K подписчика

Добавить пост

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

1
Автор поста оценил этот комментарий

Я бы посоветовал не заниматься сбором плеера из говна и палок, а воспользоваться уже готовым и более, чем красивым. Есть Plex Server. Работает так же из коробки, нужно только установить. Красивый web-интерфейс, интуитивное управление, доступ из любой точки. + взаимодействие со Smart TV.

Ставил у себя на FreeBSD. Но раз заработало там, то на линуксе запустится еще быстрей и проще

1
Автор поста оценил этот комментарий

А что, в убунте вернули ffmpeg? Вроде avconv был некоторое время (я сейчас не на линуксе).

А ещё, хром по крайней мере, умеет mkv - на нем основан контейнер для webm, но кодеки в него положить можно любые которые может хром, в том числе h264 (а вот ac3 врядли). Safari жрет все что прожевывает QuickTime (правда это не много). Короче есть некоторые возможности сверх определенных стандартов.

Автор поста оценил этот комментарий

Меня волнует другой вопрос, вы это делали с целью последующего практического применения сего сервера или баловства (проверки навыков) ради?

DELETED
Автор поста оценил этот комментарий
Можно ли организовать нечто подобное только что бы RTSP подхватывал и записывал на сервер полученное?)
раскрыть ветку
Автор поста оценил этот комментарий

А разве этот скрипт работает?
В for цикле вы ищите в текущей директории(откуда был запущен скрипт, это $PWD), а ссылку делаете на уровень ниже. Я понимаю что скрипт находится в папке cgi-bin, а файлы в ../test, но как тогда работает for? У меня есть предположение почему он может работать, но при изменении конфига апача, работать скорее всего перестанет.

раскрыть ветку