Видеосервер Moment позволяет транслировать потоковое видео из любого источника flash-клиентам. На его основе можно построить сервисы живого общения, организовать вещание онлайн-ТВ, создать систему видеонаблюдения.
В новой версии появилось много новых возможностей:
Видеосервер Moment позволяет ретранслировать потоковое видео из любого источника flash-клиентам.
Основное назначение Moment — трансляция телеканалов и передача видео с IP-камер. Для просмотра видео пользователю достаточно открыть в браузере страничку сервера и выбрать канал из списка.
Moment написан российскими разработчиками. Если сервер вам полезен, но не хватает какой-то возможности или нужна помощь в настройке — пишите, вам будут рады помочь. К серверу можно добавлять новые плагины, расширяющие область применения. Например, есть тестовый модуль для видеочата.
Доступна независимая бинарная сборка версии 1.0, которая должна работать на любом дистрибутиве Linux. Исходные коды сервера доступны под лицензией GPL.
Некоторое время назад у меня появилась идея собрать набор базовых средств разработки (gcc и основные библиотеки), который можно было бы установить параллельно с теми, которые уже есть в системе. Идея была успешно воплощена в жизнь, в результате появился проект "Суверен", можно почитать об этом тут:
http://sgn.sourceforge.net/readme_rus.html http://sourceforge.net/projects/sgn
Вкратце: утилиты/библиотеки устанавливаются в директорию /opt/sgn, и зависят _только от библиотек из /opt/sgn. Благодаря этому можно просто скачать прекомпилированный архив с "Сувереном", распаковать его в /opt/sgn, и сразу приступать к работе. Единственное требование к системе - чтобы ABI ядра был совместим с прекомпилированной glibc.
По сути система представляет собой набор скриптов для сборки пакетов (а-ля e-build'ов). Процесс сборки с особым префиксом взят из документации к "Linux from scratch".
Вот список причин, почему это может быть удобно (взято с веб-страницы):
* Библиотеки и утилиты в дистрибутиве, который вы используете,
устарели (нет возможностей, присутствующих в последних версиях; API устарел; есть известные ошибки), и вы хотите установить более новую версию, не поломав при этом существующую инсталляцию Linux;
* В выбранный вами дистрибутив включена новая версия библиотеки/утилиты, в которой есть регрессии по сравнению с предыдущими версиями. Вы хотите работать с одной из предыдущих версий, не нарушая при этом целостность дистрибутива;
* Вам нужна утилита/библиотека, которая не входит в установленный дистрибутив Linux, и при этом конфликтует с некоторыми из установленных пакетов;
* При работе вы используете сразу несколько компьютеров (пару ноутбуков и десктопов, офисную рабочую станцию, дюжину серверов в тестовом кластере и т.п.), и не хотите заниматься сопровождением и синхронизацией установленных на этих компьютерах дистрибутивов;
* Тип используемого дистрибутива Linux устанавливается политикой компании, и вы не хотите тратить время на его настройку и проверку того, что всё работает так, как надо;
* У вас есть сервер, на котором не установлены -devel-пакеты (и, возможно, нет gcc), и вы хотите скомпилировать и запустить программу, не устанавливая при этом никаких дополнительных пакетов.
В состав фреймворка можно включить всё, что угодно, потому что он модульный. Сейчас состав пакетов такой:
sendfile в принципе не работает на ядрах 2.6.x?
Судя по man sendfile всё должно работать, а у меня стабильно
возвращает EINVAL. Ядро 2.6.18.
Единственное, что нашёл по этому поводу:
http://ilia.ws/archives/13-sendfile-syscall-and-why-the-2.6-linux-kernel-sucks!.
html
Благо, теперь появился новый способ быстрого копирования - с помощью
splice(), с ним всё нормально работает.
Тестовая программа:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sendfile.h>
#include <unistd.h>
#include <fcntl.h>
int main (int argc, char **argv)
{
int fd_in,
fd_out;
off_t offset;
ssize_t last_sent;
if (argc < 3) {
fprintf (stderr, "2 arguments required\n");
return -1;
}
fd_in = open (argv [1], O_RDONLY);
if (fd_in == -1) {
perror ("open #1");
return -1;
}
fd_out = open (argv [2], O_WRONLY | O_CREAT);
if (fd_out == -1) {
perror ("open #2");
return -1;
}
offset = 0;
for (;;) {
last_sent = sendfile (fd_out, fd_in, &offset, 1 << 20);
if (last_sent < 0) {
perror ("sendfile");
return -1;
}
if (last_sent == 0)
break;
}
fprintf (stderr, "OK\n");
return 0;
}
Смотрю галерею, думаю: столько интересных скринов на ЛОРе.. и не светит мне со своими тремя терминалами на одном столе и браузере на другом, совсем без всяких приятных мелочей, снять что-нибудь. Но скрины время от времени делаю и в расшарку выкладываю, чтобы люди не забывали. Этот показался концептуальным :)