Прием спутниковых тв каналов в linux

    Доброго времени суток.
    Хочу вам рассказать про настройку приема спутниковых не закодированных тв каналов в linux и вещание их в локальную сеть.
    Исходными данными будем считать наличие спутниковой антенны настроенной на определенный градус(например на www.lyngsat.com/amos2.html) и компьютера под управлением linux(не важно какой дистрибутив, в моем случае был Slackware). Задача очень интересная и актуальная в наше время.

    Немного теории


    Для приема сигнала нам понадобятся следующие программы:
    scan — для сканирование каналов на транспондере.
    szap — для проверки приема данных с танспондера.
    vlc — для приема и вещания.

    Первые две утилиты находятся в пакете linuxtv-dvb-apps. Что бы их установить можно воспользоваться менеджером пакетов вашего дистрибутива или пойти на LinuxTV, скачать исходники и собрать.
    vlc так же можно установить используя менеджер пакетов, или с официального сайта VLC

    frec — частота или транспондер
    sr (symbol rate) — символьная скорость
    fec — частота коррекции ошибок
    V, H, L, R — поляризация
    Сигнал который возможно принять может находиться в C и Ku диапазонах, в линейной(v,h) и круговой поляризации(l,r).

    Ловим сигнал


    Первым делом надо проверить, определилась ли наша dvb-карта в системе:
    Это очень просто узнать, достаточно выполнить lspci и найти там подобные строчки:

    03:05.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)
    03:06.0 Network controller: Techsan Electronics Co Ltd B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card (rev 02)
    03:05.0 Multimedia video controller: Conexant CX23880/1/2/3 PCI Video and Audio Decoder (rev 05)
    03:05.2 Multimedia controller: Conexant CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] (rev 05)
    03:05.4 Multimedia controller: Conexant CX23880/1/2/3 PCI Video and Audio Decoder [IR Port] (rev 05)

    1е устройство — skystar3
    2е устройство — skystar2
    3е, 4е, 5е устройства — twinhan 1027

    Вот так это выглядит у меня:
    root@sat:/# lspci
    00:00.0 Host bridge: ATI Technologies Inc Unknown device 7910
    00:01.0 PCI bridge: ATI Technologies Inc Unknown device 7912
    00:07.0 PCI bridge: ATI Technologies Inc Unknown device 7917
    00:12.0 SATA controller: ATI Technologies Inc SB600 Non-Raid-5 SATA
    00:13.0 USB Controller: ATI Technologies Inc SB600 USB (OHCI0)
    00:13.1 USB Controller: ATI Technologies Inc SB600 USB (OHCI1)
    00:13.2 USB Controller: ATI Technologies Inc SB600 USB (OHCI2)
    00:13.3 USB Controller: ATI Technologies Inc SB600 USB (OHCI3)
    00:13.4 USB Controller: ATI Technologies Inc SB600 USB (OHCI4)
    00:13.5 USB Controller: ATI Technologies Inc SB600 USB Controller (EHCI)
    00:14.0 SMBus: ATI Technologies Inc SB600 SMBus (rev 14)
    00:14.1 IDE interface: ATI Technologies Inc SB600 IDE
    00:14.2 Audio device: ATI Technologies Inc SB600 Azalia
    00:14.3 ISA bridge: ATI Technologies Inc SB600 PCI to LPC Bridge
    00:14.4 PCI bridge: ATI Technologies Inc SB600 PCI to PCI Bridge
    00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
    00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map
    00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller
    00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
    01:05.0 VGA compatible controller: ATI Technologies Inc Radeon X1200 Series
    02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
    03:05.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)
    03:06.0 Network controller: Techsan Electronics Co Ltd B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card (rev 02)


    Следующим шагом будет запуск модулей ядра для этих dvb-карт.
    Нужные модули зависят от чипсета dvb-карт, но есть 2 обязательных модуля: dvb_core и dvb_pll.
    Для SkyStar 2: b2c2_flexcop
    Для SkyStar 3: budjet
    Для Twinhan 1027: cx88_dvb

    В 99 случая из 100 нужные модули загрузились при старте системы. Так это или нет проверить очень просто lsmod | grep dvb
    Вот так это выглядит все на той же системе:
    root@sat:/# lsmod | grep dvb
    dvb_pll 15876 2 b2c2_flexcop,lgh06xf
    dvb_core 74280 5 b2c2_flexcop,budget,lgdt330x,budget_core,stv0299


    Если модули удачно загрузились, то вы увидите новые устройства в директории /dev/dvb:
    root@sat:/# ls /dev/dvb/
    adapter0/ adapter1/


    Отлично, теперь нам надо поймать сигнал.
    Первым делом надо будет просканировать какой-либо из доступных нам транспондеров и узнать какие же каналы мы можем принимать.
    На помощь нам приходит установленная нами утилитка scan.
    Она сканирует транспондер и выдает на стандартный поток вывода информацию о доступных каналах.
    Из параметров ей необходимо передать путь к файлу конфигурации, номер dvb-адаптера которым сканировать и при круговой поляризации выставить вручную частоты.

    Файл конфигурации для scan легко написать пользуясь информацией с сайта lyngsat.com. На нем нужно найти спутник на настроенный вами градус и из этого спутника выбрать любой транспондер.
    На нашем примере, www.lyngsat.com/amos2.html, выберем транспондер(freq) 10759, горизонтальной(H) поляризацией, символьной скоростью(sr) 30000 и частотой коррекции ошибок(fec) 3/4. Наш файл конфигурации для scan будет выглядеть следующим образом:

    S 10759000 H 30000000 3/4


    Пользоваться так:
    root@sat:/etc/sat/test# scan -a 0 /path/to/trans.conf
    scanning /path/to/trans.conf
    using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
    initial transponder 10759000 H 30000000 3
    >>> tune to: 10759:h:0:30000
    Network Name 'NET'
    0x0000 0x0001: pmt_pid 0x0020 Spacecom -- KIEV STB (running, scrambled)
    0x0000 0x0002: pmt_pid 0x0030 Spacecom -- M1 (running, scrambled)
    0x0000 0x0003: pmt_pid 0x0040 Spacecom -- TONIS (running, scrambled)
    0x0000 0x0005: pmt_pid 0x0060 Spacecom -- ICTV (running, scrambled)
    0x0000 0x0006: pmt_pid 0x0070 Spacecom -- M2 (running, scrambled)
    0x0000 0x0008: pmt_pid 0x1079 Spacecom -- NEWS 24 (running, scrambled)
    0x0000 0x0009: pmt_pid 0x0200 Spacecom -- Radio Antoshka (running, scrambled)
    0x0000 0x000a: pmt_pid 0x0100 Spacecom -- MTV UKRAINE (running, scrambled)
    0x0000 0x000b: pmt_pid 0x0080 Spacecom -- QTV (running, scrambled)
    dumping lists (9 services)
    KIEV STB:10759:h:0:30000:33:34:1
    M1:10759:h:0:30000:49:50:2
    TONIS:10759:h:0:30000:65:66:3
    ICTV:10759:h:0:30000:97:98:5
    M2:10759:h:0:30000:113:114:6
    NEWS 24:10759:h:0:30000:4194:4195:8
    Radio Antoshka:10759:h:0:30000:0:513:9
    MTV UKRAINE:10759:h:0:30000:257:258:10
    QTV:10759:h:0:30000:129:130:11
    Done.

    В случае с круговой поляризацией надо добавить ключик -l со значениями 10750,10750,0

    scan -a 0 /path/to/trans.conf -l 10750,10750,0


    Попробуем настроить карту на приём данных. Для этого нам понадобится конфигурационный файл для szap. Его очень просто получить:
    root@sat:~# scan -a 0 ~/trans36.conf -l 10750,10750,0 > ~/channels.conf
    root@sat:~# cat ./channels.conf
    Sport 1:11727:h:0:27500:101:201:1
    Sport 2:11727:h:0:27500:102:202:2
    First Automotive:11727:h:0:27500:103:203:3
    BIZ TV:11727:h:0:27500:104:204:4
    Che-Pe_INFO:11727:h:0:27500:105:205:5
    TBi:11727:h:0:27500:106:206:6
    TV3:11727:h:0:27500:107:207:7
    CHANSON:11727:h:0:27500:108:208:8
    TOPSHOP TV:11727:h:0:27500:109:209:9
    Expert test:11727:h:0:27500:110:210:10
    Football test:11727:h:0:27500:111:211:11
    Engineer_1:11727:h:0:27500:114:214:14


    Теперь подсунем этот файл конфигурации в szap:
    root@sat:~# szap -c ./channels.conf -n 1 -x -l 10750,10750,0
    reading channels from file './channels.conf'
    zapping to 1 'Sport 1':
    sat 0, frequency = 11727 MHz H, symbolrate 27500000, vpid = 0x0065, apid = 0x00c9
    using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
    status 00 | signal 6262 | snr fcfc | ber 00000000 | unc 00000000 |
    status 1f | signal 4d4d | snr 3535 | ber 00000000 | unc 00000006 | FE_HAS_LOCK

    Если появилась надпись «FE_HAS_LOCK» значит все ок, настроились верно.
    Параметры для szap похожи на параметры для scan:
    -с /path/to/channels.conf — путь к файлу конфигурации с каналами.
    -n X — номер канала из файла channels.conf, где X число начиная с 1.
    -x — как только szap залочиться, сразу завершится.
    -l 10750,10750,0 — необходимо для антенн с круговой поляризацией.

    Вещаем в сеть


    Итак, мы получили список каналов доступных нам на транспондере.
    Теперь, когда мы знаем частоты, поляризацию, и узнали pid нужных каналов(последняя цифра в каждой строке, pid канала m1 = 2) можно приступить к непосредственному приему потока.
    Для этого мы воспользуемся всемогущим плеером vlc.

    Параметров передаваемых при старте довольно много и каждый раз их набирать бессмысленно, советую записать всю команду запуска vlc в исполняемый оболочкой файл.
    #!/bin/bash
    /usr/bin/vlc -vvv --color --ttl 12 --ts-es-id-pid --dvb-adapter=0 --programs=1,2,3,6,8,10,11 dvb:
    --dvb-frequency=10759000 --dvb-srate=30000000 --dvb-voltage=18 --dvb-fec=9 -d --sout '#duplicate{
    dst="standard{access=http,mux=ts,url=0.0.0.0:8011}",select="program=1"
    dst="standard{access=http,mux=ts,url=0.0.0.0:8012}",select="program=2"
    dst="standard{access=http,mux=ts,url=0.0.0.0:8013}",select="program=3"
    dst="standard{access=http,mux=ts,url=0.0.0.0:8014}",select="program=6"
    dst="standard{access=http,mux=ts,url=0.0.0.0:8015}",select="program=8"
    dst="standard{access=http,mux=ts,url=0.0.0.0:8016}",select="program=10"
    dst="standard{access=http,mux=ts,url=0.0.0.0:8017}",select="program=11"}'


    Немного о параметрах:
    -vvv — подробный вывод сообщений, полезно при отладке.
    --color — разукрашивает вывод сообщений, подсвечивает критичные сообщения красным, очень удобно, если используется -vvv.
    --dvb-adapter — номер dvb адаптера из /dev/dvb/, в случае если у вас в компьютере установлено больше одного.
    --programs — pid'ы каналов, которые необходимо принимать.
    -d — работать как демон.
    --dvb-fec — Значение fec 1/2 9 — определяется автоматически
    dst=«standard{access=http,mux=ts,url=0.0.0.0:8011}»,select=«program=1»

    Каждая из подобных строчек связывает pid канала с портом компьютера. В данном случае канал с pid'ом 1 будет транслироваться на 8011 порту.

    Осталось лишь проверить.
    Запускаем с клиента и смотрим:
    mplayer h_t_t_p://10.16.0.12:8012

    Комментарии 42

      +5
      в избранное добавил, осталось обзавестись аппаратурой :)
        0
        Повезло вашей локальной сети.
          0
          flysat.com — часто точнее, чем лингсат
            0
            Теперь осталось кому то все это дело вещать в интерне =) А то путевых сайтов с тв нету.
              0
              Зомбобокс?
                0
                Приглашения? =(
              +4
              на мой вкус так для вышеописанных целей vdr гораздо больше подходит чем vlc

              Во первых, все что нужно из конфигурации это подсунуть vdr'у файл channels.conf, в данной статье я так и не понял тайного смысла его создания, если используется vlc

              Во вторых, для вещания в vdr есть отличный плагин sreamdev, который вещает по http все каналы из channels.conf, и при этом создает еще некий простой веб-интерфейс для выбора каналов и управления

              В третьих, через vdr можно легко смотреть и вещать закрытые каналы с помощью плагина SC, как имея официальную карту доступа, так и пиратскими способами, vlc же не умеет ни того ни другого

              vlc имеет смысл использовать только в случае необходимости вещания в сеть через multicast или пережатия потока на лету. кстати, если кто знает как через vdr вещать мультикастом, расскажите.
                0
                ах да совсем забыл, практически во всех без исключения дистрибутивах vdr поставляется в пакете с init скриптом, то есть он без всякого шаманства будет автоматически запускаться при старте системы. К vlc я init скриптов в пакетах с ним ни разу не встречал, и нужно сочинять свой скрипт, для того чтобы не запускать его каждый раз руками.
                  0
                  есть sasc-ng для просмотра закрытых каналов, где угодно… ядро у проектов vdr-sc и sasc-ng одно и тоже, оболочка разная.
                  +1
                  А вещать в сеть закрытые каналы с использованием шары можете научить? Ато сейчас смотрю через kaffeine с плагином для хитрого просмотра, но в сеть с него чето не вещается.
                    +1
                    vdr с плагинами sc и streamdev
                    0
                    Карты уже не засыпают?
                    Помню очень долго с засыпанием боролся
                      0
                      засыпание актуально только для рыбалки. софтовые карты вообще не засыпают
                        +1
                        А можно для не повящённых перевести на русский? :)
                          0
                          засыпали только карты с аппаратным демультеплексированием потока, такие как SS1 и SS2

                          в новых все операции с потоком производит CPU и засыпания н наблюдается. в ядрях начиная где-то с 2.6.25 уже даже убрали возможность отключить «засыпание» параметром dvb_shoutdown
                      0
                      Да, задача актуальная. Ибо украинские кабельные каналы с полгода назад отключили, как раз перед газовой эпопеей.
                        0
                        спасибо огромное за статью! безуспешно уже около месяца пытался сделать тоже самое под Windows, но даже нормально каналы не смог поймать.

                        теперь буду пробовать :)
                          0
                          если даже каналы не ловятся, то скорее всего проблема в настройки тарелки, а не в операционной системе
                            0
                            проблемы не в настройках — на телевизоре показывают каналы;
                            не в операционной системе — а в неумении пользоваться программой для поиска каналов :)
                          0
                          Сколько одновременно каналов можно передавать?
                            0
                            С одной карточкой можно вещать весь транспондер.
                              0
                              Спасибо. А возможжно ли закрытые каналы, например Viaccess, смотреть? Естественно при наличии карточки? Есть опыт?
                            0
                            getstream — наше всё!
                              0
                              Спасибо за статью.
                              У меня назрел вопрос к знающим людям: какую dvb-s карту лучше всего выбрать для линукса? Чтобы не было проблем с дровами, можно было легально и не очень подключиться к закрытым каналам, чтобы можно было смотреть HD. =)
                              Заранее благодарю.
                                0
                                Technotrend TT-budget S2-3200 + CI DVB-S/S2 PCI карта.
                                0
                                если вывод

                                ejudge@ejudge-desktop:~$ lspci
                                00:00.0 Host bridge: Silicon Integrated Systems [SiS] 651 Host (rev 02)
                                00:01.0 PCI bridge: Silicon Integrated Systems [SiS] Virtual PCI-to-PCI bridge (AGP)
                                00:02.0 ISA bridge: Silicon Integrated Systems [SiS] SiS962 [MuTIOL Media IO] (rev 25)
                                00:02.1 SMBus: Silicon Integrated Systems [SiS] SiS961/2 SMBus Controller
                                00:02.5 IDE interface: Silicon Integrated Systems [SiS] 5513 [IDE]
                                00:02.7 Multimedia audio controller: Silicon Integrated Systems [SiS] AC'97 Sound Controller (rev a0)
                                00:03.0 USB Controller: Silicon Integrated Systems [SiS] USB 1.1 Controller (rev 0f)
                                00:03.1 USB Controller: Silicon Integrated Systems [SiS] USB 1.1 Controller (rev 0f)
                                00:03.3 USB Controller: Silicon Integrated Systems [SiS] USB 2.0 Controller
                                00:04.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 PCI Fast Ethernet (rev 91)
                                00:0f.0 Multimedia controller: Philips Semiconductors SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (rev d0)
                                00:10.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS)
                                01:00.0 VGA compatible controller: nVidia Corporation NV31 [GeForce FX 5600XT] (rev a1)


                                значит тв-тюнер не обнаружен?
                                  0
                                  00:0f.0 Multimedia controller: Philips Semiconductors SAA7131/SAA7133/SAA7135 Video Broadcast Decoder (rev d0)А это что?
                                    0
                                    да, я так же подумал, но команда

                                    lsmod | grep dvb

                                    не выводит ничего
                                      0
                                      и папка /dev/dvb/ пуста
                                        0
                                        вернее её вообще нет
                                          0
                                          а какая карта и какая версия ядра?
                                            0
                                            карта — Pinnacle (точно модель не помню, постараюсь посмотреть)
                                            версия ядра — 2.6.28-11-generic
                                            0
                                            Если эта папка пуста или ее вообще нет, значит не подгружены нужные модули ядра для вашей dvb-карточки.
                                      0
                                      А какая приблизительно наргузка на канал при трансляции? и сколько каналов можна вещать в 100 мб сети
                                        0
                                        Все зависит от битрейта видео.
                                        Если не кодировать vlc каналы, то примерно 20 пользователей на 100мб.
                                        Вот на таком процессоре
                                        root@10.16.0.12:~# cat /proc/cpuinfo
                                        processor : 0
                                        vendor_id : AuthenticAMD
                                        cpu family : 15
                                        model : 95
                                        model name : AMD Processor model unknown
                                        stepping : 3
                                        cpu MHz : 2399.903
                                        cache size : 1024 KB
                                        fdiv_bug : no
                                        hlt_bug : no
                                        f00f_bug : no
                                        coma_bug : no
                                        fpu : yes
                                        fpu_exception : yes
                                        cpuid level : 1
                                        wp : yes
                                        flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt rdtscp lm 3dnowex t 3dnow up pni cx16 lahf_lm svm extapic cr8_legacy
                                        bogomips : 4799.80
                                        clflush size : 64
                                        power management: ts fid vid ttp tm stc

                                        загрузка около 20%
                                          0
                                          Надо использовать мультикастинг для таких вещей, если хочется пропихнуть много.
                                          0
                                          Вроде бы все должно быть четка, ну вот например у меня такая штуковина:
                                          Девайс Скайстар3 определился:
                                          DDMN:/dev/dvb/adapter0# lspci
                                          01:02.0 Multimedia controller: Philips Semiconductors SAA7146 (rev 01)

                                          Модули:
                                          DDMN:/dev/dvb/adapter0# lsmod | grep dvb
                                          dvb_core 66528 2 budget,budget_core

                                          Конфигурация транспондера:
                                          DDMN:/dev/dvb/adapter0# cat /home/domen/tva2/conf/channel
                                          S 12322000 V 27500 3/4

                                          Попытка просканировать транспондер:
                                          DDMN:/dev/dvb/adapter0# scan -a 0 /home/domen/tva2/conf/channel
                                          scanning /home/domen/tva2/conf/channel
                                          using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
                                          initial transponder 12322000 V 27500 3
                                          >>> tune to: 12322:v:0:27
                                          __tune_to_transponder:1483: ERROR: Setting frontend parameters failed: 22 Invalid argument
                                          >>> tune to: 12322:v:0:27
                                          __tune_to_transponder:1483: ERROR: Setting frontend parameters failed: 22 Invalid argument
                                          ERROR: initial tuning failed
                                          dumping lists (0 services)
                                          Done.

                                            0
                                            Добавил модуль:
                                            DDMN:/dev/dvb/adapter0# modprobe dvb-pll
                                            DDMN:/dev/dvb/adapter0# lsmod | grep dvb
                                            dvb_pll 7944 0
                                            dvb_core 66528 2 budget,budget_core
                                            i2c_core 19828 8 dvb_pll,lnbp21,tda826x,tda10086,budget,budget_core,ttpci_eeprom,i2c_i801
                                              0
                                              dmesg выдает
                                              [351794.888006] DVB: frontend 0 symbol rate 27500 out of range (1000000..45000000)
                                            0
                                            должно быть так например
                                            DDMN:/dev/dvb/adapter0# cat /home/domen/tva2/conf/channel
                                            S 12322000 V 27500000 3/4
                                              0
                                              разобрался
                                                0
                                                Невероятно столкнулся снова стой же проблемой и мои же комменты меня опять выручили.

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

                                            Самое читаемое