LINUX.ORG.RU

Сообщения tERBO

 

Вывод split-screen видео mplayer-ом во framebuffer

Понадобилось тут организовать вывод изображения одновременно с 4-х ip-камер во фрэймбуфер. Происходит это всё на маленькой железке с ARM-процессором 800 Мгц и 256 оперативы. Стоит минимальный дистрибутив Linux без иксов.

Делаю таким образом:

mplayer -fps 5 -hardframedrop -vo fbdev2 -vf scale=384:288 -geometry 768x576-500-500 -nocache -nosound -nolirc -demuxer lavf -lavfdopts probesize=32 "http://cam1.infolink.ru/mjpg/1/video.mjpg?resolution=CIF&fps=3&ololo.mjpg"&
mplayer -fps 5 -hardframedrop -vo fbdev2 -vf scale=384:288 -geometry 768x576+500-500 -nocache -nosound -nolirc -demuxer lavf -lavfdopts probesize=32 "http://84.242.4.43/mjpg/1/video.mjpg?resolution=CIF&fps=3&ololo.mjpg"&
mplayer -fps 5 -hardframedrop -vo fbdev2 -vf scale=384:288 -geometry 768x576-500+500 -nocache -nosound -nolirc -demuxer lavf -lavfdopts probesize=32 "http://178.158.205.86/mjpg/1/video.mjpg?resolution=CIF&fps=3&ololo.mjpg"&
mplayer -fps 5 -hardframedrop -vo fbdev2 -vf scale=384:288 -geometry 768x576+500+500 -nocache -nosound -nolirc -demuxer lavf -lavfdopts probesize=32 "http://217.197.122.134/mjpg/1/video.mjpg?resolution=CIF&fps=3&ololo.mjpg"&

Оно работает, на экране 4 изображения, но задержка между реально происходящим и выводимым на экран изображением порядка 7 секунд. Задержка с самого начала и со временем не увеличивается и не уменьшается.

Смотрел загрузку системы - процессор занят на 60%, оперативной памяти свободно 20Мб.

Пробовал запускать видео с одной камеры, но полноэкранное, полного разрешения - идёт без задержки - загрузка системы примерно такая-же.

Собственно вопрос - как можно избавится от этой 7-секундной задержки или хотябы свести её к минимуму?

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

 ,

tERBO
()

Чем проще всего слушать сходящие TCP соединения?

Задача: слушать входящие tcp соединения на порту, скажем, 4444 и при подключении к нему кого-либо и передачи сообщения «Privet» запускать shell-скриптик "./start.sh ip-адрес-подключившегося".

Хочется всё сделать максимально просто. Пошерстив в интернетах выяснилось что, вроде как, netcat умеет слушать входящие tcp, но вот как его заставить распознавать текст сообщения и передавать ip адрес входящего подключения пока выяснить не удалось...

 

tERBO
()

Два параллельных loop-a или...

Имеется одноплатный компьютер с Линухами на борту (дистриб archlinuxarm). К плате подключено 9 кнопок через GPIO. Хочется из этой железки сделать монитор ip-камер. Собственно накидал до безобразия простой скрипт следующего содержания:

#!/bin/sh
#
fbset -fb /dev/fb0 -xres 768 -yres 576 -vxres 768 -vyres 576


# Open the GPIO port
#
echo "4" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio4/direction

echo "17" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio17/direction

echo "21" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio21/direction

echo "22" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio22/direction

echo "18" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio18/direction

echo "23" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio23/direction

echo "24" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio24/direction

echo "25" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio25/direction

echo "8" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio8/direction

# Read forever

while [ "1" = "1" ]; do

  if [ "1" = `cat /sys/class/gpio/gpio4/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.1/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio17/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.2/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio21/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.3/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio22/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.4/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio18/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.5/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio23/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.6/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio24/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.7/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio25/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.8/mjpg/1/video.mjpg"&
  fi

  if [ "1" = `cat /sys/class/gpio/gpio8/value` ]; then
    killall -v mplayer
    mplayer -loop 0 -really-quiet -framedrop -vo fbdev2 -demuxer lavf -lavfdopts probesize=32 "http://x.x.x.9/mjpg/1/video.mjpg"&
  fi
done

exit 0

Впринципе оно работает - видео оно показывает и по нажатию кнопок видеопотоки переключаются, но... частота опроса кнопок низковата - чтобы кнопка сработала нужно её 1-2 секунды удерживать. Пробовал в loop-e оставить только cat /sys/class/gpio/gpioХ/value - тогда цыферки очень быстро бегут и срабатывают они мгновенно, а тут... Видимо луп получился слишком тяженый и условия if по долгу обрабатываются.

В общем в голову приходит только вариант с двумя параллельно работающими loop-ами - один занимается опросом GPIO портов и записью состояния кнопок в какую-нибудь переменную, а второй читает эту переменную и запускает в нужный момент соответствующий mplayer. Но как это можно реализовать в bash-е (и можно ли вобще) я не знаю.

Посоветуйте как эту проблему лучше решить.

 

tERBO
()

RSS подписка на новые темы