Я взаимодействую с типом видеопотока, который составляет около 30 кадров в секунду, который в основном статичен (как неподвижное изображение). Я получаю обновления из потока только когда есть движение в видео. Так что, если видео статично в течение 5 минут, я получаю данные только за эти 5 минут как один кадр данных. Затем, если в течение 5 секунд происходит движение по видеопотоку, я также получаю данные каждого кадра (например, около 150 кадров). Тогда, если это еще на 5 минут, я получу данные одного кадра за все это время. Таким образом, видео будет 10 минут и 5 секунд, но я получу 152 кадра данных за этот период времени.
Я пытаюсь создать видеофайл в реальном времени из этих данных, но когда я его кодирую, первые и последние 5 минут видео существуют только как один кадр, поэтому вместо 5 минут неподвижного видео он идет прямо на 2 секунды. где у меня были эти реальные кадры в реальном времени.
Каков наилучший подход к созданию фактического, полнометражного / реального видео на основе этой информации? В настоящее время я использую C ++.
Вы ничего не упоминали о кодеках или инструментах, но подразумевали, что уже делаете кодирование.
Большинство видеокодеров ожидают фиксированную частоту кадров. Таким образом, простое решение состоит в том, чтобы просто подавать его в тот же кадр, пока не пройдет достаточное «время кадра», чтобы перейти к следующему кадру в вашем наборе.
Вот некоторый псевдокод:
frames_per_second = 30;
encoder = CreateEncoder(frames_per_second, width, height);
milliseconds_per_frame = 1000.0/fps;
timestamp = frameset[0].timestamp;
x = 0;
while (x < frameset.count)
{
AddNextFrameToEncoder(encoder, frameset[x].framedata);
timestamp += milliseconds_per_frame;
if ((x < frameset.count-1) && (timestamp >= frameset[x+1].timestamp))
{
x++;
}
// else - keep repeating the same source frame until "timestamp" is incremented to the timestamp of the next still
}
Других решений пока нет …