Новые веяния
Не сказать, чтобы наш декодер был самой необходимой железкой в телевидении, но популярность немного возросла, и тут же по всплывали некоторые неудобства и недоработки. Например, потребовалось подключать новомодные потоки SRT. Протокол относительно новый, и декодировать его умеет лишь новая версия ffmpeg’а и новые версии VLC, например. Ну а раз уж в арсенал теперь добавляются новые протоколы, то и количество источников в списке тоже растёт. Как не запутаться в нём? Правильно! Нужно каталогизировать. Ну и вот, что из этого выходит…
Каталоги
Для начала, изменим немного часть C# формирующую ответы AJAX, что бы сервер отдавал список провайдеров и какому провайдеру принадлежит какая строка. Для этого каждому адресу, помимо названия, будем присваивать провайдера, в настройках источников:
Далее, при формировании ответа json берем все названия, вычленяем различающиеся и отправляем их отдельным массивом. Ну и в массив названий источников, так же отдаем каталог (провайдера).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
static string get_setting() { string ajax_setting = ""; ajax_setting += "{\n"; ajax_setting += "\"auth\": \""; ajax_setting += auth_level; ajax_setting += "\",\n"; ajax_setting += "\"cats\": [ "; foreach (var m in Sett.getSettings.cat.Distinct<string>()) { ajax_setting += "\""; ajax_setting += m; ajax_setting += "\", "; } ajax_setting += " ],"; ajax_setting += "\n"; ajax_setting += "\"souces\": ["; for (int x = 0; x < Sett.getSettings.names.Count; x++) { ajax_setting += "{ \"cat\":\""; ajax_setting += Convert.ToString(Sett.getSettings.cat[x]); ajax_setting += "\", \"name\":[ \""; ajax_setting += Convert.ToString(Sett.getSettings.names[x]); ajax_setting += "\" ] },"; } ajax_setting += "]\n}\n"; return ajax_setting; } |
На выходе в браузере получается вот такая портянка:
А вот дальше начинаем магию JS. Надо сказать, что я так и не удосужился подтянуть данный язык, так что куски кода рождались долго, криво и мучительно. Для начала разберем ответ json и распихаем имена и ссылки какие куда нужно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
function settComplete() { if (xmlHttpSET.readyState == 4) { var sett = xmlHttpSET.responseText; eval('var sett = ' + sett + ';'); auth = sett.auth; cats = sett.cats; souces = sett.souces; if (auth == 1) document.getElementById('logo').innerHTML = "User"; else if (auth == 2) document.getElementById('logo').innerHTML = "Moder"; else if (auth == 3) document.getElementById('logo').innerHTML = "Admin"; for (i in cats) { var li = document.createElement('li'); var a = document.createElement('a'); a.innerHTML = sett.cats[i]; a.id = 'cat' + i; a.onclick = function () { menu(this.id); }; cat.appendChild(li); li.appendChild(a); } for (i in souces) { var button = document.createElement('BUTTON'); button.innerHTML = souces[i].name; button.className = "button"; button.id = i; button.onclick = function () { open(this.id); }; ol.appendChild(button); } menu('cat0'); } } |
Следом, запилим функцию сортировки / фильтрации кнопок по расовой принадлежности провайдера:
1 2 3 4 5 6 7 8 9 10 11 12 |
function menu(i) { for (x in cats) { if ('cat' + x == i) document.getElementById('cat' + x).className = "activePage"; else document.getElementById('cat' + x).className = ""; }; for (y in souces) { var str = i; str = str.replace('cat', ''); if (cats[str] != souces[y].cat) document.getElementById(y).style = "display: none"; else document.getElementById(y).style = "display: show" } } |
Теперь у нас есть кнопки категорий (провайдеров) при клике на которые мы скрываем лишние кнопки источников, не относящиеся к выбранному провайдеру. Как два пальца об асфальт!
SRT
Ну и самое сложное было, это скомпилировать новую версию ffmpeg’а с поддержкой протокола SRT, в вариации nonfree для поддержки карт decklink…
Для начала нам нужно скачать все исходники с официального сайта ffmpeg. Так же нам потребуется скачать и установить программы копилятора, и пакет DeckLink SDK.
Распаковываем все эти пироги, открываем документацию (она к слову английская), долго и внимательно читаем. Там всё доступно и правильно описано…
да кого я обманываю, я даже дописать это предложение с серьёзным лицом не смог! Нифига вы без подготовки и знаний сразу не сделаете.
Я долго читал статьи про то как скомпилировать под себя этот обалденный инструмент, а потом удалил к черту всё что накачал, и поступил по-пиратски: запрос в поисковик «ffmpeg nonfree» и далее по проторённой дорожке.
В общем новая версия декодера лежит в разделе «Программное обеспечение».
И как всегда: пользуйтесь своими мозгами правильно.
А как с вами можно связаться, никак не могу найти почту или что-то похожее, меня очень заинтересовало ваше решение по AVd
support@unicaster.ru этот ящик просматривается чаще всего. Можете в письме указать обратную связь, чем смогу помогу.