Введение
В одной из прошлых статей, я описывал разработку программы-оболочки для FFMPEG и автоматизации нарезки записи. Шло время, и программа успешно пользовалась, постепенно выяснялись дополнительные хотелки. И так дождались! обновление!
Глава 1. Аппаратная
Появилась потребность связать нашу программу с другим пультом. Да не с простым, а звуковым. Не буду описывать на кой черт это потребовалось, скажу по существу: у другого пульта оказалась связь с внешним миром только хардварная… т.е. GPI. Ну меня такими словесами не испугать, так что здравствуй Arduino мля! Опять! Зарекалась свинья… Ну да ладно. Взялся за грудь – говори что ни будь. Но пилить код для ардуины особо не хотелось, и тогда вспомнил я про старый добрый firmata. Я мельком по него упоминал в статье Простой Tally Lights для vMix и этот протокол в общем то подходит как нельзя лучше. Но для начала нужно было собрать гальваническую развязку для GPI. Простой оптрон (а точнее 12, на вырост) решил проблему. Дешево и сердито, делаем двухсторонюю печатную плату под разъем DB25 (в исходниках положу):
Далее подключаем нашу плату к ардуине согласно схеме:
и заливаем в ардуинку скетч из примеров standartFirmata. Теперь мы можем использовать до 6 GPI и 6 GPO каналов. Иными словами: можем назначить те или иные каналы GPI на управление записью или срезами, а так же назначить GPO для обратной связи (индикация или передача управления другому устройству). Распиновка разъема DB25:
Ну раз мы начали рассказывать про firmata, то нужно закончить его описание и программно. Особо сложного ничего нет: нашли библиотечку в интернете (там их полно), засунули в наш проект и вот вам радость… Но для меня была одна сложность, как для недопрограммиста. Дело в том, что в этот раз у меня на руках оказалась Arduino Leonardo. И, казалось бы, в чем разница? Есть скетч standartFirmata, есть библиотека на C#, запускай и всё. Но разница между той же nano и Leonardo в том, что у последней USB аппаратный, в контроллере. И обращаться к её программному COM порту нужно чуть-чуть по-другому, нежели в самой простой CH340 (те отдельные микросхемы USB-COM, что ставят на китайские Nano).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public Firmata(string serialPortName, Int32 baudRate, bool autoStart, int delay) { _serialPort = new SerialPort(serialPortName, baudRate); _serialPort.DataBits = 8; _serialPort.Parity = Parity.None; _serialPort.StopBits = StopBits.One; _serialPort.DtrEnable = true; //for FUCKING Arduino Leonardo! if (autoStart) { this.delay = delay; this.Open(); } } |
В общем, для тех, кто наступает на эти грабли вместе со мной: пока не включите на порту DTR, ни черта у вас не выйдет. Мой путь к одной простой строчке был тернист и я сжег не одни асбестовые трусы.
Глава 2. Программная
И так, давайте пройдёмся по главному – по изменениям в функционале. Самое главное изменение – изменен алгоритм подсчета длительности. Внимание на переменную next:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public static void cut() { if (rID == 0 || debonceTrigger) return; TimeSpan deltaIn = TimeSpan.Parse("0"); TimeSpan deltaOut = TimeSpan.Parse("0"); if (!manMode) { deltaIn = TimeSpan.FromMilliseconds(Sett.getSettings.deltaIn); deltaOut = TimeSpan.FromMilliseconds(Sett.getSettings.deltaOut); } if (cutNumber == 0) start = TimeSpan.Parse("0"); else start = next + deltaIn; //next = TimeSpan.Parse(GetVideoDuration(Sett.getSettings.pathREC + "\\" + fileName)) + deltaOut; next = (DateTime.Now - Process.GetProcessById(rID).StartTime) + deltaOut; cutNumber++; if (Sett.getSettings.debonceTime != 0) debounceCut(); var buf = " -i " + folderName + "\\" + fileName + ".mp4 -loglevel error -ss " + start + " -to " + next + " -c copy " + Sett.getSettings.pathCUT + "\\" + fileName + "(" + cutNumber + ")" + ".mp4"; Start64(buf); } |
Вместо функции GetVideoDuration и отдельного вызываемого ей процесса ffprobe, просто вычитаем из текущего времени, время запуска связанного процесса и добавляем к нему дельту. Подсчет работает в разы быстрее и точнее.
Не много дополнительных свистелок:
- Добавлена настройка выхода NDI. Для тех, кто не знает, что это – бесплатный программный стандарт, разработанный компанией NewTek, позволяющий передавать видео по сети с минимальными задержками. В общем очень крутая штука (не менее крута, чем ffmpeg). Иными словами, наша программа теперь может не только писать видео, но и плеваться им в сеть.
- Добавлена автоматизация удаления срезов. При закрытии программы удаляются срезы старше указанных дней.
- Все настройки управления перенесены в отдельую вкладку.
Сюда же добавили возможность назначить глобальную горячую клавишу для запуска/остановки записи и управление протоколом Firmata. И всё что вам не нужно, теперь можно деактивировать.
Заключение
Про мелкие исправления багов смысла писать нет, но такое обилие настроек заставило принудительно перезапускать приложение, после их изменения. Продолжаем развивать, доделывать и пилить. В общем, пользуйтесь своими мозгами правильно.