Трансляция видео по сети

Материал из virt2real wiki
Перейти к: навигация, поиск

Настройка автоматической трансляции видеопотока

ВАЖНО! На Виртурилке должна быть установлена прошивка с поддержкой трансляции видео. См. wiki

Задача: Обеспечить трансляцию видеопотока с Виртурилки на ПК через Wi-Fi (wlan0), если Wi-Fi рушится (или модуль Wi-Fi не подключен к Виртурилке), то транслировать через usb0 (Ethernet Gadget))

Исходные данные:

ПК с Wi-Fi адаптером с адресом 192.168.1.100

Виртурилка подключена к ПК по USB, стоят драйвера rndis, адрес интерфейса 192.168.2.1

Адрес Виртурилки через Wi-Fi будет 192.168.1.200

Адрес Виртурилки через USB будет 192.168.2.2

Решение:

Файлы конфигурации Виртурилки:

Файл /etc/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root

#eapol_version=2
ap_scan=1
#fast_reauth=1
#update_config=1

network={
    ssid="MYSID"
    scan_ssid=1
    key_mgmt=WPA-PSK
    group=TKIP CCMP
    pairwise=TKIP CCMP
    proto=WPA RSN
    psk="MYPASSWORD"
    priority=50
}

MYSID и MYPASSWORD меняем на свои.


Файл /etc/network/interfaces

# Configure Loopback
auto lo
iface lo inet loopback

# Wired interface
#auto eth0
#iface eth0 inet static
#  address 192.168.1.127
#  netmask 255.255.0.0
#  gateway 192.168.1.1

# Wireless interface
auto wlan0
iface wlan0 inet static
  address 192.168.1.200
  netmask 255.255.255.0
  gateway 192.168.1.1
  dns-nameservers 192.168.1.1

auto usb0
iface usb0 inet static
  address 192.168.2.2
  netmask 255.255.255.0


Файл /etc/virt2real/autostart.sh

    #!/bin/sh

    # mount debugfs
    mount -t debugfs debugfs /sys/kernel/debug

    # start 1-wire modules
    #modprobe wire.ko
    #modprobe w1-gpio.ko
    #modprobe w1_therm.ko

    # path for NodeJS global modules
    export NODE_PATH=/usr/lib/node_modules

    ifconfig usb0 192.168.2.2
    ifconfig usb0 up

    DEVICE='wlan0'
    TEST_IF=`/sbin/ip link show dev $DEVICE 2> /dev/null`
    if [ "$TEST_IF" == "" ] ; then
      route add default gw 192.168.2.1 usb0
      /etc/virt2real/camera-usb.sh &
    else
      # turn on wi-fi don't sleep script
      /etc/virt2real/dontsleep.sh &
    fi

Тут все просто, если интерфейса wlan0 нет, то есть модуль wi-fi физически не подключен, то запускаем трансляцию на адрес указанный в /etc/virt2real/camera-usb.sh

Если интерфейс wlan0 есть, то запускаем скрипт /etc/virt2real/dontsleep.sh, для того чтобы wi-fi не заснул и не отвалился


Файл /etc/virt2real/wlan.sh

#!/bin/sh
modprobe libertas
modprobe libertas_sdio
sleep 5
/usr/sbin/wpa_supplicant -Dwext -iwlan0 -c /etc/wpa_supplicant.conf -B
/usr/sbin/wpa_cli -B -a /etc/virt2real/wlanchanged.sh

ifconfig wlan0 192.168.1.200
ifconfig wlan0 up

Файл /etc/virt2real/wlanchanged.sh

    #!/bin/sh

    echo "WI-FI: " $1 $2

    case "$2" in
    DISCONNECTED)
            /etc/virt2real/setlight.sh red off
            killall gst-launch-0.10
            route del default
            route add default gw 192.168.2.1 usb0
            /etc/virt2real/camera-usb.sh &
    ;;

    CONNECTED)
            #ifup $1
            /etc/virt2real/setlight.sh red on
            killall gst-launch-0.10
            route del default
            route add default gw 192.168.1.1 wlan0
            /etc/virt2real/camera.sh &
    ;;
    esac

Тут тоже все довольно понятно:

Если соединение во wi-fi установилось, то прибиваем gst-launch-0.10, включаем красный светодиод, удаляем старый маршрут по-умолчанию, добавляем новый через wlan0, выполняем /etc/virt2real/camera.sh в котором запускаем трансляцию на адрес 192.168.1.100 по wi-fi сети.

Если соединение во wi-fi упало, то прибиваем gst-launch-0.10, выключаем красный светодиод, удаляем старый маршрут по-умолчанию, добавляем новый через usb0, выполняем /etc/virt2real/camera-usb.sh в котором запускаем трансляцию на адрес 192.168.2.1 через интерфейс usb0.


Файл /etc/virt2real/camera.sh

#!/bin/sh

PC='192.168.1.100'

gst-launch v4l2src always-copy=false chain-ipipe=true ! video/x-raw-yuv,format='(fourcc)'NV12, width=640, height=480, framerate='(fraction)'30/1 ! dmaiaccel ! dmaienc_h264 ddrbuf=true rcalgo=0 bytestream=true encodingpreset=2 ratecontrol=1 intraframeinterval=46 idrinterval=46 targetbitrate=1000000 ! rtph264pay ! udpsink port=3000 host=$PC sync=false enable-last-buffer=false >/dev/null 2>&1

Собственно трансляция на адрес 192.168.1.100


Файл /etc/virt2real/camera-usb.sh

#!/bin/sh

PC='192.168.2.1'

gst-launch v4l2src always-copy=false chain-ipipe=true ! video/x-raw-yuv,format='(fourcc)'NV12, width=640, height=480, framerate='(fraction)'30/1 ! dmaiaccel ! dmaienc_h264 ddrbuf=true rcalgo=0 bytestream=true encodingpreset=2 ratecontrol=1 intraframeinterval=46 idrinterval=46 targetbitrate=1000000 ! rtph264pay ! udpsink port=3000 host=$PC sync=false enable-last-buffer=false >/dev/null 2>&1

Трансляция на адрес 192.168.2.1