пятница, 5 октября 2012 г.

Вещание с нескольких DV камер на медиасервер (RTMP протокол)

Для этого нам потребуется доп.ПО: dvswitch, dvsource, dvsilk и ffmpeg

Как правило всё это есть в репозиториях и сложности в установки нет.

1.) Запускаем dvswitch

#!/bin/bash

dv_host="127.0.0.1"
#ip адрес ПК с запущенным dvswitch
dv_port="54321"
#порт который будит слушать dvswitch

dvswitch -h ${dv_host} -p ${dv_port};

exit 0


2.) Подключаем dv камеры, вот тут много "подводных камней".

DV камеру не рекомендуется подключать "на живую" есть шанс что сгорит

Начнем, если Вы планируете подключить только одну dv-камеру то тут всё просто:

#!/bin/bash

dv_host="127.0.0.1"
#ПК с запущенным dvswitch
dv_port="54321"
#порт dvswitch

dvsource-firewire -h ${dv_host} -p ${dv_port};

exit 0


Если у Вас несколько dv-камер, то по документации достаточно добавить параметр -c hex_GUID_dv-камеры

А вот тут начинаются приколы:
I.) Как узнать эти GUID?

grep "firewire_core: created device" /var/log/dmesg

Только нужно учесть что здесь будит не только GUID dv-камер, но и GUID чипов в вашей карты ieee1394, так что не удивляйтесь.
 Так же можно поставить GTK+ программу gscanbus и посмотреть в ней.

II.) Если у вас каждая dv-камера подключена к отдельной плате ieee1394, то проблем тоже нет, указываем hex_guid и всё нормально, но в моём случаи на плате ieee1394 было 2 выхода и чип один. При этом при попытки подключить камеру стандартным методом подключалась только 1 камера и на указание GUID вообще не реагирует!!!
Пришлось извращаться:

 #!/bin/bash

dv_guid="0x0800460103F54296"
#GUID камеры
dv_host="-h 127.0.0.1"
#ПК с dvswitch
dv_port="-p 54321"
#порт dvswitch
dv_fifo="/tmp/"${dv_guid}
#потоковый файл

audio="-ab 96k -f alsa -ac 2 -i pulse -ar 44100"


mkfifo ${dv_fifo};
#создаём потоковый файл

dvgrab -guid ${dv_guid} - | ffmpeg -i - -f dv ${audio} -target pal-dv - > ${dv_fifo}&
#через dvgrab заводим видео в потоковый файл
dvsource-file ${dv_host} ${dv_port} ${dv_fifo};
#подключаем поток к dvswitch

exit 0


Задержка видео примерно 10сек., зато работает))) 


3.) Если нужно подключить web-камеру

#!/bin/bash


dv_host="-h 127.0.0.1" #ПК с dvswitch
dv_port="-p 54321" #порт dvswitch
dev_web="video0"

web_fifo="/tmp/"${dev_web}

mkfifo ${web_fifo};


ffmpeg -f video4linux2 -s vga -r 25 -i /dev/${dev_web} -f s16le -ar 48000 -ac 2 -i /dev/zero -target pal-dv - > ${web_fifo}&



dvsource-file ${dv_host} ${dv_port} ${web_fifo}


exit 0

По аналогии с предыдущем, думаю всё понятно.


 4.) Вещаем собранный поток из dvswitch

#!/bin/bash

dv_host="127.0.0.1";
dv_port="54321";

rtmp="tcp://ip_медиасервера:порт";
kadr="-r 25";
video="-vcodec libx264 -b 200k -vpre slow -s 720x530";
audio="-ab 96k -f alsa -ac 2 -i pulse -ar 44100";
str_name="-metadata streamName=livestream";
#имя нашего потока

dvsink-command -h ${dv_host} -p ${dv_port} -- ffmpeg -i - -f dv ${audio} ${video} -bufsize 20000k ${kadr} ${str_name} -threads 0 -f flv ${rtmp};

exit 0