高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1147
Programmatic configuration of a Movie Export Component


Q: ムービーを直接、非圧縮の AVI ファイルにエクスポートしようとしています。QuickTime に組み込まれているエクスポータを使ってみましたが Cinepak 圧縮 AVI しか得られないようです。 MovieExportDoUserDialog を使ってエクスポートダイアログを表示し設定を変更することもできるのですが、それはしたくありません。プログラム上で設定を変更できますか?

A: QuickTime に組み込まれている、ムービーを AVI ファイルにエクスポートするコンポーネントを使用すれば、いくつかのコーデックを使ってエクスポートできます。デフォルトは Cinepak ですが、プログラム上でそのコンポーネントに、別のコンプレッサを使うように設定することもできます。 MovieExportGetSettingsAsAtomContainer を使って、エクスポート設定を QTAtomContainer として取得し、空間設定を変更し、 その後 MovieExportSetSettingsFromAtomContainer を使ってエクスポートコンポーネントを設定します。

リスト 1 は、Indeo 4 コーデック(kIndeo4CodecType)を使用するためにプログラムにより AVI エクスポートコンポーネントを設定する方法を示します。Windows Raw(kWindowsRawCodecType)コーデックもまったく同じように簡単に選択できます。


 OSErr SpitAVIMovie(const Movie inMovie, const FSSpecPtr inFile)
{
    ScriptCode           fileScript = smCurrentScript; // Windows では smSystemScript を使用する
    MovieExportComponent movieExporter = NULL;
    QTAtomContainer      exportSettings = NULL;
    QTAtom               videAtom = 0,
                         sptlAtom = 0;
    SCSpatialSettings    spatialSetting;
    OSErr                err = noErr;

    // AVI の 'spit' コンポーネントを開く
    err = OpenADefaultComponent(MovieExportType, kQTFileTypeAVI, &movieExporter);
    if (err || !movieExporter) goto bail;

    // デフォルトの設定を取得
    err = MovieExportGetSettingsAsAtomContainer(movieExporter, &exportSettings);
    if (err) goto bail;

    // 空間設定を含む 'vide' アトムを探す
    videAtom = QTFindChildByID(exportSettings, kParentAtomIsContainer,
                               kQTSettingsVideo,
                               1, NULL);
    if (0 == videAtom) { err = cannotFindAtomErr; goto bail; }

    // 空間設定、'sptl' アトムを探す
    sptlAtom = QTFindChildByID(exportSettings, videAtom,
                               scSpatialSettingsType,
                               1, NULL);
    if (0 == sptlAtom) { err = cannotFindAtomErr; goto bail; }

    // 自身の設定を行う
    spatialSetting.codecType = EndianU32_NtoB(kIndeo4CodecType); // または kWindowsRawCodecType
    spatialSetting.codec = 0;
    spatialSetting.depth = EndianU16_NtoB(24);
    spatialSetting.spatialQuality = EndianU32_NtoB(codecLosslessQuality);

    // 設定を反映するようにアトムデータを変更する
    err = QTSetAtomData(exportSettings, sptlAtom,
                        sizeof(spatialSetting),
                        &spatialSetting);
    if (err) goto bail;

    // エクスポータの設定を行う
    err = MovieExportSetSettingsFromAtomContainer(movieExporter, exportSettings);
    if (err) goto bail;

    // エクスポートする
    err = ConvertMovieToFile(inMovie, NULL, inFile, 0, 0, fileScript, NULL, 0, movieExporter);

bail:
    if (movieExporter) CloseComponent(movieExporter);
    if (exportSettings) QTDisposeAtomContainer(exportSettings);

    return err;
}
                  

リスト 1 AVI へのエクスポート

参考文献:

Movie Data Exchange Documentation

ConvertMovieToFile API

Dispatch 6 - Finding Movie Export Components


[2002 年 6 月 18 日]