2011-01-24 3 views
0

Насколько я знаю, чтобы проверить, является ли кадр ключевым фреймом или нет, я должен проверить метод IMediaSample :: IsSyncPoint(), который возвращает 0 (S_OK), если кадр является ключевым фреймом или ложным в другом случае.Поиск ключевых кадров с использованием IMediaSample DirectShow.Net

Но метод IsSyncPoint() просто возвращает 0 в каждом кадре, который захвачен и передан методу обратного вызова ISampleGrabberCB :: SampleCB().

код, что мой обратный вызов включают прост:

public int SampleCB (double sampleTime, IMediaSample mediaSample) 
    { 
    Console.WriteLine ("SampleCB Callback"); 
    Console.WriteLine (mediaSample.IsSyncPoint () + " "); 

    Marshal.ReleaseComObject (mediaSample); 
    return 0; 
    } 

Что я здесь отсутствует?

ответ

1

Какой у вас тип носителя? Если образец захватчика получает несжатые видеокадры, то каждый кадр является точкой синхронизации.

+0

MediaType, который я установил, это RGB24. И я думаю, что это дает несжатые кадры, как вы говорите. Но какой другой MediaType я мог бы использовать? Я пробовал другие типы, но он не работал. О да, и график, который я построил, это: Источник видеосигнала -> Образец Grabber -> VideoRenderer Также предлагайте любые изменения в этом. –

+0

Если вы получаете несжатые кадры, то каждый кадр является точкой синхронизации, и нет способа (в этой точке) определить, был ли исходный сжатый кадр ключевым фреймом. (Метод IsSyncPoint строго не проверяет ключевые кадры, он проверяет точки синхронизации. Для сжатого видео точка синхронизации является ключевым фреймом). Таким образом, это зависит от того, почему вам нужно найти ключевые кадры. Если вам нужно получить несжатое видео * и * проверить наличие ключевых кадров, вам может понадобиться фильтр pass-thru перед декодером. –

Смежные вопросы