Организация IPtv: VLC vs. Getstreamer

Мои пляски с бубном возле IPTV сервера начались уже очень давно, и только сейчас я пришел к конечной стадии танцев :)

Значит так, нужно было в сети городского интернет-провайдера организовать IPTV как бесплатную услугу.

Имеем: Уже настроенные и установленные спутниковые антенны на спутники AMOS, Sirius и ABS. Два достаточно мощных сервера: 1й – Intel Core 2 Quad Q8400, 2GB DDR3 RAM, 5 PCI port; 2й – AMD Athlon 3800+, 2 GB DDR2, 4 PCI port;. И необходимое количество dvb карт ss3 (technotrend).

Цель: Настроить вещание хотя бы 30-40 бесплатных каналов юникастом по http. Добиться максимально хорошего качества и минимального объема передаваемой информации с IPTV сервера дабы не перегрузить сеть трафиком.

И так, приступим:

СПОСОБ ПЕРВЫЙ (VLC):

Сначала я пошел по пути наименьшего сопротивления. Скажу сразу, что одна двб карта может одновременно вещать ТОЛЬКО с одного транспондера.

Немного теории о мультиплексоре (mux) :

name description
mpeg1 MPEG-1 multiplexing – recommended for portability. Only works with mp1v video and mpga audio, but works on all known players
ts MPEG Transport Stream, primarily used for streaming MPEG. Also used in DVDs
ps MPEG Program Stream, primarily used for saving MPEG data to disk.
mp4 MPEG-4 mux format, used only for MPEG-4 video and MPEG audio.
avi AVI
asf ASF
dummy dummy output, can be used in creation of MP3 files.
ogg Xiph.org’s ogg container format. Can contain audio, video, and metadata.

Устанавливаем на наш компьютер Ubuntu Linux 10.0.4; DVB карты заработали из коробки; устанавливаем VLC;

Теперь разбираемся с командой запуска вещания:

vlc -vvv –color –ttl 12 –programs=820,1810 –dvb-adapter=0 dvb:// –dvb-frequency=12732000 –dvb-srate=22000000 –dvb-voltage=13 –sout ‘#duplicate{dst=std{access=http,mux=ogg,dst=:15815},select=»program=820″,dst=std{access=http,mux=ogg,dst=:15817},select=»program=1810″}’

Я думаю, тут не трудно догадаться, что и для чего указывается:
–programs=820,181 : Номера программ, которые будем вещать;
--dvb-adapter=0 : Номер ДВБ карты (от 0 до n);
–dvb-frequency=12732000 : частота транспондера;
–dvb-srate=22000000 : srate транспонедра;
–dvb-voltage=13 : поляризация (13 – горизонтальная, 18 – вертикальная);
–sout : вещать;
#duplicate{dst=std{access=http,mux=ogg,dst=:15815},select=»program=820″ : дубликатом (т.е. полученный поток без изменений) по http, используемый мультиплексер: ogg, на порт 15815 канал под номером 820;

Таким образом на одну карту вешаем все необходимые нам каналы и можем их вещать.

Но у Вас возникнет масса трудностей:

Во-первых: VLC где-то за сутки вещания 20 каналов забивает все 2 Gb оперативной памяти и если ничего не предпринимать, то компьютер начнет загибаться и в итоге сам закроет VLC. Лечим это скриптом, который будет проверять «А не зажрался ли наш плеер? Если да, то закрыть его и открыть снова, иначе – не трогать».

Вот скрипт, который надо засунуть в крон:

#!/bin/bash

MEMUSED=`top -n 1 | grep Mem | awk ‘{print $5}’ | sed ’s/k//i’`

if [ "$MEMUSED" -gt "1300000" ]
then
killall -9 vlc
su -l LOGIN -c ~/scripts/iptv.sh
fi
В данном случае, если используется больше 1,3 Гб оперативной памяти, то killall -9 vlc (т.е. принудительно завершить задачу) и выполнить скрипт iptv.sh, где лежит команда запуска vlc плеера.

Во-вторых: Поток на один канал составит около 8 Мбит/сек на рыло.

В-третьих: Мы будем получать оочень интерлейсную картинку (эффект гребенки).

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

Вот скриншот:

Обратите внимание на бегущую строку

В принципе, это не беда, если у юзера в VLC включить фильтр деинтерлейса ( Видео – Деинтерлейс – ТИП ), но ведь все равно не гуд это.

СПОСОБ ВТОРОЙ (VLC):

Избавится от интерлейса можно путем кодирования видео на лету при вещании.

Теперь немного теории о форматах, в которые можно кодировать с помощью VLC:

name description
mp1v MPEG-1 Video – recommended for portability
mp2v MPEG-2 Video – used in DVDs
mp4v MPEG-4 Video
SVQ1 Sorenson Video v1
SVQ3 Sorenson Video v3
WMV1 Windows Media Video v1
WMV2 Windows Media Video v2
WMV3 Windows Media Video v3, also called Windows Media 9 (unsupported)
DVSD Digital Video
MJPG MJPEG
H263 H263
h264 H264
theo Theora
IV20 Indeo Video
IV40 Indeo Video version 4 or later (unsupported)
RV10 Real Media Video
cvid Cinepak
VP31 On2 VP
FLV1 Flash Video
CYUV Creative YUV
HFYU Huffman YUV
MSVC Microsoft Video v1
MRLE Microsoft RLE Video
AASC Autodesc RLE Video
FLIC FLIC video
QPEG QPEG Video

Теперь рассмотрим команду запуска вещания:

vlc -vvv –color –ttl 12 –programs=2,3,6 –dvb-adapter=0 dvb:// –dvb-frequency=10722000 –dvb-srate=27500000 –dvb-voltage=18 –sout ‘#transcode{vcodec=[CODEC],width=768,height=576,vb=4096,deinterlace}:{dst=standard{access=http,mux=ts,dst=:8011},select=»program=2″,dst=standard{access=http,mux=ts,dst=:8012},select=»program=3″,dst=standard{access=http,mux=ts,dst=:8013},select=»program=6″}’

–sout : вещать;
#transcode{vcodec=[CODEC] : кодировать кодеком [CODEC]
vb=4096 : Видео Битрейт;
deinterlace : деинтерлейсить;

Вот таким способом будет вещать все красиво, НО у меня возник такая проблема: если я в команду добавляю более 2х – 3х каналов, то при кодировании начинают пропадать кадры в больших количествах (при этом процессор не грузится даже на 70 % ) а в логе пишет вот это:

[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (71178)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (171490)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (134428)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (101190)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (58033)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (21130)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (127490)
[0x8f2b260] stream_out_transcode stream out debug: late picture skipped (11837)

Эту проблему я так и не смог победить. :(

Вот, собственно, на этом весь опыт работы с VLC закончился.

Пока все IPtv работает на Getstreamer’e, в планах на будущее купить аппаратный стриммер.


Техническая поддержка, цитаты

Звонит мне один из наших операторов тех. поддержки (мы – интернет провайдер), говорит, что какая-то тётя сильно требует соединить с системным администратором, больше никого слышать не хочет. Как оказалось, этой тёте я когда-то винду переустанавливал.

ОНА: Здравствуйте, это Александр?

Я: Да, здравствуйте.

ОНА: У меня с компьютером проблема, при загрузке выводит сообщение «Невозможно загрузить (!) «Винстон» из-за отсутствия системного файла C:/Windows/System32….»

Я (не в трубку): А Мальборо пробовали? :-D

* После услышанного наш коллектив долго и дружно ржал :-D *

Настройка Wi-Fi моста на Nanostation 2 и Bullet M2.

Вот недавно нужно было настроить вай-фай соединение между небольшими городами, расстояние между объектами было  около 10 км.

Сначала решили попробовать это все с помощью, валявшихся в хозяйстве, Nanostation 2, для них была куплена внешняя антенна (сетка).

И так, при настройке нужно обязательно учитывать параметры коннекта и мощности передатчика, вот эта полезная таблица:

Спецификация передатчика

Скорость передачи Мощность передатчика Погрешность
802.11b 1 Мбит/с 26 dBm +/- 1dB
2 Мбит/с 26 dBm +/- 1dB
5,5 Мбит/с 26 dBm +/- 1dB
11 Мбит/с 26 dBm +/- 1dB
802.11g OFDM 6 Мбит/с 26 dBm +/- 1dB
9 Мбит/с 26 dBm +/- 1dB
12 Мбит/с 26 dBm +/- 1dB
18 Мбит/с 26 dBm +/- 1dB
24 Мбит/с 26 dBm +/- 1dB
36 Мбит/с 24 dBm +/- 1dB
48 Мбит/с 23 dBm +/- 1dB
54 Мбит/с 22 dBm +/- 1dB

Спецификация приемника

Скорость передачи Чувствительность Погрешность
802.11b 1 Мбит/с -97 dBm +/- 1dB
2 Мбит/с -96 dBm +/- 1dB
5,5 Мбит/с -95 dBm +/- 1dB
11 Мбит/с -92 dBm +/- 1dB
802.11g OFDM 6 Мбит/с -94 dBm +/- 1dB
9 Мбит/с -93 dBm +/- 1dB
12 Мбит/с -91 dBm +/- 1dB
18 Мбит/с -90 dBm +/- 1dB
24 Мбит/с -86 dBm +/- 1dB
36 Мбит/с -83 dBm +/- 1dB
48 Мбит/с -77 dBm +/- 1dB
54 Мбит/с -74 dBm +/- 1dB

Еще важно то, что во встроенной в AirOs тулсе «speedtest» обязательно нужно указывать логин / пароль от второго наноса, иначе скорость при тесте будет завышена мегабит на 8 – 10.

В итоге: через Nanostation 2 + внешняя антенна (сетка) мы получили реальную скорость в 12 Мбит/сек при уровне сигнала примерно  в – 55 dbi.

На том же участке, с этой же антенной через Bullet M2 мы получили реальную скорость в 55 – 60 Мбит/сек. Результат вполне устроил. Во время работы с этими игрушками меня смутило только два фактора: 1. Сам bullet почему-то греется как ненормальный. 2. В AirOS отсутствует тулса «speedtest» и скорость приходится измерять своими силами.

И вот полезная таблица «соответствий» для Bullet M2:

Спецификация передатчика

Скорость передачи Мощность передатчика Погрешность
802.11b/g 6-24 Мбит/с 28 dBm +/- 2dB
36 Мбит/с 25 dBm +/- 2dB
48 Мбит/с 24 dBm +/- 2dB
54 Мбит/с 23 dBm +/- 2dB
802.11n
MCS0 28 dBm +/- 2dB
MCS1 28 dBm +/- 2dB
MCS2 28 dBm +/- 2dB
MCS3 28 dBm +/- 2dB
MCS4 27 dBm +/- 2dB
MCS5 25 dBm +/- 2dB
MCS6 23 dBm +/- 2dB
MCS7 22 dBm +/- 2dB

Спецификация приемника

Скорость передачи Чувствительность Погрешность
802.11b/g 24 Мбит/с -83 dBm +/- 2dB
36 Мбит/с -80 dBm +/- 2dB
48 Мбит/с -77 dBm +/- 2dB
54 Мбит/с -75 dBm +/- 2dB
802.11n
MCS0 -96 dBm +/- 2dB
MCS1 -95 dBm +/- 2dB
MCS2 -92 dBm +/- 2dB
MCS3 -90 dBm +/- 2dB
MCS4 -86 dBm +/- 2dB
MCS5 -83 dBm +/- 2dB
MCS6 -77 dBm +/- 2dB
MCS7 -74 dBm +/- 2dB

Подкатом несколько фоток
More >

MRTG: Мониторинг пингов

Предлагаю Вашему вниманию скрипт, с помощью которого можно мониторить время отклик а (пинг) устройство и количество потерь.

Нужно создать скрипт:

#!/bin/sh
PING=»/bin/ping»
ADDR=»IP   пингуемого устройства»
DATA=`$PING -c10 -s500 $ADDR -q `
LOSS=`echo $DATA | awk ‘{print $18 }’ | tr -d %`
echo $LOSS
if [ $LOSS = 100 ];
then echo 0
else
echo $DATA | awk -F/ ‘{print $5 }’
fi

А в /etc/mrtg.cfg:

Title[ping]: RTT to IP
PageTop[ping]: < h2 >Round Trip Time< /h2 >
Target[ping]: `/usr/local/bin/ping.sh` # путь к только что созданному скрипту
MaxBytes[ping]: 2000
Options[ping]: growright,unknaszero,nopercent,gauge
LegendI[ping]: Pkt loss %
LegendO[ping]: Avg RTT
YLegend[ping]: RTT (ms)

На графике будет рисовать зеленым – потери, а синим время пинга (среднее из 10 пакетов)..

Поддержка 2-х ядерных процессоров в Mikrotik Router OS

Вот не давно столкнулся с подозрением на то, что мой Mikrotik 4.4 не правильно работает с 2-х ядерным процессором.  В инете на форумах, где умные дядьки говорят о микротиках я услышал два мнения:

1. Да, там все из коробки работает.

2. Они обещали многоядерность к 5.x версиям.

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

Проверяем: (в терминале)

/system hardware print

Если нам выдало «multi-cpu=no», значит применяем команду

/system hardware set multi-cpu=yes

Ну а если выдало «multi-cpu=yes» - значит все в порядке :)

Вирус xfgni.exe

Словил недавно на вновь установленную винду вирусяку.

Симптомы:

- Тормозит либо вообще не работает интернет, не смотря на то, что PPPoE/VPN подключения запускаются нормально. И локальная сеть пингуется нормально.

- Еще интернет может отключаться через каждые 20 секунд.

Признаки:

- В диспетчере  задач появляется некий процесс xfgni, если его закрыть – все нормализуется.

- В «Автозагрузке» (msconfig) видим это же приложение, которое находится в /system32/drivers/, если запретить запуск – ничего не изменится.

Лечим:

Если Ваша антивирусная система не смогла это счастье удалить, то нужно поставить программку AVZ.. И выполнить в ней следующий скрипт:

begin
SearchRootkit(true, true);
SetAVZGuardStatus(True);
QuarantineFile(‘C:\WINDOWS\system32\60.scr’,»);
QuarantineFile(‘C:\WINDOWS\system32\14.scr’,»);
QuarantineFile(‘C:\WINDOWS\system32\47.scr’,»);
TerminateProcessByName(‘c:\windows\system32\drivers\xfgni.exe’);
QuarantineFile(‘c:\windows\system32\drivers\xfgni.exe’,»);
DeleteFile(‘c:\windows\system32\drivers\xfgni.exe’);
RegKeyParamDel(‘HKEY_LOCAL_MACHINE’,'Software\Microsoft\Windows\CurrentVersion\Run’,'Microsoft Driver Setup’);
RegKeyParamDel(‘HKEY_LOCAL_MACHINE’,'Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run’,'Microsoft Driver Setup’);
DeleteFile(‘C:\WINDOWS\system32\47.scr’);
DeleteFile(‘C:\WINDOWS\system32\14.scr’);
DeleteFile(‘C:\WINDOWS\system32\60.scr’);
BC_ImportAll;
ExecuteSysClean;
BC_Activate;
RebootWindows(true);
end.

beginSearchRootkit(true, true);SetAVZGuardStatus(True);QuarantineFile(‘C:\WINDOWS\system32\60.scr’,»); QuarantineFile(‘C:\WINDOWS\system32\14.scr’,»); QuarantineFile(‘C:\WINDOWS\system32\47.scr’,»); TerminateProcessByName(‘c:\windows\system32\drivers\xfgni.exe’); QuarantineFile(‘c:\windows\system32\drivers\xfgni.exe’,»); DeleteFile(‘c:\windows\system32\drivers\xfgni.exe’); RegKeyParamDel(‘HKEY_LOCAL_MACHINE’,'Software\Microsoft\Windows\CurrentVersion\Run’,'Microsoft Driver Setup’); RegKeyParamDel(‘HKEY_LOCAL_MACHINE’,'Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run’,'Microsoft Driver Setup’); DeleteFile(‘C:\WINDOWS\system32\47.scr’); DeleteFile(‘C:\WINDOWS\system32\14.scr’); DeleteFile(‘C:\WINDOWS\system32\60.scr’);BC_ImportAll;ExecuteSysClean;BC_Activate;RebootWindows(true);end.

После перезагрузки компьютера должно все работать :)