Как преобразовать между "двойной" отметкой времени из образца граббер DirectShow и REFERENCE_TIME FillBuffer? - PullRequest
2 голосов
/ 01 декабря 2011

Функция IMediaSample SetTime () ожидает два параметра REFERENCE_TIME .REFERENCE_TIME определяется как тип "LongLong" в Delphi 6, языке программирования, который я использую для своего приложения DirectShow.Однако первый параметр метода Callback, который фильтр захвата семплов DirectShow использует для передачи времени семпла нового семплового медиаданных, приводится как double .Как выполнить преобразование между этими двумя значениями, чтобы я мог сравнить время выборки между образцом мультимедиа, полученным из фильтра захвата образца, и значениями REFERENCE_TIME, которые я генерирую в методе FillBuffer () моего push-источника?будет ли время выборки, предоставляемое фильтром Sample Grabber в методе обратного вызова, считаться временем начала выборки мультимедиа или временем окончания?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Простая часть: double в секундах, а REFERENCE_TIME в единицах по 100 нс. Следовательно, преобразование просто: кратно или делится на 1E+7.

Не все так просто: вы фиксируете некоторое время в граббере на одном графике фильтра, а данные метки времени в своем фильтре на другом графике. На обоих графиках есть отметки времени, указывающие время потоковой передачи / представления , что относительно графика «время выполнения». То есть, когда образец мультимедиа передается между графиками, может также иметь место смещение отметки времени.

Что касается времени окончания, то для отсчетов мультимедиа время окончания отсчетов может быть опущено или установлено равным времени начала; время остановки звука обычно вычисляется путем добавления времени начала к данным полезной нагрузки, которые хранятся в буфере.

Чтение бонусов на MSDN: Время и часы в DirectShow

0 голосов
/ 13 января 2015

Мне также было немного трудно думать в 100 наносекундных единицах.Поэтому я также часто конвертирую между миллисекундами и единицами измерения 100 нс.Хотя написать свои собственные функции довольно просто.Если вы используете DirectShow BaseClasses, то в базовых классах directshow в файле также экспортируется макрос в файле RefTime.h

. Это также сделает преобразование:

double time = 1000;
REFERENCE_TIME direct_show_time = MILLISECONDS_TO_100NS_UNITS(time);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...