Правильно говорят, что утро начинается не с кофе. Одно прекрасное утро у меня началось с отказа одного из наших серверов. Бедолага отвечал за запись передач и воспроизведения всякого разного на декорации студии. И вот одним пасмурным утром этот кусок железки устал. Делать нечего, отправили уставшего на покой в ремонт, декорации переключили на аппаратные плеера, а вот с записями то что делать? А записи, теоретически, можно вести на наш AutoRecorder. Проблема оказалась в том, что качество и формат записей для нашего сайта естественно отличаются от стандартов, применяемых в монтаже и эфире. Значит пришло время очередного обновления!
Глава 1. Баги
Для начала нужно было исправить некоторые баги, выявленные в прошлых версиях. Мелкие описывать смысла нет, а вот на одной внимание остановлю.
1 2 3 4 5 6 7 8 9 10 11 12 |
public void stopREC() { if (IsRunning(rID) != null) { if (cutNumber != 0) cut(); Process.GetProcessById(rID).Kill(); Process.GetProcessById(rID).WaitForExit(); rID = 0; recRestart.Text = "(запись) СТАРТ"; Log.addSting("Стоп записи файла " + fileName + "(" + cutNumber + ")" + ".mp4", 1); } } |
Остановка процесса ffmpeg производилась не корректно. В силу не правильного радиуса кривизны собственных рук, я не нашел другого способа, кроме как тупо убивать процесс методом Process.Kill(). Из-за этого видео файлы записи завершались не корректно или попросту «бились». Нас конечно спасал немного флаг –movflags frag_keyframe в строке запуска процесса, который формировал фрагментированный файл, но это были «костыли». Так что первым делом исправил этот недочет:
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 StreamWriter inputWriter; public static void Start64(string arg) { ... if (cutNumber == 0) { rID = _process.Id; inputWriter = _process.StandardInput; } ... } public void stopREC() { if (IsRunning(rID) != null) { if (cutNumber != 0) cut(); inputWriter.WriteLine("q"); Process.GetProcessById(rID).WaitForExit(); inputWriter.Close(); inputWriter.Dispose(); rID = 0; recRestart.Text = "СТАРТ ▼"; Log.addSting("Стоп записи файла " + fileName + "(" + cutNumber + ")" + "." + Sett.getSettings.formats[currentFormat], 1); } } |
Теперь наша оболочка посылает подчиненному процессу ffmpeg консольную команду «q», и процесс завершается сам и корректно.
Глава 2. Свистелки и сопелки
Далее, что бы у нас появилась возможность писать в разные форматы, качества и т.д. я добавил список строк запуска:
Теперь в настройках есть вкладка «форматы», в которой мы создаем своего рода пресеты. Т.е. для каждого формата нужно указать расширение формируемого файла, непосредственно строку параметров для ffmpeg и отображаемое название формата. После этого весь список форматов будет отображаться при нажатии на кнопку «СТАРТ»:
Выбираем нужный нам формат и оболочка запускает запись с нужными нам параметрами. Для этого немного переработал функцию recRestart_Click
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
private void recRestart_Click(object sender, EventArgs e) { if (IsRunning(rID) != null) stopREC(); else { Point screenPoint = recRestart.PointToScreen(new Point(recRestart.Left, recRestart.Bottom)); if (screenPoint.Y + startMenuStrip.Size.Height > Screen.PrimaryScreen.WorkingArea.Height) startMenuStrip.Show(recRestart, new Point(0, -startMenuStrip.Size.Height)); else startMenuStrip.Show(recRestart, new Point(0, recRestart.Height)); } } private void startMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { currentFormat = startMenuStrip.Items.IndexOf(e.ClickedItem); startREC(currentFormat); } |
Кстати, название формата пришлось ограничить 12 символами, чтобы в кнопке корректно отображать название в момент записи.
Конечно, тут же возникли разногласия с автоматизацией. В каком формате будет происходить запись без участия человека?
Так что пришлось добавить настройку «Формат по умолчанию».
Заключение
Хотелось бы в комментариях увидеть мнения, что ещё можно добавить в данное ПО в качестве функционала. В архиве проекта оставлю текущую версию программы с парой настроенных форматов в настройках. Главное нужно понимать, как и для чего мы формируем параметры запуска ffmpeg. От этого понимания будет зависеть и работоспособность данной оболочки. Иными словами – пользуйтесь своими мозгами правильно.