Здравствуйте, DiPaolo, Вы писали:
DP>Не очень хороший вариант: с вероятностью 95% через какое-то время начнется рассинхра между посчитанным временем и реальным. Опять же, все зависит от требуемой точности. Если нужны примерные часы "на глаз", камера имеет стабильное подключение, ничего не фризит, и капчурить в течение 15-ти минут, условно — то может и ок будет. Но по-хорошему надо, конечно, делать иначе.
Как иначе?
DP>PS ты б описал всю задачу: с какой камеры куда передаешь; что хочешь получить; какие компоненты (GStreamer/FFmpeg/OpenCV) используешь и так далее. По постам видно, что вокруг этой темы ходишь уже некоторое время, но, видимо, с разными решениями так и не получается.
С помощью gstreamer'а нарезать rtsp поток на файлы mp4, причем необходимо для фреймов хранить capture time.
gstreamer
вроде бы умеет добавлять метаданные для фрейма.
Пока для PoC я как-то обновляю метку времени и беру ее последнее значение в качестве имени файла (чтобы проще было считать все остальное),
но в идеале для каждого фрейма надо бы хранить capture time, и как это сделать --
Т.е. считаю, что текущее значение ts есть физ. время первого(ключевого) фрейма камеры.
Пока есть это:
foreach (Pad pad in splitmuxsink.Pads)
{
if (pad.Direction == PadDirection.Sink)
{
pad.AddProbe(PadProbeType.Buffer, (pad, probeInfo) =>
{
var buf = probeInfo.Buffer;
var metaTs = buf.GetReferenceTimestampMeta();
if (metaTs.Timestamp > 0)
{
gstTs= metaTs.Timestamp;
// System.Diagnostics.Debug.WriteLine($"probe counter: {probeCounter}");
Interlocked.Increment(ref probeCounter);
}
//System.Diagnostics.Debug.WriteLine($"splitmuxsink element, buffer ts: {metaTs.Timestamp}");
return PadProbeReturn.Ok;
});
}
}
var formatLocation = new Action<object, object>((o, args) =>
{
System.Diagnostics.Debug.WriteLine($"new file counter: {newFileCounter}, probes since last file:{probeCounter}");
splitmuxsink["location"] = $"some_path\\{gstTs}.mp4";
Interlocked.Increment(ref newFileCounter);
probeCounter = 0;
});
Тут засада в том, GetReferenceTimestampMeta() вроде что-то возвращает, но может возвращать одно и тоже или вообще ничего, поскольку
зависит от RTCP пакета, которые бывает раз в 5 секунд или что-то вроде того.
Тут больше деталей.
Т.е. как вообще делать например, коллаж видео с разных камер, чтобы расхождение между соотв. фреймами были минимальны? Т.е. понятно,
что есть какой-то дрейф на стороне камеры, но как-то все это уменьшить и сделать максимально синхронным. Т.е. надо как-то хранить или
уметь получать физ. время фреймов. Вроде, по идее, стандартная задача.