Русскоговорящим разработчикам всегда есть чего рассказать: поделиться каким-то своим уникальным опытом и мнениями. Но в формате видеоблога, из-за высокой сложности при записи, делают это сейчас единицы. Под катом рассказал о своем непростом пути к записи и редактированию видео с помощью свободного ПО, скриптинга на Ruby и подручных средств. Начал я с изучения теории о записи видеоблогов по англоязычным YouTube-роликам. А из русскоязычных материалов — довольно полезным оказался вот этот курс (в частности модуль про видеоблог и первое видео о построении кадра из модуля про репортаж). Также бегло ознакомился с популярными фичами проприетарных видеоредакторов, чтобы более осознанно подойти к выбору свободного редактора. В свет не рискнул вкладываться: не хватает времени на его изучение и поиск оптимального варианта, а поверхностное изучение дешевых вариантов говорит о потенциальных граблях вроде мерцания и плохой цветопередачи. С дневным светом у меня не возникло больших трудностей, его хватает как раз на короткие ролики. Существующие свободные инструменты видеомонтажа содержат ряд известных проблем: от неудачных решений в UI и подвисаний, превращающих редактирование в бесконечность, до утечек памяти, падений и неожиданных артефактов, которые появляются только после финального рендеринга. Проблем очень много и потребовалось время на то, чтобы выбрать видеоредактор и изучить его баги, чтобы просто научиться справляться с базовыми вещами. В конечном счете остановился на Pitivi, просто потому что времени и так много потратил на поиски и эксперименты. Поддерживаемый способ установки Pitivi требует Flatpak. Какое-то время я обходил его стороной, т.к. у меня в системе нет systemd и PulseAudio. Оказывается systemd давно не требуется. Ну а PulseAudio — пришлось поставить и настроить было проще модифицировать Flatpak. Но правильней было бы поставить PulseAudio, просто это несколько нудно и непонятно стоит ли ожидать от него проблем с записью звука на имеющемся железе или нет. Устанавливаем Pitivi, удаляем конфиги PulseAudio, запускаем: Звука нет. Попробуем запустить что-нибудь попроще, например aplay: Вероятно alsa-lib, входящий во Flatpak, был собран с --with-versioned. Быстрое решение — заменить libasound.so системным: Для меня и этого оказалось недостаточно: Нужен еще конфиг ALSA: Наконец-то можно использовать Pitivi. Некоторые анимационные эффекты для текста я делаю с помощью скринкаста открытых на весь экран страниц, сверстанных с использованием reveal.js и animate.css. В reveal.js для некоторых слайдов добавляю звук перехода: Оказалось важно записывать скринкаст с 60 FPS, если текст очень большой. Скринкаст делаю так: В моем случае shared_input_loopback — это устройство из конфига asound.conf. Еще вот эта надстройка над ffmpeg для переходов между клипами, оказалась полезной. Под рукой оказался телефон Meizu MX4, на котором я решил использовать фронтальную камеру и записываться с помощью Open Camera. Потребовалось некоторое время, чтобы натренировать себя смотреть в камеру и контролировать своё положение в пространстве, не делая типичных ошибок, вроде обрезания головы. При этом говорить достаточно четко, громко, жестикулировать и генерировать хоть какую-то мимику. Но это было только начало. Что же побудило меня сделать автоматическую нарезку видео, да еще и на этапе записи? Вот какие требования к будущему велосипеду я себе поставил: Зачем столько контроля над устройствами на этапе записи? Почему бы просто не запустить запись на несколько часов подряд, а уж потом редактировать? Причин много: Проще записываться небольшими фрагментами и сделать примитивную автоматизацию всего что можно. В качестве основного языка для разработки велосипеда выбрал Ruby. На самом деле сейчас я бы, вероятно, выбрал Python, но на тот момент я как раз изучал Ruby, а новые для меня языки я обкатываю на таких вот странных экспериментах. Информации в сети на эту тему не очень много. Про исследование Stanford и Adobe поздно вспомнил (что не страшно, мне всё равно менее навороченное решение нужно). Нарезка происходит в 2 этапа: на этапе записи — грубая, на этапе рендеринга — более точная, с возможностью вручную подкорректировать слишком сильно обрезанные фрагменты. Грубая реализована с помощью VAD из WebRTC. Более точная — с помощью Google Speech (если конкретней — с помощью модификации проекта autosub, для генерирования субтитров к видео). Уверен что найдутся и более удачные решения, просто это оказалось лучшим из того, что удалось сделать быстро. Если хотите разработать что-то подобное с использованием ffmpeg — придерживайтесь принципа не пытаться сделать слишком много за один вызов ffmpeg. Делайте промежуточные файлы и контролируйте каждый шаг, чтобы потом не заниматься поиском странных негугливаемых багов, вроде неправильного разрезания или непримененного эффекта. Запускаю получившееся безобразие как-то так: Аргументы к arecord мне нужны, чтобы явно указать устройство, дабы избежать периодических глюков, которые скорее всего происходят из-за ALSA-вского плагина dsnoop. Можно еще лог открыть, чтобы контролировать процесс скачивания файлов с телефона: tail -f /path/to/project/log.txt. Быстро срендерить в одно видео для предпросмотра, можно так: Аргумент --video-filters — это фильтры, передаваемые в ffmpeg. Видео автоматически откроется в плеере mpv. Можно также поменять местами или выкинуть оставшиеся ненужные дубли редактированием появившегося файла /path/to/project/render.conf, которые можно обнаружить благодаря распознанному голосу. Идея, кстати, не новая. Там же можно ускорить отдельные фрагменты и подредактировать неудачные разрезания видео, если такие есть. В следующий раз vlog-render перечитает render.conf и применит изменения. Чтобы подготовить фрагменты для видеоредактора — нужно указать --preview false. Помимо фрагментов, которые будут лежать в output, он всё же объединит их в один файл output.mp4, потому что изначально я был не уверен: В основном использую первый вариант. Второй был полезен в одном видео с плохим светом: там я использовал лишь кусок output.mp4. Для второго варианта также может быть полезен скрипт vlog-play-segments: с помощью него можно быстро посмотреть все паузы между клипами в порядке убывания длительности. Это поможет более точно подредактировать render.conf и сэкономить потом время на редактировании этого длинного куска видео в Pitivi. Получившиеся мелкие клипы можно загрузить одним разом на таймлайн в Pitivi: выделяем все импортированные клипы и тащим с помощью drag-n-drop. Заниматься поисками подходящей подставки под телефон не хотелось, да и руки уже чесались записать хоть что-нибудь. Берем попавшийся под руку кусок картона и вырезаем крепление для телефона под свои нужды: Подставка крепится на дисплей ноутбука, чтобы минимализировать расстояние между сценарием и камерой. Приемлемый звук очень критичен. Под рукой оказался микрофон Boya BY-M1. Хоть его и рекламируют как всенаправленный микрофон, хороший звук на практике получается только когда используешь его как однонаправленный. Стойку для микрофона сделать еще проще: берем попавшуюся под руку бутылку от гранатового сока, рулон скотча и собираем этот конструктор воедино: Можно еще полотенце подложить под эту конструкцию, чтобы подавить часть вибраций от стола и заодно отрегулировать высоту. В моем случае это ASUS Xonar U3. Оказалось, правда, что она не совместима с таким микрофоном: у микрофона штекер CTIA, рассчитанный на телефоны. Проблема решилась переходником в штекеры TRS для микрофона и наушников. И найти его было непросто: производители таких переходников редко пишут детали. В моем случае помог некий Cablexpert CCA-418W. Еще одна проблема этой карты — в DC offset в правом канале при записи. Что никак не мешает, т.к. записываюсь я все равно в моно. А для софта, который не позволяет выставить моно сделал перенаправление хорошего канала в плохой, средствами ALSA. Также эта карта боится перегревов. Нужно держать ее подальше от кулера, иначе будет тормозить и записывать звук рывками. Звук редактирую в наушниках (в моем случае это Pioneer SE-M390), на громкости выше чем та, на которой обычно слушаю музыку. Алгоритм примерно такой: Пользуясь случаем ослабления гаек в правилах, приглашаю посетить получившийся канал на YouTube, где я делюсь инсайтами об эффективном изучении программирования и смежных дисциплин. Удачи в разработке программ и создании видеоблогов! Update: перевел эту статью для своего англоязычного блога. Программист