вторник, 13 февраля 2024 г.

convert colors to midi note for midi controllers

I recently (2 years ago) designed and built a simple MIDI controller for my intercom system using an Arduino Leonardo, USB hub, sound card, microphone, and loudspeaker. It's quite basic, but it does the job! The controller also has buttons with backlighting using addressable LEDs (WS2812).


I wanted to display rainbow colors on the buttons, but couldn't find a way to implement it using MIDI note states. After some brainstorming, I came up with an idea.

Encoding Colors in MIDI:

Each button on the controller corresponds to a MIDI note with its own channel, volume (0-127), and on/off state. This information is sent over the MIDI transport. Most MIDI controllers with LED backlighting receive data (volume or state) on the same note as the button itself. While most controllers only handle binary states (on/off), I wanted to send more data to control the LED brightness and color (represented by hue, saturation, and value).

Limited to 127 states, I created an encoding/decoding table mapping colors to numbers. It's quite simple!

I based it on hue circle.





It looks like this image 





I set brightness (value+saturation) of color from 0(off) to 7 ("white"). Devided 127/7 = 18.4
Started from grayscale. 0 black, - 1-5 grayscale, 6 is white 
I decided to use 16 colors, and 8 notes reserved for other data (127 - 7(BW) - 7*16(COLORS)). 
So i have 16 color slot angles with 7 states. I choosed the hue circle to encode colors but changed it a little. I gevided hue color circle by 16 parts where value 1 is almost black color, 4 is pure color with max saturation, 7 almost white color.
So each value 7-13,14-20 etc. Descrobes the angle of color and its brightness. 0-6 is grayscale when 0 led os black(off) and 6 is white. 
On the other hand i neded to decode this values to hue angle and color brightness. And again it's simple. I just divide midi note volume by 7 and get color segment of hue if its int >0 or BW if int <0, and remainder of division responds to color brightness. Viola!

another words, shorter:
one more important thing:


in this metod you can't use (minimize) saturation while value is not 100%
at first you should start from adding value to 100% and only after add saturation.
available values for S & V is only 4 


Example:
to encode color HSV:
H: 207 degree
S: 80
V: 100
split hue circle to 16 parts (360/16=22.5*)
each angle consist of 7 values. 1-3 (for V 21%-100%. S=0%), 4 (for V =100%, S =100%), 5-7(V=100%, S=100%-21%)


lets do it!!

first start from Vm= int(V(100-1) /20)=4 it means that V is maximum
IF Vm = 0 THEN COLOR IS BLACK! and we change all results to midi note volume = 0

next Sm. invert values for our code.. 4 - int(S(80-1)/20)=1
IF Sm = 4 THEN COLOR IS WHITE! we change all results to midi note volume = 6

find Hm part = 207/22.5 = 9.2 / It means that it'll be 9th part of a circle
and color params v&s will start from:  9*7=63 
Hm=63

*BW slot contains 7 values start from 0 to 6.

So. color range will be 63-69 midi note volume.

let's define S&V in range. I'm so bored of it...



so our value will be midi note volume=Hm-1+Vm+Sm=63-1+4+1=68
DONE.
finally:
midi note volume = (int(H/22.5)*7)-1+(int(V-1)/20) + 4 - int((S-1)/20))

Remember that grayscale is in 0-6 range!

Next i use code conversion hsv ro rgb to light leds.


And let's decode color back to hsv.

We have midi note volume =  68

for all volume greather than 6 means it's not in grayscale.

H=int(68/7)*22.5=9*22.5=202 degree
V+S=68-(int(68/7)*7)-1=5
S = 100-(int((v+s)/4) * (v+s-4))*20 = 80
V= ((v+s-((int(v+s)/4)*(v+s-4))+1)*20=100

i am not accurate in math. but think you got an idea.


i made this controller and color transform works fine.
it works wit Voicemeeter+Macro buttons+midiOX.

Just like that.


Sorry, i don't have enough time to describe it more clear at the moment. I\ll try do it later. I hope.

I based my controller on this example
https://medium.com/@monkeytypewritr/building-your-own-midi-fighter-406948137f8f



суббота, 13 августа 2022 г.

ip multicast changeover. Second edition TsDuck

This script work in semi automatic mode. 
It will switch to second source if first dissapears. Also you can control this switch sending an udp message to port 4444 as you can read in documentation of tsduck. (echo -n "0" >/dev/udp/127.0.0.1/4444) or (echo -n "1" >/dev/udp/127.0.0.1/4444)

event-command - run some program and pass args to the. 
-------------------------------------
#/bin/sh

dir="$(basename $0 .sh)"

cdir=$PWD

ip=$(ip a | grep 10.7.130 | awk -F '\.|\/' '{print $4}') # this string define multicast network address 

mkdir pids

#Loop cycle
while true; do
sleep 0.5
echo $dir
exec tsswitch --infinite \
--debug=1 -v \
--receive-timeout 100 \
--fast-switch \
--remote 4444 \
--first-input 0 \
--max-input-packets 7 \
--max-output-packets 7 \
--buffer-packets 1316 \
--event-command "$cdir/./sendsnmp.sh" \
-I ip 239.0.11.$ip:51059 \
-I ip 239.0.0.22:51059 \
-O ip  239.4.4.$ip:1234 --local-address 10.7.130.$ip --ttl 1 & echo $! > "$cdir"/pids/"$dir"_pid;

m1=$!
while [ $m1 -gt 0 ]; do
sleep 1;
ps -p $! >/dev/null || m1=[0] ;
done
sed -i /^$!/d "$cdir"/pids/"$dir"_pid
sleep 1
done

software video waveform vectoroscope monitor for free. ffmpeg / fflplay

This time i want to introduce you some great ffmpeg features which help to understand color levels of any video source. 
This meters based on ffmpeg video filters. In my example i use several meters on single screen according to my tasks, but you can change video filters params as you wish to make a custom video meter.


You can run meters with ffplay to show meters on your desktop screen or use ffmpeg to pass meters to ip stream / file / sdi board output.

At first install ffmpeg in your system, and then paste below code into your command line (win/linux), change "stream/video" to your video file, press enter and watch the result. 


ffplay  -i stream/video -vf  "split=5[in][w1][w2][v1][a];[in] scale=1024:576 [scin];  [a] eq=brightness=-1 :saturation=0, scale=1558x876, eq=brightness=0 [bg]; [w1] format=gbrp,waveform=filter=lowpass:components=7:display=overlay:graticule=green:flags=numbers:scale=ire:intensity=0.1 , scale=1024:150[ww1]; [w2]format=gbrp,waveform=filter=acolor:graticule=green:flags=numbers:scale=ire:components=7:display=overlay:intensity=0.4:bgopacity=0.5, scale=1024:150 [ww2]; [v1] format=yuva444p9, vectorscope=b=0.7:m=color3:g=green[vv1];  [bg][scin] overlay=0:150[bgv];[bgv][ww1] overlay=0:0[bvw1];[bvw1][ww2] overlay=0:726[bvw2]; [bvw2][vv1] overlay=x=W-w:y=H-h"






Next example is pretty complex. It uses SDI decklink input/output board to pass input video from SDI live source and pass meters to SDI monitor for live control and fast correction. It helps to adjust camera iris, check black and white balance, sheck saturation.


It's writed in CMD file by one simple reason, it's much easy to edit multi string code than single string.

The code below is writed for windows but you can use it in linux system by changing symbols "^" to "\". And of course it will take time to adjust your SDI board and resolution correctly.
Don't forget, to run ffmpeg with decklink board, your ffmpeg version should be compiled with --enable-decklink option.

The code of ffscope.cmd is below:

C:\ffmpeg-decklink-4.0\ffmpeg.exe -threads 1 -filter_threads 1 -an -sn ^
-f dshow -video_size 1280x720 -pixel_format  uyvy422 -rtbufsize 1M -framerate 50 -r 50  -i video="Decklink Video Capture (3)":audio="Decklink Audio Capture (3)" ^
 -vf split=6[parade][luma][vector][video][dum][bg];^

[bg]eq=brightness=-1:saturation=0,scale=1280x720,eq=brightness=0[bg];^
[video]scale=640:360,format=yuv420p[video];^
[dum]format=yuv420p,histogram=display_mode=0:level_height=360,scale=280:360[dum];^

[vector]format=yuv420p,^
vectorscope=mode=color4:colorspace=709:graticule=green:flags=white+name,^
drawbox=w=4:h=4:t=1:x=104-2:y=98-2:c=invert,^
drawbox=w=4:h=4:t=1:x=110-2:y=106-2:c=invert,^
drawbox=w=4:h=4:t=1:x=116-2:y=113-2:c=invert,^
drawbox=w=4:h=4:t=1:x=122-2:y=120-2:c=invert,scale=360:360^
[vector];^

[luma]scale=640:360,format=yuv420p,^
waveform=filter=lowpass:scale=ire:graticule=orange:flags=dots+numbers,scale=640:360^
[luma];^

[parade]scale=640:360,format=gbrp,^
waveform=filter=lowpass:components=7:display=overlay,scale=640:360^
[parade];^

[parade][luma]hstack=2[row1];^
[video][dum][vector]hstack=3[row2];^
[row1][row2]vstack=2[scopes],[bg][scopes]overlay=0:0 -an -f decklink  -pix_fmt uyvy422 "DeckLink Duo (3)" 

 There will be a lot of error mesages during running this code, it means that ffmpeg hasn't enough buffers for reading input to process all data, but its enough to output meters. If set buffer value then will be high delay in output video.
 Also -threads 1 -filter_threads 1 parameters will make CPU consumption lowest when processing. 

This is another version of example. It runs ffplay and check virtual obs camera colors.
https://raw.githubusercontent.com/Fubaxiusz/Batch-tools/master/FFMPEG%20scripts/Color%20Grading%20Scopes%20(OBS).cmd


суббота, 21 августа 2021 г.

panasonic aw-rp150 / aw-rp120 and atem video switcher interface. Arduino Panasonic RP and ATEM

 Hi, dear guests!

I made such interface for my tv studio. All is very simple! 



So it is Arduino based device (UNO R3) with Ethernet shield which works with Blackmagic ATEM switchers and Panasonic AW-RP120 / AW-RP150 Remote panels. 



It does a couple things. It gets tally cameras state from ATEM switcher and send it to AW-RP pannel to turn light on the active camera. And it reads state of selected camera (1-10 for rp120/150) on remote panel and send it to ATEM switcher. Atem sets selected camera 1-8 + PV and PGM (9 and 10 button) to AUX 2 in my case, to image analysis system.   

If you want to made your own interface you will need next stuff:

  • Arduino UNO R3 (with male pins kit) x 1 
  • Ethernet shield x 1
  • Resistors upto 0.25W : 22k x 4 pcs. and 2.2k x 6 pcs. (to get 6 tally sources (1-6 camera))
  • DB-25F x1 connector with  couple screws (for the box)
  • DB-25M with case x2
  • A broken HDMI cable (to make an interface cable and get some wires for the box) or some wires.
  • Plastic  DIY Box x1 



I used the Skaarhoj script and adapted it to my purpose. Download it here. You may need an additional libraries.

Schematic for soldering is here.

I want to warn you. You should be shure  that all pins between arduino and shield are connected. use an Ohmmeter or multimeter to check it. 

Before upload script to the Arduino you should change the network settings in setup of script:

  • Ip address of Adruino and its MAC
  •  net mask, 
  • gateway, 
  • ATEM switcher ip address.

At the bottom of script you will find part of code which decode info from RP console and send it to ATEM. you can adjust it by your own way.

Please check that your RP console is resdy to receive tally GPI signals.

That is all.

Of course my script isn't perfect but it works. You can check debug info in arduino com port monitoring.

After first start several leds on the RP pannel will be red, and when you set some source on ATEM to the program output, only one red led shoud light on RP console. It means that tally script is working.

It works perfectly 24/7




среда, 23 июня 2021 г.

Wifi TALLY shoe mount lamp DIY for ATEM






Lamp is based on wi-fi D1 mini module and videolight ulanzi vl49

It was easier than i thaught! It is cheapest and completed solution.

Only three things you will need to make the tally light!
and multimeter, some wires and some soldering stuff.

The whole main code written BY Aron het Lam,  you can get from his Github: https://github.com/AronHetLam/ATEM_tally_light_with_ESP8266/wiki/DIY-guide 
There are all instruction how to flash D1 module. But in this videolight you have to change out pins in his code next way:

First upload the code to D1.
Next the soldering.
You  should remove the magnet from videolight, unsolder power ground wire from pcb in videolight to make all circuits safe for soldering. 

Solder resistors to D1 as showed on picture. 

Put D1 mini to main videolight pcb, make their sides and corner to fit to each other.

Precisely solder resistors and power wires to exact points on videolight pcb. 
Solder back the ground power wire.

At this point the light is ready yo run. All that you neen is to turn the videolight brightness to the zero, and it became fully functional tally light. 
Set it up as described Aron and mount it on a camera shoe holder. 
Voila!!

среда, 21 апреля 2021 г.

Интеграция Agile в сменный график ниженеров.

Изначально, идеи как внедрить Agile в отдел видеоинженеров не было. Всё что было, это горы не сделанной работы и группа инженеров работающих с графиком 1/3 и одним инженером в смену 2/2, всего 5 инженеров. 

Основная проблема - рутинные и внеочередные работы возникающие в процессе работы (в рабочую смену) выполняются только в пределах одной рабочей смены. Т.е. задачи с длительным сроком решения (более одного двух дней) не выполняются вообще. 

Первый способ удержать запросы / задачи в отделе, не упустить что то из виду - вести отчёт пересменки. Получилась длиннющая портянка из множества записей, не позволяющих держать их все в актуальном состоянии, всегда помнить о проблеме двухмесячной давности, например. Началось хоть какое-то журналирование событий и проблем, и в случае крайней необходимости, можно было найти через поиск в таблице. 

Наличие системы Jira в компании никак не решает образующихся задач для отдела видеоинженеров. Основной объём задач возникает спонтанно, так же быстро и устраняются, но не всегда в одну смену. Инженеры не могут ставить сами себе задачи, вести их и закрывать в Jira. Это не функционально в текущих условиях. 

Задачи отдела можно поделить на быстрые и долгие. Быстрые - выполнимые в пределах одной смены, долгие - не выполнимые за одну смену. Долгие задачи не выполняются из-за разных функциональных характеристик инженеров и их разной (спонтанной) загруженности. Такие задачи обычно провальны, передаются из смены в смену с потерей данных о задаче и проделанной работе, этапе, с которого нужно продолжить работу. Проблема была не в сроках выполнения длительных задач, а в выполнении задач в принципе.

Я очень долго не мог решить вопрос, как делегировать одну большую задачу группе инженеров, которые даже не пересекаются друг с другом из-за сменного графика. При попытке делегировать такие задачи невольно вспоминается сценка А. Райкина про пиджак: -"К пуговицам претензий нет". По факту - глухой телефон.

Решение пришло совсем не сразу, а спустя пару месяцев после прохождения курса Agile. Определяющим фактором послужили личные навыки самих инженеров и тип смены (сутки или день). Например, поручив задачу разобраться с программным обеспечением инженеру с большим навыком в софте - больше шансов на успех. Так и инженеру выполняющему роль архивариуса лучше поручить задачи связанные с документами и написанием инструкций по работе.  Таким, образом в одной группе стало возможно выполнение задач делимых на категории: 

  • механика / мелкий ремонт, 
  • склад / обслуживание оборудования, 
  • документы, 
  • программный комплекс, 
  • проектная деятельность - коммуникации.

Основная идея - повышение качества работы и её фактическое выполнение. Здесь на лицо все признаки команды до 8 человек. В общем, все делают одну и ту же работу, и кто-то делает персональные задачи лучше. Что-то отдалённо напоминающее Canban и ещё отдалённее Scrum. Узкопрофильные задачи, требующие времени выполнения больше чем одну или 2 смены, было решено поручать только одному инженеру - специалисту 1 раз в 4 дня. Но с максимальным качеством работы. 

В Trello мы собрали доску планирования работ под наши нужды, наполнили и структурировали в ней все данные что у нас были под рукой. Все инженеры смогли увидеть объём реальных работ, и задачи которыми занимаются коллеги. Получилось подобие Scrum, столбцы с названиями:

Буфер задач | в процессе | регулярные задачи | Подсказки/архив | Готово | Долгий ящик



В буфере задач все инженеры создают быстрые задачи не назначая участников, и если выполняют их переносят в процесс и назначают себя участниками. Любой инженер может взять задачу из буфера и начать ей заниматься переместив в столбец "процесс".

В процессе соответственно задачи над которыми сейчас ведётся работа. Столбец ограничен по количеству задач, со строго присвоенными инженерами/исполнителями. Одну задачу могут выполнять сразу несколько человек, обязательно указывая проведённые работы по задаче, заполняя чек листы и оставляя комментарии внутри карточки с задачей.

Регулярные задачи - задачи выполняемые циклично, такие как проведение закупок в определённый срок, ведение отчётов, проверка/отстройка оборудования и т.п.

Подсказки/архив содержит карточки с ссылками на нормативные документы, карточки с эскизами и зарисовками схем.

Готово - тут все готовые задачи выполнение которых привело к окончательному решению проблемы.

В долгий ящик складываются только те задачи, работа над которыми была выполнена, но решение задач не актуально, может потребоваться через длительный период времени, чтобы не переделывать и не вспоминать всё заново.

Рабочая доска находится в процессе формирования, и ещё не решено окончательно какие столбики мы добавим / уберём, или отправим на новую доску.

В итоге, после введения в работу доски Trello, эффективность отдела инженеров выросла ориентировочно на 75%. Застоявшаяся работа начала делаться, пусть и не каждый день подряд, но выполняется до конца, т.к. делается в основном одним ответственным человеком, и по необходимости для ускорения решения, присоединившимися в помощь коллегами.

Таким образом, если одна задача обновления спец ПО сервера выполняется 4мя инженерами подряд, то качество работы над задачей будет максимальным только у одного специалиста. Предположим, что процент выполнения в графике 1/3 будет таким: 25%, 10%, 10%, 5%, 25%, 10% 10% 5%. Имеется ввиду, что один инженер обладает лучшим навыком решения задачи чем остальные. Итого, задача будет выполнена за 8 дней с относительно приемлемым качеством в лучшем случае. (как показывает практика, на деле задача гибнет на 3-й день. (25%, 10%, 0% 0%, 15%, 0%...))

Если поручить такую задачу только одному человеку, то срок выполнения естественно увеличится до 16 дней (4 смены), т.е в 2 раза, задача будет выполнена максимально качественно. Однако, в этом случае остальные инженеры могут параллельно вести работу над другими задачами, в этом случае при равновесных задачах, процент выполнения задач будет 25% в каждую смену. т.е. 25%, 25%, 25%,25%. В таком случае за 16 дней будет выполнено 4 узких задачи, т.к. каждый инженер максимально качественно выполняет свою  персональную задачу. а это говорит об эффективности в 50% в сравнении с 2мя задачами за 16 дней в случае последовательного делегирования.

Ведение такой таблицы дало положительный толчок к работе всех сотрудников, т.к. появилась коллективная ответственность, обзор дел которыми занимаются коллеги, не быть хуже чем другие работники, стараться создавать и решать задачи самостоятельно чтобы получить бонус сотрудника года. Заполнять комментарий к задаче, т.к. следующий коллега может продолжить с места остановки и не потерять эстафетную палочку. А главное, инженерный состав очень позитивно оценил введение визуально-карточной системы задач, т.к. всё как на ладони, не имеет нагромождений и удобно при повседневной работе. Карточки с задачами создаются мгновенно, не требуя много рабочего времени. 

Работу с доской и делегироваинем задач ещё предстоит наладить, как и до конца вникнуть в её юзабилити остальным инженерам.

Это что? Agile?

четверг, 28 ноября 2019 г.

Software Failover Switch for UDP MPEG TS - multicat - простой переключатель IP TS потоков

Бесплатно и не сильно сложно.

(Этот метод устарел. лучшее решение - TSduck)
Переключатель UDP mpegTS собран на Multicat, о котором я писал в предыдущем посте.
Решение не очень элегантное на мой взгляд, но достаточно хорошо справляется с задачей.
Автоматическое переключение происходит при обрыве одного из потоков, а также вручную. Отслеживание состояния и переключение между потоками выполняется на удалённом сервере с Zabbix.
Source scripts are at bottom of page...

Работает следующим образом:
2 потока: основной и резервный, с идентичными PID-ами и настройками кодирования (различающимися только мультикаст адресами) записываются в RAM диск в разные папки, 1 и 2.
Записывается по 1 чанку - 5 секунд для каждого канала используя при этом ~10 Мб опреативки для двух стримов по 5 Мбит.
Запускается скрипт воспроизведения, содержащий бесконечное циклическое переключение задачи воспроизведения из папки 1 и 2. При этом есть задержка воспроизведения, минимальная для multicat - 250 мсек.
Например, при обрыве одного из входящих мультикастов временно прекращается запись  файла, например 1-го. Если воспроизводился TS именно  из 1-й папки, то через 250 мсек воспроизведение прервётся из-за окончания файла, и процесс воспроизведения завершится. По скрипту сразу запустится вспроизведение 2-го TS. И теперь, если первый фид снова прервётся, воспроизведение продолжится со 2-го TS файла.
Если прерывается 2-й фид, воспроизведение автоматически перебрасывается на 1-й TS и так до бесконечности.
В момент переключения создаётся промежуточный файл с информацией о том, какой ts сейчас вещает и отправляется SNMP trap. При ручном переключении текущий воспроизводящий multicat закрывается и запускается другой TS. Ну и само собой отправляется SNMP trap оповещение в тот же Zabbix о переключении, чтобы быть в курсе дела, а так-же добавить скрипт переключения из среды Zabbix для внешнего управления ченджовером.

На картинке: момент переключения между потоками.

При этом мониторинг не уловил момента - отсутствия потока, но показал MLR и СС. Переключение происходит очень быстро. Загрузка i3-3220 - 2-5 %. Теоретически, можно создать столько ченджоверов, сколько позволит сетевой интерфейс...

Это не прямой проброс мультикаста на прямую на выход, но у этого способа есть не раскрытый потенциал ввиде бесшовного перехода между источниками, в случае если натравить некоторый сервис обнаруживающий в потоке ключевой кадр, и при поступлении запроса переключаться именно на ключевой кадр. В этом случае при переходе на другой источник рассыпания картинки очень маловероятны.

Набор скриптов для создания Fail Over.
Читайте Readme, внесите нужные изменения в config.ini и запускайте.
https://cloud.mail.ru/public/2nzv/3aEXQ2Zv7

Исходники и доп. информация multicat на Github:
https://code.videolan.org/videolan/multicat

multicast udp mpegts - timeshift / дилэй для мультикаста TV

Timeshift for mpegts multicast


Для чего может понадобиться таймшифт / дилэй мультикаста на телевидении:

(Этот метод устарел. лучшее решение - TSduck)
  • Создание региональных версий для телеканала  (запись мультикаста с отложенным воспроизведением).
  • Создание резервного мультикаст потока на случай аварии плейаут сервера.
  • DVR - создание копии мультикаста и его анализ.
Source scripts at the bottom of page...

Сложно было найти решение, особенно бесплатное. Было много тестов  на ffmpeg, но они не увенчались успехом. Всему виной изменение характеристик потока на выходе.
Иными словами нужно было просто записать мультикаст UDP поток и воспроизвести его через время, но в другую сетевую карту или под другим  мультикаст адресом, не меняя в потоке ничего, то есть, воспроизвести ASIS. FFmpeg так не может.
На самом деле всё оказалось очень просто. Много времени ушло на поиски того что нужно.
Это Multicat! От VideoLAN... Очень стабильный софт! Пишет, рестримит мультикасты от SD вплоть до UHD, почти не потребляя вычислительной мощности. Только под Linux.

На картинке выход стрима после multicat. FHD


Для одного из наших проектов потребовалось организовать резерв канала на случай аварии вещательного сервера. Необходимо было иметь хоть что-то на подмену, например, заглушку на время восстановительных работ. Было решено сделать циклическую запись последних суток вещания канала и создание вчерашней версии телеканала.
Настроили софт на запись канала на 24 часа. Создаются чанки по 60 минут. Все чанки, что старше 24 часов, удаляются скриптом. На самом деле необходимо наличие чанков на время задержки + 1 минута - чтобы не удалялся чанк который предназначен для воспроизведения.
Далее воспроизводим записанные чанки с задержкой 24 часа в новый мультикаст поток в ту же сетевую карту.
Тут же возникает вопрос о подмене основного потока с плейаута на записанный. Это делается разными способами, и на спец железках / коммутаторах или на различном софте. Multicat тоже может сделать такое. Уровень, конечно, элементарный, но на случай аварии спасает оперативно. Об этом в следующем посте.

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

Этот способ хорошо подходит для экстренной подмены одного из "упавших" серверов вещания. Другими словами по задумке существует один единственный сервер для горячей подмены мультикаста любого плейаут сервера.

Скажем так, у нас много плейаутов, у которых нет резерва по договору в связи с ограничением бюджета клиента. Для всех таких подобных плейаутов даже на время профилакики требуется оперативная подмена этого же материала за последний час, чтобы не составлять чёрное поле в эфире на время профилактических работ с севером.
Создаём сервер с multicat, который постоянно пишет последний час наших безрезервных плейаутов. Каждый TS складывается в свою папку с присвоенным названием канала. Таким образом, у нас на сервере замещения мультикастов собираются записи всех плейаутов за последний час.
Далее, в момент аварии (тогда, когда мультикаст не идёт с сервера N) нужно запустить скрипт изменения сетевого адреса на подменном сервере идентичный серверу N для того, чтобы рассылка мультиката шла именно с такого же адреса что у упавшего сервера. После изменения адреса сетевой карты можно запустить воспроизведение записи канала N за последний час и приступить к восстановительным работам на сервере N.
Есть некоторый нюанс. При изменении сетевого адреса карты на подменном сервере скрипты, отвечающие за запись каналов, необходимо перезапустить.
Автоматизируется это с помощью Zabbix.
Клиент Zabbix установленный на плейаут N отправляет информацию о том, что с сервера N не выходит мултикаст. Например, при выходе из строя блока питания, Zabbix клиент перестаёт отправлять данные о мультикасте на сетевом интерфейсе плейаута N на сервер Zabbix. Zabbix сервер принимает логическое решение на основании собранных данных, что мультикаст в сети пропал и отправляет команду запустить скрипт воспроизведения канала N на подменном сервере. Этот процесс надо хорошо отлаживать. Лучше пристроить систему мониторинга мультикастов, которая будет оповещать о наличии и состоянии мультикаст потока для повышения надёжности.

Набор скриптов для запуска timeshift
https://cloud.mail.ru/public/4uxm/54tSR2hMN

понедельник, 23 сентября 2019 г.

Stratum NTP server ESP8266 + GPS - сервер точного времени

NTP Сервер точного времени.
NTP сервер понадобился нам для синхронной работы вещательных серверов. Так-же проведённый анализ мультикастовых потоков выявил незначительное появление ошибок в момент синхронизации OS с сервером времени. Происходил сбой генерации PTS меток, как и подрыв сервиса в кодирущем софте.
По простому - каждые 1-2 дня сыпится картинка на потоковом изображении с выхода плейаут сервера. Чаще сбой происходил при кодировании мультикаста UHD разрешения 50i.
Первым делом была настроена частая синхронизация времени WIN OS и CMOS - в реестре Polling interval. - каждые 600 секунд.
Но и центральный сервер точного времени тоже нужен. Решил собрать по готовому примеру из сети , на основе wifi сетевой карты (ESP8266) и GPS модуля, которые как раз были под рукой.
Потребовалось некоторое время чтобы адаптировать проект к заливке в сетевую карту, после чего в проекте выявлена проблема преобразования миллисекунд. Миллисекунды всегда были не правильными - по отслеживанию NTP логам и криво формировались сетевой картой.
Баг был обнаружен и успешно устранён. Миллисекунды передвавлись в NTP запрос в чистом виде, а должны были формироваться как фракция секунды.


Много времени потребовалось на подбор программ для работы с готовым проектом и его заливке в контроллер.
Ниже - необходимый софт который без труда ищется в сети:

Software:
jre-8u202-windows-x64.exe
eclipse-cpp-neon-R-win32-x86_64.zip
mingw-get-setup.exe
Espressif-ESP8266-DevKit-v2.0.9-x86.exe
Espressif-ESP8266-DevKit-Addon.zip
C project for ESP8266.

Ниже: часть кода устраняющая это недоразумение - преобразование миллисекунд в фракцию секунды (milliseconds to fraction of a second):


timetmp=SecondsSince1900(GPSyear, GPSmonth, GPSday, GPShour, GPSminute, GPSsecond);
fractmp=system_get_time();
if( fractmp >= RTCcounts )
{
useconds=fractmp - RTCcounts;
}
else
{
useconds= (0xFFFFFFFF - RTCcounts)+fractmp;
}
//os_printf("useconds: %d\r\n",useconds);

useconds=((useconds+GNRMC_US_OFFSET_BYTETIME)*4294967296*0.000001);//+GPSmillisecond*1000



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

В результате погрешность синхронизации составила чуть меньше чем ±0,01 с. в то время как погрешность синхронизации с открытыми NTP серверами через интернет составляет ±0,005 с.
Фоток к сожалению не сохранилось...

четверг, 27 июня 2019 г.

Zabbix - мониторинг TV playout систем + SNMP


Изначально Zabbix позиционируется как монитроинг множества параметров множества серверов различных групп. Очень мощная , гибкая и жизнеспособная система. К тому-же бесплатная.
При использовании на ТВ для мониторинга мультикастов в вещательных ip сетях, Zabbix тоже подходит, но наличие транспортных ошибок в потоке и его качественных характеристик, zabbix мониторить не умеет. В такой ситуации можно отслеживать только наличие и скорость траффика на мультикаст интерфейсе. Для этого нужно разделить интерфейсы данных и мультикаста либо физически, либо разнести в разные vlan-ы.
Мониторинг битрэйта мультикаст трафика это уже что-то. Настроить можно частоту проведения замеров, в том числе рабочее время или определённые дни. Можно настроить активный монтироинг, чтобы zabbix agent отправлял информацию только в момент неполадки.
Имея на руках информацию о падении мультикаст траффика Zabbix может отправлять уведомления по e-mail, SNMP и тп. или выполнить скрипт по диагностике проблемы, выполнить скрипт, осуществляющий перезапуск playout системы или приложения в зависимости от результата диагностики.
Так же Zabbix при аварии выводит информацию о проблеме, её важность, статус время, длительность, а так-же вложенную информацию по этой проблеме с её диагностикой и решением.
Очень полезная штуковина для отслеживания состояний различных устройств в сети.

Ускорение титров на фильмах с помощью FFmpeg

Это вопрос больше для телевизионщиков.

Однажды возникла необходимость укоротить титры в конце фильма, по скольку для вещания по тв, во время просмотра титров зритель переключает канал, на что-то более динамичное и интересное.
При наличии множества фильмов делать подрезку титров в ручную достаточно проблематично. Поэтому был написан скрипт для FFmpeg выполняющий такую задачу достаточно быстро. Нужно только узнать длительность фиьлма, и время в которое начинаются титры. Скорость работы ограничивается скоростью чтения/записи диска.

Вот содержимое  CMD файла:

set "infile=Film.mp4"
set "T=02:06:37"
set "D=02:13:57"
set "spd=setpts=0.5*PTS,setpts=0.5*PTS,setpts=0.5*PTS,setpts=0.5*PTS"
mkdir speedup


ffmpeg -y -fflags +genpts -i "%infile%" -map 0 -c copy -t %D% -f segment -segment_format mp4 -segment_time %T% -segment_list video.ffcat -reset_timestamps 1 -v error  chunk-%%03d.mp4

ffmpeg -y -i chunk-001.mp4 -filter:v "%spd%" -s 160x90 -b:v 10k -an endNOsnd.mp4


FOR /F "tokens=* USEBACKQ" %%F IN (`ffprobe -i endNOsnd.mp4 -v error -show_entries "format=duration" -of "default=noprint_wrappers=1:nokey=1" -sexagesimal `) DO (
SET dur=%%F
)
ffmpeg -y -i chunk-001.mp4 -filter:v "%spd%" -t %dur% endsnd.mp4

ffmpeg -y -i endsnd.mp4 -sseof -1 -copyts -i endsnd.mp4 -filter_complex     " anullsrc,atrim=0:2[at];[0][at]acrossfade=d=2[a]"    -map 0:0  -map "[a]" chunkEND.mp4
del endNOsnd.mp4
del endsnd.mp4
del chunk-001.mp4
ren chunkEND.mp4 chunk-001.mp4
ffmpeg   -y -fflags +genpts  -v error -i video.ffcat -map 0 -reset_timestamps 1 -c copy   "speedup\%infile%"
del chunk-000.mp4
del chunk-001.mp4
del video.ffcat

convert colors to midi note for midi controllers

I recently (2 years ago) designed and built a simple MIDI controller for my intercom system using an Arduino Leonardo, USB hub, sound card, ...