Синхронизация видео с разным fps.
От: Sharov Россия  
Дата: 20.12.23 00:01
Оценка:
Здравствуйте.

Может дурацкий вопрос, но все же: допустим надо синхронизировать, сделать коллаж, 2-х видео с разным фпс, например с 12.5 и 30 (видео 2), как можно
понизить fps для 2-го видео? Ну т.е. у 2-ого видео кадров в 2-3 раза больше, я должен соотв. каждый
2 или 3 кадр пропускать? Ну вот даны 3 кадра 2-ого видео, какой из 3-х мне оставить, тот который по времени ближе к
кадрам 1-ого видео? А вот OpenCV (пока ее использую), может это автоматом сделать, т.е. сохранить видео с новым fps?
Как быть если fps не кратны, например 15 и 25 fps (или те же 12.5 и 30), искать нод?

Заранее благодарю.
Кодом людям нужно помогать!
Re: Синхронизация видео с разным fps.
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.12.23 04:45
Оценка: 6 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Может дурацкий вопрос, но все же: допустим надо синхронизировать, сделать коллаж, 2-х видео с разным фпс, например с 12.5 и 30 (видео 2), как можно

S>понизить fps для 2-го видео? Ну т.е. у 2-ого видео кадров в 2-3 раза больше, я должен соотв. каждый
S>2 или 3 кадр пропускать? Ну вот даны 3 кадра 2-ого видео, какой из 3-х мне оставить, тот который по времени ближе к
S>кадрам 1-ого видео? А вот OpenCV (пока ее использую), может это автоматом сделать, т.е. сохранить видео с новым fps?
S>Как быть если fps не кратны, например 15 и 25 fps (или те же 12.5 и 30), искать нод?

Ну насколько я понимаю, ты можешь взять буфер на кадр, отрисовывать туда с той скоростью, с которой отрисовывается, согласно FPS, а забирать оттуда с той скоростью, с которой тебе надо.

Но если ты будешь это не руками писать, а воспользуешься библиотекой, то библиотека может заоптимизировать это дело, и избежать ненижной распаковки изображения до полного растра, а потом упаковки обратно (ну, если это в принципе возможно).
Re[2]: Синхронизация видео с разным fps.
От: Sharov Россия  
Дата: 20.12.23 13:45
Оценка:
Здравствуйте, Pzz, Вы писали:

S>>Может дурацкий вопрос, но все же: допустим надо синхронизировать, сделать коллаж, 2-х видео с разным фпс, например с 12.5 и 30 (видео 2), как можно

S>>понизить fps для 2-го видео? Ну т.е. у 2-ого видео кадров в 2-3 раза больше, я должен соотв. каждый
S>>2 или 3 кадр пропускать? Ну вот даны 3 кадра 2-ого видео, какой из 3-х мне оставить, тот который по времени ближе к
S>>кадрам 1-ого видео? А вот OpenCV (пока ее использую), может это автоматом сделать, т.е. сохранить видео с новым fps?
S>>Как быть если fps не кратны, например 15 и 25 fps (или те же 12.5 и 30), искать нод?
Pzz>Ну насколько я понимаю, ты можешь взять буфер на кадр, отрисовывать туда с той скоростью, с которой отрисовывается, согласно FPS, а забирать оттуда с той скоростью, с которой тебе надо.


Вот как эту(эти) скорости вычислять?
Речь про видео, а не про rtsp поток, где может добавлять задержку и брать каждый i-й кадр. Допустим речь идет об 15 фпс и 25 фпс.
Соотв. .06 сек и .04 сек. Пример, начало, 0 сек -- берем по кадру с обоих видео. Далее + 0.06с, берем сл. кадр у 15 фпс, вопрос --
что брать у второй камеры 0.04с или 0.08с ? Как я себе пока представляю алгоритм, берем меньшее фпс, вычитываем у него кадры,
суммируем время, далее смотрим по второй камере какой кадр к этому времени лучше взять (ближайший или последний до или первый после).
Как-то так. Ну т.е. вести учет времени по видео с меньшим фпс, а у второй
камеры вычислять желаемый номер кадра с учетом собственной фпс и прошедшего времени.

Pzz>Но если ты будешь это не руками писать, а воспользуешься библиотекой, то библиотека может заоптимизировать это дело, и избежать ненижной распаковки изображения до полного растра, а потом упаковки обратно (ну, если это в принципе возможно).


Ну вот по ссылке выше у OpecCV можно делать отдельно grab и retrieve, без рендеринга изображения. Но хотелось бы просто сделать
downsampling до нужной fps (если это вообще реально).
Кодом людям нужно помогать!
Re[3]: Синхронизация видео с разным fps.
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.12.23 14:52
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Вот как эту(эти) скорости вычислять?

S>Речь про видео, а не про rtsp поток, где может добавлять задержку и брать каждый i-й кадр. Допустим речь идет об 15 фпс и 25 фпс.
S>Соотв. .06 сек и .04 сек. Пример, начало, 0 сек -- берем по кадру с обоих видео. Далее + 0.06с, берем сл. кадр у 15 фпс, вопрос --
S>что брать у второй камеры 0.04с или 0.08с ? Как я себе пока представляю алгоритм, берем меньшее фпс, вычитываем у него кадры,
S>суммируем время, далее смотрим по второй камере какой кадр к этому времени лучше взять (ближайший или последний до или первый после).
S>Как-то так. Ну т.е. вести учет времени по видео с меньшим фпс, а у второй
S>камеры вычислять желаемый номер кадра с учетом собственной фпс и прошедшего времени.

Ответ на твой вопрос на удивление прост (посмотри алгоритм Брезенхема, он легко обобщается на временные интервалы). Проблема в том, что этот простой ответ для тебя совершенно бесполезен.

Эти видеопотоки устроены так, что ты не можешь взять из него произвольный кадр. Кадры целиком там передаются хорошо, если каждый 25-й. А все промежуточные — это изменение от предыдущего. Т.е., даже если тебе нужен первый, третий и пятый, в любом случае придется раскодировать всю последовательность.

Наивная реализация могла бы раскодировать входную последовательность со свойственной ей скоростью, а при кодировании брать текущее раскодированное изображение (последний раскодированный кадр), и кодировать его, со скоростью выходного потока. Заметь, при этом никаких требований на кратность частоты кадров на входе и на выходе вообще не налагается. Да, будет небольшой джиттер, но скорее всего, не слишком заметный глазу (и устранить этот джиттер, умело выбирая кадры, невозможно, а можно лишь делать морфинг между двумя соседними кадрами, да еще и подхоняя не к "серединке", а с некоторым сдвигом от нее — короче, это совершенно другой уровень обработки, и по сложности реализации и по потреблению процессора, вряд ли нужный).

Менее наивная реализация могла бы воспользоваться тем, что существенная часть работы, уже проделанная при кодировании входного потока (например, motion detection) вполне может оказаться применима для кодирования выходного потока — но это надо уже хорошо разбираться в низкоуровневых структурах данных и алгоритмах кодека (вернее, обеих кодеков, входного и выходного).

Я бы не стал такое писать руками, если только у меня не было бы цели написать именно библиотеку алгоритмов для обработки видео — это необъятный труд, и конкурировать тут придется с каким-нибудь ffmpeg, в котором это все уже есть, причем местами с ассемблерной оптимизацией и аутсорсингом вычислительно сложной работы на видеокарту.

S>Ну вот по ссылке выше у OpecCV можно делать отдельно grab и retrieve, без рендеринга изображения. Но хотелось бы просто сделать

S>downsampling до нужной fps (если это вообще реально).

ffmpeg это умеет. ffmpeg — это библиотека функций и набор командлайновых утилит, которые ее используют.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.