August 28th, 2020

Book

Видеомиксер

У меня тут накопился бэклог задач, многие из них селф-контейнед и можно отдавать на аутсорс.

Видеомиксер с самым коротким описанием наверное.

Есть 2 источника видео: файл с альфа-каналом и камера. Надо их смикшировать и сделать "плеер" с перемоткой видео-файла.

К файлу требования чтобы был со сжатием (сжатые форматы с альфой есть, но их немного; в принципе достаточно чтобы система со 100 часами видео уместилась на недорогой массив). К камере требования чтобы 720p@25 или выше.

В первом приближении (но это не обязательно - главное чтобы были удовлетворены требования выше) у нас линукс, файл в формате видео флеша, камера - вебкамера v4l mjpeg, и микшируем мы через gstreamer.

Gstreamer всё умеет и даже более-менее микширует без перемотки, но в случае перемотки файлового стрима впадает в ступор из-за того что файл и камера генерируют кадры в разное время. Там 3 источника расхождения:

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

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

Если сходу сделать не получится - решением считается отправка письма в мейллист gstreamer c минимальным примером (они там любят си) и получение ответа в виде "это сделать нельзя/не поддерживается/баг", т.е. добиться от них понимания и воспроизведения проблемы.

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