1

既存のムービー ファイルを開いて、このファイルのすべてのフレームを JPEG や TIFF などの画像にエクスポートしたいと考えています。私はこれまでのところ:

int main(int argc, char* argv[]) {
    char filename[255]; // Filename to ping.
    OSErr e;            // Error return.
    FSSpec filespec;    // QT file specification
    short filemovie;    // QT movie handle.
    Movie movie;        // QT movie "object".

    InitializeQTML(0);
    EnterMovies();
    // Because of QT's Mac origin, must convert C-string filename 
    // to Pascal counted string, then use that to make a filespec.
    c2pstr(filename); 
    FSMakeFSSpec(0, 0L, (ConstStr255Param)filename, &filespec);

    OpenMovieFile(&filespec, &filemovie, fsRdPerm);
    NewMovieFromFile(&movie, filemovie, nil, nil, newMovieActive, nil);
    ...

今までは問題なく動作していましたが (テストしTimeValue movietime = GetMovieDuration(movie);て印刷しました)、今はムービーのすべてのフレームを取得してファイルにエクスポートしたいと考えています (最初に、後でデータをメモリに保持して操作したいだけです)。しかし、それが本当に機能するかどうかを知る必要があるため、画像ファイルへのエクスポートが今のところ優れています)。
それ、どうやったら出来るの?GWorld または PixMap が必要ですか? ムービー ファイルから、特にその各フレームから GWorld/PixMap を取得するにはどうすればよいですか?

編集:私のプラットフォームは WinXP です

4

4 に答える 4

1

はじめに、映画のエクスポーターに関するこの記事は、あなたが始めるのにかなり役立つはずです:

http://www.mactech.com/articles/mactech/Vol.16/16.05/May00QTToolkit/index.html

MacTechはMacリソースですが、説明されているすべてのAPI関数はQuickTime forWindowsSDKでも使用できるはずです。

時間を見つけたらすぐに、ここで参考としてサンプルコードを一緒に叩きます。

編集

追加情報については、この本の抜粋を参照してください。

QuickTimeToolkit-基本的な映画の再生とメディアタイプ@Googleブックス

編集2-ハイレベルなアプローチ:映画の輸出業者

QuickTimeムービーからすべてのビデオフレームを抽出し、QuickTime APIでサポートされている別の形式に変換するだけの場合は、MovieExporterを使用している場合は低レベルのアクションを実行する必要はありませ

以下のサンプルコードでは、プログラムで呼び出されるムービーエクスポートダイアログを使用して、QuickTimeムービーからすべてのビデオフレームを抽出し、一連のJPEGファイルに変換できます。

ダイアログの[エクスポート]コンボボックスで[動画から画像シーケンス]を選択し、[オプション]をクリックして目的の画像形式を選択するだけです。

注1:これを非対話的に行う必要がある場合は、お知らせください。

注2:わかりやすくするためにエラー処理は省略されています

#include "Movies.h"
#include "QTML.h"
#pragma comment (lib, "QTMLClient.lib")

..。

int  flags                  = createMovieFileDeleteCurFile 
    | showUserSettingsDialog 
    | movieToFileOnlyExport;
ItemCount  movie_prop_count = 0;
CFStringRef  cfpath         = 0;
Boolean  bool_true          = true; 
QTNewMoviePropertyElement  movie_props[ 2 ];
Movie  movie;

// initialize QuickTime API
InitializeQTML( 0 );
EnterMovies();

// set up Core Foundation string for source path (argv[ 1 ]) contains the full path to the MOV file to convert
cfpath = CFStringCreateWithCString( 0, argv[ 1 ], kCFStringEncodingASCII );
movie_props[movie_prop_count].propClass        = kQTPropertyClass_DataLocation;
movie_props[movie_prop_count].propID           = kQTDataLocationPropertyID_CFStringNativePath;
movie_props[movie_prop_count].propValueSize    = sizeof(cfpath);
movie_props[movie_prop_count].propValueAddress = (void*)&cfpath;            
movie_props[movie_prop_count].propStatus       = 0;
++movie_prop_count;

// make Movie active
movie_props[movie_prop_count].propClass        = kQTPropertyClass_NewMovieProperty;
movie_props[movie_prop_count].propID           = kQTNewMoviePropertyID_Active;
movie_props[movie_prop_count].propValueSize    = sizeof(bool_true);
movie_props[movie_prop_count].propValueAddress = &bool_true;
movie_props[movie_prop_count].propStatus       = 0;
++movie_prop_count;

// aquire Movie for our Movie file
NewMovieFromProperties( movie_prop_count, movie_props, 0, 0, &movie );

// invoke conversion dialog
ConvertMovieToFile( movie, 0, 0, 0, 'TVOD', 0, 0, flags, 0 );

// clean up
DisposeMovie( movie );
CFRelease( cfpath );

ExitMovies();
TerminateQTML();

..。

于 2009-12-21T14:18:25.753 に答える
1

これらのコマンド ライン OSX ユーティリティは、QTPro を購入しなくても Quicktime ムービーのコンテンツを抽出するのに非常に優れています。

qt_tools

于 2011-09-29T20:25:04.027 に答える
1

OS X のみで作業している場合は、QTKit API を使用します。これらの API ははるかに高レベルであり、一般的に操作が簡単だからです。

やりたいことの一般的な要点は次のとおりです。

  1. ムービーの各フレームをステップスルーする
  2. 現在のフレームの画像表現を取得する
  3. 現在のフレームの画像をディスク上のファイルに保存します

QuickTime ムービーのフレームをステップスルーするには、QTKitのQTMovieクラスを次のように使用できます。

- (void)dumpFramesWithMovie:(QTMovie*)movie toFolder:(NSString*)folderPath
{
    [movie setIdling:NO]; // Don't idle the movie

    [movie gotoEnd];
    QTTime endTime = [movie currentTime];

    [movie gotoBeginning];

    // Number of frames counted so far
    unsigned long numFrames = 0;

    // Turn off the Movie's looping so we are quaranteed to stop
    [movie setAttribute:[NSNumber numberWithBool:NO] forKey:QTMovieLoopsAttribute];

    // Construct a Dictionary of to use when reading frames from a movie
    NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
    [attributes setObject:QTMovieFrameImageTypeNSImage forKey:QTMovieFrameImageType];    
    while (true)
    {
        QTTime curTime = [movie currentTime];
        if (QTTimeCompare(curTime, endTime) == NSOrderedSame)
        {
            // Reached end of file
            break;
        }

        // Get the Current Frame as an NSImage
        NSImage* image = [movie frameImageAtTime:curTime 
                                  withAttributes:attributes error:nil];

        // Get the bitmap representation of this image
        // NOTE: This code assumes the first image representation is a NSBitmapImageRep, which is true
        // by default in OS X 10.5 and later.  
        // Production code should do error checking here.
        NSBitmapImageRep *bitmap = [[image representations] objectAtIndex: 0];

        // Construct a filename based upon the folder path and number of frames read so far
        NSString* fileName = [NSString stringWithFormat:@"%@/frame%d.png", folderPath, numFrames];

        // Get an PNG representation of this file
        NSData *data = [bitmap representationUsingType: NSPNGFileType
                                            properties: nil];

        // Write to disk
        [data writeToFile: fileName
               atomically: NO];

        // Step to the next Frame
        [movie stepForward];
        numFrames++;
    }

    [movie gotoBeginning];
}
@end

このコードはコンパイルできますが、完全にはテストされていません。

このアプローチの 1 つの注意点は、MPEG-1 ファイルが OS X 10.5 以前では正しくデコードされないことです。これは、私の知る限り、10.6 で修正されています。また、Windows アプリケーションを作成している場合は、下位レベルの Quicktime-C API を使用する必要があります。

作業中は、次の参照ページを確認してください。

于 2009-12-07T19:50:18.253 に答える
0

私は通常、デコードされたフレームを次々にバイナリにダンプし、YUV ビューアーを使用して、それらが正常に見えるかどうかを確認します。そのためには、デコードされたフレームの正確なカラー形式と解像度を知る必要があります。RGB がある場合は、確かにそのためのビューアーもあります。

アップデート:

リンクが機能していないようです。YUV-Viewer についてはググる必要があります。または、 Elecardから購入することもできます。

于 2009-12-07T11:31:09.270 に答える