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;
}
|