1

我想导出 *.mov-Movie-File 中的每一帧,所以我这样做:

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。

4

1 回答 1

1

使用nextTimeStep可能会出现问题,因为时间步不一定必须匹配(视频)媒体样本,从而导致GetMovieNextInterestingTime()返回多余的时间戳。

如果您只想计算/定位视频媒体中的所有帧,请尝试在视频媒体上使用nextTimeMediaSamplewith 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;
}
...

警告:

根据下面的问答文章,这种方法不应该适用于 fe MPEG,但对于许多其他格式,它就像我的经验中的魅力一样。

技术问答 QTMTB54:如何计算 MPEG 电影中的帧数?

于 2010-02-02T09:42:42.663 回答