2016-11-23 Интерком и телефони на OpenFest 2016
by Vasil KolevИнтерком
Видео екипът има нужда от начин, по който да си комуникира между операторския пулт и камерите, в общи линии еднопосочно (т.е. режисьора да може да каже "камера 1, мръдни малко в ляво"). Предишни години за целта се употребяваха различни неща, най-често някаква част от комплектите безжични микрофони (един предавател и няколко приемника). Тази година микрофоните ни бяха кът, за това сглобих едно просто решение от ffmpeg и raspberry pi-та:
На контролния лаптоп закачахме какъвто-и-да-е-микрофон (в случая – едни jabra headset-и, които бяха под ръка) и с ffmpeg ги бълвахме по multicast по мрежата:
ffmpeg \
-fflags nobuffer \
-f alsa -i hw:0,0 \
-acodec aac -tune zerolatency -ac 1 -b:a 128k \
-f mpegts 'udp://227.0.9.1:9000?pkt_size=128'
Скриптът взима звукът от alsa-та от микрофона (в случая hw:0,0) и ги пуска на 227.0.9.1 с малък размер на пакета, за по-ниска латентност. Ако трябва да се пусне под windows, ‘-f alsa -i hw:0,0’ се сменя с нещо като ‘-f dshow -i audio="Microphone"’ (като "Microphone" трябва да се погледне как точно се казва, понеже windows-а странно кръщава нещата, Любо беше намерил как точно).
На няколкото raspberry pi-та до камерите се пускаше следния скрипт:
while /bin/true; do
ffmpeg \
-fflags nobuffer -probesize 32 -i \
'udp://227.0.9.1:9000?timeout=1000000&fifo_size=100&overrun_nonfatal=0' \
-f alsa hw:0,0
done
Това слуша на multicast-а и play-ва каквото му дойде, като има timeout от 1 секунда без никакви данни, за да гръмне и да се рестартира. Така може да издържи на всякакви мрежови проблеми и в общи линии гарантира възстановяване до 1 секунда, след като се оправи мрежата.
Това като цяло е доста хакаво и сглобено в последния момент. При мрежата, която имахме, за догодина спокойно ffmpeg-а може да бъде заменен с един asterisk с конференция и телефони, които се закачат в нея, така включително ще можем да смъкнем още латентността (на този беше около 300-400ms) и да направим двупосочен интеркома (въпреки че хората не звучаха много въодушевени). Другото, което сравнително лесно трябва да може да се добави е noise reduction, понеже доколкото знам имаше някакъв, или от микрофона и усилването му, или от самите pi-та (като за второто няма да се оправим само софтуерно).
Телефони
Кодът е качен в github, и е съвсем съвсем тривиален:
- С един php модул (phirehose) се дърпат tweet-ове по признак и се пишат във файлове;
- Друг скрипт проверява на какъв език са, с espeak ги обръща в говор и ги дава на asterisk-а чрез call file да ги изговори на някого.
Цялото нещо отне чисто час-два да се напише и тества. Изглежда бая грозно (и може да седна да го оправя), но върши доста прилична работа и може да се използва като основа за всякакви подобни неща.
На самия OpenFest реализацията беше, че имаше наслагани 3 стари черни телефона на различни места, които бяха вързани през grandstream ATA устройства (понеже бяха единствените, които поддържаха импулсно набиране) и когато дойдеше tweet с #openfest2016telefon, asterisk-а звънеше на трите едновременно и който пръв вдигнеше го чуваше.
Архив на всичките неща, дето са казани по телефона може да се намери тук.