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正しいフレーム数を教えてくれます。では、私の質問: ムービーのすべてのフレームに 1 回だけアクセスするにはどうすればよいでしょうか? ( を呼び出した後でフレームをエクスポートするとGetNextInterestingTime、フレームが複数回、時には 25 回もエクスポートされます)
私のオペレーティング システムは Windows XP です。

4

1 に答える 1

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&A記事によると、このアプローチはfe MPEGでは機能しないはずですが、他の多くの形式では、私の経験では魅力のように機能します。

技術的なQ&A QTMTB54:MPEGムービーのフレームをカウントするにはどうすればよいですか?

于 2010-02-02T09:42:42.663 に答える