Re[2]: [OpenCv]Получить физ. время фрейма, зная точное время I-frame'а?
От: Sharov Россия  
Дата: 25.07.23 09:07
Оценка:
Здравствуйте, 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 секунд или что-то вроде того. Тут больше деталей.

Т.е. как вообще делать например, коллаж видео с разных камер, чтобы расхождение между соотв. фреймами были минимальны? Т.е. понятно,
что есть какой-то дрейф на стороне камеры, но как-то все это уменьшить и сделать максимально синхронным. Т.е. надо как-то хранить или
уметь получать физ. время фреймов. Вроде, по идее, стандартная задача.
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.