2010-02-01 7 views
1

Я хочу экспортировать каждый кадр в * .mov-Movie-файл, так что я это сделать:GetNextInterestingTime() получает один и тот же кадр несколько раз

GoToBeginningOfMovie(movie); 
TimeValue startPoint = 0; 
long gnitFrames = 0; 
while (startPoint >= 0) { 
    GetMovieNextInterestingTime(movie, nextTimeStep, 0, &whichMediaType, startPoint, 0, &startPoint, NULL); 
    gnitFrames++; 
} 

проблема, подсчет gnitFrames отличается (намного больше), чем когда я называю это:

Track track = GetMovieIndTrack(movie, 1); 
Media media = GetTrackMedia(track); 
OSType mediatype; 
MediaHandler mediahandler = GetMediaHandler(media); 
GetMediaHandlerDescription(media, &mediatype, nil, nil); 
MediaGetName(mediahandler, medianame, 0, nil); 
long nsamples = GetMediaSampleCount(media); 

nsamples дает мне правильный кадр подсчета. Итак, теперь мой вопрос: как я могу это сделать, чтобы попасть в каждый кадр в фильме только один раз? (Когда я экспортирую рамку сейчас после того, как я позвонил GetNextInterestingTime, кадр экспортируется несколько раз, иногда даже 25 раз)
Моя операционная система - Windows XP.

ответ

1

Использование nextTimeStep может быть проблематичным, поскольку временная метка необязательно должна соответствовать образцу (видео) носителя, вызывающему GetMovieNextInterestingTime(), чтобы возвращать лишние штампы времени.

Если все, что вам нужно сделать, это подсчитать/найти все кадры в видеоносителей, попробуйте использовать nextTimeMediaSample вместе с GetMediaNextInterestingDisplayTime() на видео СМИ, как это:

... 
TimeValue64 start   = 0; 
TimeValue64 sample_time  = 0; 
TimeValue64 sample_duration = -1; 
int frames = 0; 
while(sample_time != -1) { 

    GetMediaNextInterestingDisplayTime(media, nextTimeMediaSample | nextTimeEdgeOK, start, fixed1, &sample_time, &sample_duration); 
    if(sample_time != -1) { 
     ++frames; 
    } 
    ... 
    start += sample_duration; 
} 
... 

Оговорка:

Согласно Q & Статья ниже этого подхода не должна разрабатываться для fe MPEG , но для многих других форматов он работает как шарм в моем опыте.

Technical Q&A QTMTB54: How do I count the frames in an MPEG movie?

+0

это не работает для меня, потому что я работаю с MPEG много, и когда я использую это для подсчета кадров, например, кажется, что это вызывает бесконечный цикл ... :( – Berschi

+0

Есть вы пытались передать 'nextTimeStep' вместо' nextTimeMediaSample | nextTimeEdgeOK', все еще используя 'GetMediaNextInterestingDisplayTime()'? Таким образом, вы можете быть в состоянии удостовериться в том, что MPEG допускает, чтобы несколько кадров содержались в одном образце носителя, будучи возможность игнорировать время, связанное с Medias, вас не интересует ... – Bjoern

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