我想导出* .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。
答案 0 :(得分: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&amp; A文章,这种方法不应该用于f.e. MPEG 但对于许多其他格式而言,它在我的体验中就像一种魅力。
Technical Q&A QTMTB54: How do I count the frames in an MPEG movie?