LINUX.ORG.RU

Скрипт ожидания готовности video1


0

1

Всем привет! У меня в системе есть 2 устройства video0 и video1. При загрузке системы (Squeeze) необходимо через VLC делать захват и кидать в сеть. Я написал скрипт который запускает VLC для video0 и для video1, и кидает в сеть. Скрипт сделал исполняемым и прописал в автозагрузку. Проблема в следующем: иногда бывает что скрипт срабатывает раньше чем появляется video1, то есть VLC преграсно выполняет захват с video0 но не каждый раз открывает video1. Если в скрипт вставить sleep 1, то всё работает на ура. Но это же откровенно говоря костыль. Помогите написать скрипт, который бы дожидался появления video1 и после этого запускал vlc c нужными параметрами. Пробовал разабраться со skeleton'ом, чтобы заставить скрипт запускаться последним. Но тоже не заработало.

Скрипт запуска vlc примерно такой, я тожно вспомнить не могу:

#!bin/bash
vlc /dev/video0 (тут параметры)&
vlc /dev/video1 


#!bin/bash
while [[ ! -f /dev/video1 ]]; do sleep 1; done
vlc /dev/video0 (тут параметры)&
vlc /dev/video1
ubiquitine
()

Напиши скрипт для udev. Тогда у тебя vlc будет гарантированно запускаться сразу после появления нужного устройства. И лучше использовать не /dev/video*, а /dev/v4l/*.

Deleted
()
Ответ на: комментарий от Deleted

Спасибо, прочитал. Даже перевод на всякий случай. Вот только я не понял,в директории lib/udev/rules.d лежит 60-persistent-v4l.rules

# do not edit this file, it will be overwritten on update

ACTION=="remove", GOTO="persistent_v4l_end"
SUBSYSTEM!="video4linux", GOTO="persistent_v4l_end"
ENV{MAJOR}=="", GOTO="persistent_v4l_end"

IMPORT{program}="v4l_id $tempnode"

SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
KERNEL=="video*", ENV{ID_SERIAL}=="?*", SYMLINK+="v4l/by-id/$env{ID_BUS}-$env{ID_SERIAL}-video-index$attr{index}"

# check for valid "index" number
TEST!="index", GOTO="persistent_v4l_end"
ATTR{index}!="?*", GOTO="persistent_v4l_end"

IMPORT{builtin}="path_id"
ENV{ID_PATH}=="?*", KERNEL=="video*|vbi*", SYMLINK+="v4l/by-path/$env{ID_PATH}-video-index$attr{index}"
ENV{ID_PATH}=="?*", KERNEL=="audio*", SYMLINK+="v4l/by-path/$env{ID_PATH}-audio-index$attr{index}"

LABEL="persistent_v4l_end"

Его надо скопировать в etc/udev/rules.d и там править?

Less
() автор топика
Ответ на: комментарий от Deleted

В директории /etc/udev/rules.d создал 99-local.rules Вот его содержимое

SUBSYSTEM=="video4linux", KERNEL=="video0", RUN+="/usr/bin/vlc"

udevadm info -a -p /sys/class/video4linux/video0

  looking at device '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0/video4linux/video0':
    KERNEL=="video0"
    SUBSYSTEM=="video4linux"
    DRIVER==""
    ATTR{name}=="saa7130[0] video (AverMedia Ave"
    ATTR{index}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0':
    KERNELS=="0000:03:01.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="saa7134"
    ATTRS{vendor}=="0x1131"
    ATTRS{device}=="0x7130"
    ATTRS{subsystem_vendor}=="0x1461"
    ATTRS{subsystem_device}=="0x2115"
    ATTRS{class}=="0x048000"
    ATTRS{irq}=="17"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

  looking at parent device '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0':
    KERNELS=="0000:02:00.0"
    SUBSYSTEMS=="pci"
    DRIVERS==""
    ATTRS{vendor}=="0x1283"
    ATTRS{device}=="0x8892"
    ATTRS{subsystem_vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x2003"
    ATTRS{class}=="0x060400"
    ATTRS{irq}=="16"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1c.0':
    KERNELS=="0000:00:1c.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x1c10"
    ATTRS{subsystem_vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x2003"
    ATTRS{class}=="0x060400"
    ATTRS{irq}=="41"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{enable}=="2"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Затем

restart udev
udevadm control --reload-rules

Чтобы протестировать

udevadm test /sys/class/video4linux/video0

parse_file: reading '/lib/udev/rules.d/97-bluetooth-hid2hci.rules' as rules file
parse_file: reading '/etc/udev/rules.d/99-local.rules' as rules file
udev_rules_new: rules use 260208 bytes tokens (21684 * 12 bytes), 38188 bytes buffer
udev_rules_new: temporary index used 67840 bytes (3392 * 20 bytes)
udev_device_new_from_syspath: device 0x2154b740 has devpath '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0/video4linux/video0'
udev_device_new_from_syspath: device 0x2154d108 has devpath '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0/video4linux/video0'
udev_device_read_db: device 0x2154d108 filled with db file data
udev_device_new_from_syspath: device 0x2154d588 has devpath '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0'
udev_device_new_from_syspath: device 0x2154de60 has devpath '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0'
udev_device_new_from_syspath: device 0x2154e1d0 has devpath '/devices/pci0000:00/0000:00:1c.0'
udev_device_new_from_syspath: device 0x2154e4f8 has devpath '/devices/pci0000:00'
udev_rules_apply_to_event: GROUP 44 /lib/udev/rules.d/50-udev-default.rules:29
udev_rules_apply_to_event: IMPORT 'v4l_id /dev/video0' /lib/udev/rules.d/60-persistent-v4l.rules:7
udev_event_spawn: starting 'v4l_id /dev/video0'
spawn_read: 'v4l_id /dev/video0'(out) 'ID_V4L_VERSION=2'
spawn_read: 'v4l_id /dev/video0'(out) 'ID_V4L_PRODUCT=AverMedia AverTV Studio 305'
spawn_read: 'v4l_id /dev/video0'(out) 'ID_V4L_CAPABILITIES=:capture:video_overlay:tuner:'
spawn_wait: 'v4l_id /dev/video0' [2281] exit with return code 0
udev_rules_apply_to_event: IMPORT builtin 'path_id' /lib/udev/rules.d/60-persistent-v4l.rules:16
udev_builtin_add_property: ID_PATH=pci-0000:03:01.0
udev_builtin_add_property: ID_PATH_TAG=pci-0000_03_01_0
udev_rules_apply_to_event: LINK 'v4l/by-path/pci-0000:03:01.0-video-index0' /lib/udev/rules.d/60-persistent-v4l.rules:17
udev_rules_apply_to_event: RUN 'udev-acl --action=$env{ACTION} --device=$env{DEVNAME}' /lib/udev/rules.d/70-udev-acl.rules:74
udev_rules_apply_to_event: RUN '/usr/bin/vlc' /etc/udev/rules.d/99-local.rules:1
udev_event_execute_rules: no node name set, will use kernel supplied name 'video0'
udev_node_add: creating device node '/dev/video0', devnum=81:0, mode=0660, uid=0, gid=44
udev_node_mknod: preserve file '/dev/video0', because it has correct dev_t
udev_node_mknod: preserve permissions /dev/video0, 020660, uid=0, gid=44
node_symlink: preserve already existing symlink '/dev/char/81:0' to '../video0'
link_find_prioritized: found 'c81:0' claiming '/run/udev/links/v4l\x2fby-path\x2fpci-0000:03:01.0-video-index0'
link_update: creating link '/dev/v4l/by-path/pci-0000:03:01.0-video-index0' to '/dev/video0'
node_symlink: preserve already existing symlink '/dev/v4l/by-path/pci-0000:03:01.0-video-index0' to '../../video0'
udev_device_update_db: created db file '/run/udev/data/c81:0' for '/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0/video4linux/video0'
ACTION=add
COLORD_DEVICE=1
COLORD_KIND=camera
DEVLINKS=/dev/v4l/by-path/pci-0000:03:01.0-video-index0
DEVNAME=/dev/video0
DEVPATH=/devices/pci0000:00/0000:00:1c.0/0000:02:00.0/0000:03:01.0/video4linux/video0
ID_PATH=pci-0000:03:01.0
ID_PATH_TAG=pci-0000_03_01_0
ID_V4L_CAPABILITIES=:capture:video_overlay:tuner:
ID_V4L_PRODUCT=AverMedia AverTV Studio 305
ID_V4L_VERSION=2
MAJOR=81
MINOR=0
SUBSYSTEM=video4linux
TAGS=:udev-acl:
UDEV_LOG=6
USEC_INITIALIZED=12008268
run: 'udev-acl --action=add --device=/dev/video0'
run: '/usr/bin/vlc'

При этом, я полагал, что после появления Video0 запустится VLC, но увы. Что не так, подскажите.

Less
() автор топика
1 апреля 2013 г.
Ответ на: комментарий от Less

Скорее всего vlc не запускается потому, что делается это под рутом. Можно попробовать запустить что-нибудь другое или использовать команду «su имя_пользователя -c vlc», имя любого другого пользователя в системе.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.