SetPosition получить неправильный результат - PullRequest
2 голосов
/ 15 июня 2009

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

Я использую SetPosition (), после Pause () для прохождения кадров через график, жду, когда фильтр получит первый кадр, и Stop ().

Если я получаю кадр за кадром, сначала я получаю точные данные за этот период времени, после того, как этот кадр повторяется несколько раз, и снова точный кадр.

Почему SetPosition дает неправильный результат?

Ответы [ 2 ]

3 голосов
/ 15 июня 2009

Декодер должен начать декодирование с предыдущего i-го кадра. Как правило, demux начинает отправлять данные как минимум за секунду до этого. Когда вы начинаете получать кадры, вы должны проверить метку времени, чтобы увидеть, те ли они, которые вам нужны. Ваш фильтр получит вызов NewSegment, который задает начальную позицию поиска в файле. Если вы добавите это время начала к времени выборки на кадре, вы получите абсолютную позицию кадра в файле и сможете сравнить ее с требуемым местоположением.

G

0 голосов
/ 27 октября 2009

Вам нужно приостановить график после того, как вы отобразили график. После этого вы можете изменить кадр, который хотите показать, используя SetPositions.

Примерно так:

int ShowFrame(long lFrame)
{
    if (FAILED(m_pMC->Pause()))
       return -1;
    LONGLONG llUnknown = 0;
    LONGLONG  llTime = LONGLONG(m_lFrameTime) * lFrame + m_lFrameTime / 2;
    GUID TimeFormat;
    if (FAILED(m_pMS->GetTimeFormat(&TimeFormat))) return -1;
    if (TimeFormat == TIME_FORMAT_MEDIA_TIME)
    {
       llUnknown = llTime;
    }
    else
    {
       if (FAILED(m_pMS->ConvertTimeFormat(&llUnknown, &TimeFormat, llTime, &TIME_FORMAT_MEDIA_TIME))) return -1;
    }
    if (FAILED(m_pMS->SetPositions(&llUnknown, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning))) return -1;
    return 0;
}

m_lFrameTime - это время на один кадр, которое вы можете получить в своем пользовательском рендерере. Когда подключен вывод видео рендерера, вы можете получить VIDEOINFO :: AvgTimePerFrame на этом выводе.

...