Пользователь
0,0
рейтинг
7 августа 2009 в 23:02

Администрирование → Стабильное вещание IPTV через VLC

IPTV*
С IPTV пришлось познакомиться поближе, когда в компании интернет-провайдера где я работал, решили организовать вещание IPTV. Выяснилось, что вещание осуществляется в linux и программой vlc, которая по слухам единственная в своем роде. Была установлена тарелка и DVB-карта SkyStar2, которая предположительно должна была без проблем заработать в linux'e. Так и было со всеми новыми машинами, где была установлена ubuntu server. На Debian заработало только после обновления ядра. Настройка прошла относительно легко, благо на то время уже было несколько статей на эту тему и документация к vlc была тоже очень полезна. После запуска начались некоторые проблемы с пропаданием звука и видео на каналах и другие проблемы, описанные ниже. После их появления были написаны скрипты, устраняющие эти проблемы. Сейчас на них работает 3 сервера с 5 dvb-картами в общей сложности и вещается 23 канала с 3х спутников. Под катом — перечисление проблем, которые могут появиться после запуска вещания IPTV через VLC в Linux и то как с ними бороться. Бороться будем с помощью bash.


Первоначальная настройка и запуск вещания IPTV хорошо описана в статье «Прием спутниковых тв каналов в linux».
Основные проблемы при вещании IPTV: утечка памяти и пропадание видео или звука в одном из каналов.

Утечка памяти


Проблема утечки памяти решается либо 1) перезагрузкой демона vlc раз в день или больше по необходимости через crontab либо 2) периодической проверкой свободной памяти и перезагрузкой демона при уменьшении сводной памяти до определенного значения.

1)
crontab:
# Перезагружаем vlc в 3 часа ночи
0 3 * * * /home/desecho/vlc/vlc_regular_reload.sh

vlc_regular_reload.sh:
#!/bin/bash<br/>echo "`date`;VLC regular reload" >> /home/desecho/vlc/logs/vlc_restart.log<br/>/home/desecho/vlc/vlc_starter.sh<br/>


2)
crontab:
#Проверяем каждые 5 минут
*/5 * * * * /home/desecho/vlc/memory_check.sh

memory_check.sh:
#!/bin/bash<br/>#Получаем переменную свободной памяти<br/>free_mem=$(free -m | grep ^M | awk -F' ' '{print $4 }')<br/>#Указываем предельное значение свободной памяти<br/>mem_limit=16<br/>#Если свободной памяти меньше или же она совпадает со значением предела то происходит перезагрузка демона<br/>if [ $free_mem -le $mem_limit ]<br/>    then<br/>    echo "`date`;Memory Overload" >> /home/desecho/vlc/logs/vlc_restart.log<br/>    /home/desecho/vlc/vlc_starter.sh<br/>fi <br/>


Пропадание видео или звука


Для решения проблемы необходимо периодически проверять наличие видео и звука в каналах.
Реализация скриптов на примере вещания двух каналов. Вещание идет в два потока — оригинального и сжатого. Иногда помогает перезагрузка проблемного канала, но иногда необходима полная перезагрузка демона.

Для работоспособности скрипта необходимо запустить следующие команды:

cp /usr/bin/vlc /usr/bin/vlc2<br/>touch /home/desecho/vlc/run.sh<br/>chmod +x /home/desecho/vlc/run.sh<br/>


Скрипт запуска и перезагрузки каналов:
vlc_starter.sh:
#!/bin/bash<br/>echo "`date`;Reloaded" >> /home/desecho/vlc/logs/vlc_restart.log<br/> <br/>#Выключаем все запущенные vlc процессы<br/>killall -9 vlc<br/>#Запуск вещания<br/>vlc --no-stats -vvv --color --daemon --ttl 12 --ts-es-id-pid --dvb-adapter 0 --programs=13,14 dvb: --dvb-frequency=10995000 --dvb-srate=20000000 --dvb-voltage=13 --sout '#duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8001},select="program=13",dst=std{access=http,mux=asf,url=0.0.0.0:8002},select="program=14"}'<br/>#Ждем несколько секунд для инициализации вещания<br/>sleep 5<br/>#Вещаем сжатый поток в 820Kbit/s видео и 70Kbit/s аудио<br/>vlc http://127.0.0.1:8001 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8011}'<br/>vlc http://127.0.0.1:8002 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8012}'<br/>


Скрипт проверки каналов:
vlc_restarter.sh:

#!/bin/bash<br/> <br/>#Запись канала<br/>#$1 - id порта сжатого канала<br/>function rec {<br/>    #Запись видео<br/>    b="vlc2 http://127.0.0.1:80$1 -vvv --color --daemon --noaudio --sout '#duplicate{dst=std{access=file,mux=asf,dst=\"/home/desecho/vlc/0$1.avi\"}}'"<br/>    #Создание временного исполняемого файла - такой способ необходим из-за наличия в строке запуска vlc различных ковычек<br/>    echo $b > /home/desecho/vlc/run.sh<br/>    /home/desecho/vlc/run.sh<br/>    #Запись аудио<br/>    b="vlc2 http://127.0.0.1:80$1 -vvv --color --daemon --novideo --sout '#duplicate{dst=std{access=file,mux=asf,dst=\"/home/desecho/vlc/0$1.mp3\"}}'"<br/>    echo $b > /home/desecho/vlc/run.sh<br/>    /home/desecho/vlc/run.sh<br/>    sleep 5<br/>    killall -9 vlc2<br/>}<br/> <br/>#Полная перезагрузка vlc<br/>#$1 - имя канала<br/>function reload {<br/>    echo "`date`;$1 - Reload" >> /home/desecho/vlc/logs/vlc_restart.log<br/>    /home/desecho/vlc/vlc_starter.sh<br/>}<br/> <br/>#Проверка канала<br/>#$1 - id порта сжатого канала<br/>#$2 - имя канала<br/>function check {<br/>    #Смотрим размер видео<br/>    y="$(du /home/desecho/vlc/0$1.avi | grep -oE --regexp='[0-9]+' | sed -n '1p')"<br/>    #Проверяем пустой ли файл<br/>    if [ $y -gt 10 ] ; then<br/>        x011=1<br/>    else<br/>        x011=0<br/>    fi<br/>    #Смотрим размер аудио<br/>    y="$(du /home/desecho/vlc/0$1.mp3 | grep -oE --regexp='[0-9]+' | sed -n '1p')"<br/>    if [ $y -gt 10 ] ; then<br/>        x012=1<br/>    else<br/>        x012=0<br/>    fi<br/>    echo "    $2 - $x011 $x012" >> /home/desecho/vlc/logs/vlc_restart.log<br/>    let x01=x011+x012<br/>    #Если отсутствует звук или видео, то переменная z=0<br/>    if [ $x01 != 2 ]<br/>    then<br/>        z=0<br/>    else<br/>        z=1<br/>    fi<br/>}<br/> <br/>#Полная проверка<br/>#$1 - id порта сжатого канала<br/>#$2 - имя канала<br/>function check_full {<br/>    #Запись канала<br/>    rec $1<br/>    #Проверка на отсутствие видео или звука<br/>    check $1 $2<br/>    #Если видео и звук в норме то помечаем переменную z канала<br/>    if [ $z = 1 ] ; then<br/>        z[$1]=1<br/>    fi<br/>}<br/> <br/>#Перезагрузка канала<br/>#$1 - id порта сжатого канала<br/>#$2 - имя канала<br/>#$3 - id порта исходного канала<br/>function restart {<br/>    echo "`date`;$2 - Restart" >> /home/desecho/vlc/logs/vlc_restart.log<br/>    #Выключение неработающего канала<br/>    a="$(ps -C vlc -o '%p%a' | grep "http://127.0.0.1:80$3 -vvv --daemon --color --sout" | grep -oE --regexp='[0-9]+' | sed -n '1p')"<br/>    kill $a<br/>    #Перезапуск вещания канала<br/>    b="vlc http://127.0.0.1:80$3 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:80$1}'"<br/>    echo $b > /home/desecho/vlc/run.sh<br/>    /home/desecho/vlc/run.sh<br/>}<br/> <br/>#Перезагрузка канала<br/>#$1 - id порта сжатого канала<br/>#$2 - имя канала<br/>#$3 - id порта исходного канала<br/>function fix {<br/>    #Если нет видео или звука на канале то перезагружается канал<br/>    if [ ${z[$1]} != 1 ] ; then<br/>        restart $1 $2 $3<br/>        sleep 5<br/>        #повторная проверка<br/>        check_full $1 $2<br/>    fi<br/>    #Если по прежнему нет звука то перезагружаем VLC полностью<br/>    if [ ${z[$1]} != 1 ] ; then<br/>        reload $2<br/>    exit<br/>fi<br/>}<br/>#Присваиваем значение 0 по умолчанию переменным z каналов<br/>z[11]=0<br/>z[12]=0<br/> <br/>#Проверка канала на отсутствие видео/звука<br/>check_full 11 perviy<br/>#Перезагрузка канала при проблемах с видео/звуком<br/>fix 11 perviy 01<br/> <br/>check_full 12 rossiya<br/>fix 12 rossiya 02<br/> <br/>echo "`date`;DVB - Status: Stable" >> /home/desecho/vlc/logs/vlc_restart.log<br/>


Осталось добавить запись в crontab:
*/5 * * * * /home/desecho/vlc/vlc_restarter.sh

В итоге получаем систему, которая автоматически восстановит вещание каналов при пропадании видео или аудио. Все действия скриптов восстановления вещания будут писаться в лог файл.
Удачного вещания!

UPD: Перенес в блог IPTV. P.S. Спасибо за карму!
UPD2: Для нейтрализации утечки памяти можно собрать vlc без флага «optimisememory» либо попробовать обновить vlc, см. статью «Вещание видеофайлов с помощью VLC multicast. С теорией». Спасибо Breaker.
Антон @desecho
карма
16,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (44)

  • –4
    Пиратите нтвплюс небось? :-)
    • 0
      «вещается 23 канала с 3х спутников» — непохоже…
  • +5
    ТС молодец, не пожалел времени на статью на тему, по которой вроде все всё знают, но готовых 2do не наблюдается
    • +4
      Спасибо, старался. Надеюсь кому-то поможет.
  • +8
    >> killall -9 vlc

    Не используйте kill -9 без прямой необходимости.
    Этот подлый прием не дает программе возможности:
    1) Закрыть все соединения
    2) Очистить/удалить временные файлы
    3) Проинформировать чайлдов (если таковые есть) о том, что приложение завершается
    И так далее…

    Попробуйте 15, в крайнем случае 2 или 1. Иначе просто странная борьба с утечками получается.
  • 0
    а что это за демон такой который течет?
    • +1
      vlc не идеальна, но лучше ничего нет. Возможно в новых версиях уже все нормально.
    • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    спасибо, очень полезная инфа.
  • +2
    Почитайте мой топик ;)
    Чтобы память не утекала выключите флаг оптимизации памяти.
    У меня так:
    # uptime
    20:27:02 up 143 days, 11:17,

    # ps aux | grep vlc
    26863 11.8 7.3 119864 28192 pts/2 Sl+ Jul04 5941:46
    4 июля я добавлял ролики, рестартил службу. Есть вариант динамически подгружать новые ролики/удалять старые.
    • +1
      Обновил топик. Спасибо за информацию!
  • +2
    недавно стал активно осваивать monit
    многие вещи перестал писать на баше типа проверить память и рестартовать процесс
    советую присмотрется к monit и топикстартеру
    здорово поможет и сообщит и рестартанёт
    супер…
  • 0
    кто бы еще расписал как внедрил работу сетевого оборудования с поддержкой мультикаста для работы IPTV
  • 0
    благодарю
  • 0
    Кто-нибудь пробовал при помощи vlc объединять источники в единый multitransport stream, и вещать уже его? Судя по их форуму народ периодически пытается это «осилить», но истории успеха я так и не нашел.
  • 0
    Собственно говоря, скрипты весьма находчивы, оригинальны и полезны — возражений нет. Но… употреблять в названии слово «стабильное вещание » и продавать людям услугу, которую реализует приложение с утечками памяти, регулярно обрубающее транслируемый звук и видео? Вы правда всё это серьёзно?
    • +2
      Услуга iptv предоставляется бесплатно. Название действительно не самое удачное вышло. Подскажите получше — переименую.
  • +1
    Поскольку последний год тема IPTV меня очень интересует, не могу не вставить свои пять копеек. :-)
    1) Автору однозначно «зачет» за раскрытие темы. В интернете и так очень мало материалов по практике использования vlc (читай — примеров), поэтому каждый новый, а особенно такой — с решением конкретных проблем и насущных вопросов (а память у vlc течет уже черт знает сколько времени!), — на вес золота! Есть мысль сделать wiki по iptv — если соберусь, то буду просить у автора разрешение на использование его материалов. :-)
    2) К сожалению, использование vlc для реальной работы на мой взгляд почти нереально — это все-таки ни одним боком не production решение. Но если раньше людям ничего не оставалось, т.к. иных бюджетных средств для трансляции ТВ по сути не было, то сейчас ситуация постепенно исправляется. Вот вам, например, линк — pbi-russia.com/ — это китайское оборудование для ретрансляции спутниковых каналов. Серия 4000 — это все в одном: снимает транспондер, позволяет «распотрошить» его как требуется и сразу же передать по мультикасту. Сам пока не использовал, но отзывы очень хорошие. В девайс вставляются 2 CAM'а, каждый из которых позволяет декодировать до 12 каналов. На всякий случай для тех кто в танке повторю: покупаем карточку НТВ+, вставляем и имеем на выходе 12 декодированных каналов в мультикасте. Но самое главное, это цена решения: меньше 40 тыс. за девайс (прайс-лист есть на сайте). Железка занимает 1 юнит. Короче, у серверов с карточками SkyStar2 шансов нет. :-)
    К сожалению, сам еще с этим железом не работал, но очень хочется. Сейчас веду переговоры с одним из московских провайдеров, чтобы у них на сети поэкспериментировать. :-) Если будут желающие, кому требуется внедрение бюджетного IPTV — обращайтесь. :-)
    • 0
      Короче, у серверов с карточками SkyStar2 шансов нет. :-)

      Насчёт SkyStar2 — согласен на все сто. А вот с TechnoTrend'ом — проблем нет никаких (и на транспонтарах с высокими скоростями).
    • 0
      У меня 20 таких железок. Мультикастом с них можно вещать не более 6 каналов. Я поток гоню через ASI на мультиплексор, с него на стример.
      • 0
        У вас, судя по всему, DCH-4000P-42S — там действительно только 6 каналов. А DCH-4000P-44S вещает до 32 каналов, но и стоит на 400 баксов дороже.
        А что у вас стримером является?
        • 0
          Да, 42S
          Harmonic ProStream 1000.
          • 0
            1) Ну вот же ж… Возможно, надо было 44S брать… Или их не было тогда?
            2) ОК, спасибо за инфу. Почитаю про него.
            • 0
              Их не я заказывал. Работаю с тем, что закупили. Да и через ASI вполне устраивает, конечно лишние звенья, доп. оборудование, но…

              Я бы Гармонику дал 4/5 баллов. Капризный очень.
              • 0
                Дык, а с 44 все равно с ASI работать приходится — если каналы раскодировать, т.к. CAM'ы больше 12 каналов не тянут, так что на второй CAM нужно через ASI заводить с чего-нибудь подешевле, типа 3000…
                Кстати, если вы отдельным стримером пользуетесь, то можно было как раз наверное не 4000 покупать, а 3000 обойтись.
                А чем стример капризный? В плане чего?
                • 0
                  3000-ых тоже чуть более десятка есть ;)
                  Во-первых они удаленно не управляются, а у нас антенный пост находится за пару десятков километров, во-вторых 4000-ая серия поддерживает DVB-S2.

                  Веб-интерфейс работает только в IE, часто глюкуя, от частых пропаданий ASI теряет сигнал совсем, 1 раз умирал винт/флешка (не знаю что там, ибо была пломба).
                  • 0
                    У 3000-х по-моему тоже такая модификация есть…
                    Но не суть. В любом случае — спасибо за информацию! Интересно! :-)
                    Напишите статью в IPTV. Как пример нормальной организации работы, а не поделок на VLC. :-)
                    • 0
                      Трехтысячниками не по управляешь по езернету ;)

                      Шкафчик сейчас в порновиде :) Как все прижимкуем-уложим, сфоткаем антенный пост и напишу про всё :)
                      • 0
                        ОК! :-)
                        Ждем-с! :-)
  • 0
    Ну сколько уже можно промывать косточи этому VLC?
    Зачем использовать целый «комбайн», если из всего функционала будет использоваться только 1%?
    Для вещания IPTV есть специальный софт, предназначенный именно для этих целей.
    Пример: getstream, mumudvb, и dvblast (от тех-же создателей VLC).
    И любое из этих приложений будет работать на порядок стабильнее.
    • 0
      А с чего ты взял, что VLC будет работать не стабильно по сравнению с другими?
      Я пользуюсь VLC уже больше года для просмотра TV и фильмов.
      За все время не видел ни одной проблемы.
      И зачем ставить несколько программ, когда все есть в одной?
      • +1
        Речь идёт не о просмотре фильмов с помощью VLC.
        Вот если бы ты вещал поток со спутника больше года, и при этом использовал VLC, тогда ты столкнулся бы с теми-же проблемами что и автор поста.
  • 0
    а есть бесплатные каналы iptv, чтоб можно было основные российские каналы смотреть? В Китае можно смотреть российское ТВ, но довольно дорого ((
    • +1
      Бесплатные российские каналы перечислены на сайте lyngsat.
      • 0
        спасибо, но вопрос был немного не об этом — на сайте перечислены каналы, которые можно бесплатно смотреть через спутник, а меня интересует через интернет в браузере, используя VLC.

        если я не прав, то значит не увидел, где на этом сайте ссылки на бесплатное iptv
  • +2
    Могу предложить альтернативное решение проблемы — заменить VLC на getstream. ( silicon-verl.de/home/flo/projects/streaming/ )
    Намного легче, чем VLC, и проблем с падениями я не наблюдал.
    • 0
      Вещаем им радио, все работает отлично. Немного не нравится скудность логов.
      • 0
        А dvbshout для радио не пробовали?
        • 0
          Нет
  • 0
    У меня примерно тот же функционал реализован на перле (следит за потреблением памяти и загрузкой ЦП), причем один сервер (очень старый и слабенький) принимает поток с тарелок и ретранслирует на другой, мощный — он уже переживает поток и мультикастит.
    Контроль видео и звука сделал просто с помощью tcpdump — если мультикастовые пакеты наблюдаются, то и картинка есть.
  • 0
    А в Беларуси Белтелеком не стал изобретать велосипед, купив готовое решение у ZTE…
    Печаль.
    • 0
      А сейчас все велосипед. Когда стоял выбор какого производителя покупать оборудования и какая будет мидлварь, всё оказалось сырым. Работа с саппортом не только на тему допиливания софта под нас, но и на устранение глюков велась больше года. И никто не знает что будет впереди ;) Притом выбрали далеко не говно.
      Говно покупали несколько лет назад, украинское :) Вот там явно студент делал ;)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.