|
はじめにムービーエクスポータにあまり詳しくないデベロッパのために、ムービーエクスポートコンポーネント( エクスポートコンポーネントを見つけるには、Component Managerの エクスポートコンポーネントは、 指定したエクスポートコンポーネント( コンポーネントを コンポーネントを使い終わったら、必ず iPodエクスポートコンポーネント最初のiPodエクスポートコンポーネントは、QuickTime 7.0.3に同梱され、最大320×240のH.264ビデオをサポートしていました。QuickTime 7.1.3のリリース以降、iPodエクスポートコンポーネントは最大640×480のH.264ビデオへのエクスポートもサポートしています。 iPodエクスポートコンポーネントを見つけるには、表1に示すコンポーネント記述を使用します。 表1:iPodエクスポートコンポーネントのコンポーネント記述
機能の概要第5世代iPod(ファームウェア1.2以降)は、次の2つのプロファイル(表2および表3を参照)のいずれかを使ってエンコードされたH.264ビデオを含んだ.m4vファイルの再生をサポートしています。AAC-LCオーディオ付きの320×240 Baselineプロファイル(Level 1.3まで)とAAC-LCオーディオ付きの640×480 Baseline Low-Complexityプロファイルの2つです。 表2:Baseline Low-Complexity .m4vファイルタイプ
表3:Baseline(Level 1.3まで).m4vファイルタイプ
注:H.264標準には、プロファイルと呼ばれる機能の集合が含まれています。Baselineプロファイルのさまざまなレベルの詳細については「H.264 Profiles」を参照してください。 H.264 Baseline Low-Complexityプロファイルは、AppleがiPodのために定義しました。 iPodエクスポータを使ったエクスポート操作の出力結果を定義するのは、エクスポータに渡されるソースムービーのプロパティです。その中で最も重要なのは、 iPodエクスポートコンポーネントは、ソースムービーの画像サイズに応じて、Baseline Low-Complexityプロファイル.m4vファイル(表2を参照)か、もしくはBaselineプロファイル.m4vファイル(表3を参照)のどちらかを作成します。 iPod向けのエクスポートサポート機能を追加するデベロッパは、設定を行うためのエクスポートダイアログに特定の出力プロファイルオプションを表示することを考えるかもしれません。しかし、iPodエクスポートコンポーネントにはユーザやデベロッパによる設定が可能なオプションはない点に注意してください。 重要:iPodエクスポータコンポーネントフラグ 注:ムービーの表示境界領域を囲む矩形は、ムービーボックスと呼ばれます。QuickTimeは、 ムービーの構成とサイズは、選択したアパチャーモードに応じて異なることがあります。たとえば、「クリーンアパチャー」モードを選択した場合、4:3 DV NTSCトラックは640×480で表示され、16:9 DV NTSCトラックでは853×480で表示されます。表示されるムービーのサイズは、アパチャーモードに応じて異なるので、iPodエクスポータによる出力も異なる可能性があります。 ムービーサイズiPodエクスポートコンポーネントは、ソースムービーの画像サイズを調べて.mp4出力ファイルを作成するために使うプロファイルを決定します。 出力先ムービーの画像サイズとプロファイルは、表4が示すように決定されます。 表4:
フレームレート出力フレームレートは、ソースムービーのフレームレートによって決まります。適応フレームサンプリングを使用して上限は30 fpsです。 データレート出力先ムービーサイズは可変なため、目的のデータレートは出力先ムービーの有効画像サイズ(必要に応じて拡大縮小が行われた後のムービー画像サイズ)に基づいて計算されます。 出力データレートは次の通りです:
ムービーの画像サイズの比較は、ムービー画像中のマクロブロック数に基づいて行われます。 注:このコーデックは、最速データレートを2.6秒間で249600バイト以下に維持することも試みます。 コード例リスト1では、iPodエクスポートコンポーネントの1つの使用法を示し、320×240に収まるBaselineプロファイルの.m4vファイルを作成します。これは、エクスポートコンポーネントに渡す前に、入力ムービーのサイズに関係なく、ソースムービーボックスを適切に変更することで実現します。アプリケーションでは、正しいアスペクト比を維持しながら、より大きなソースメディアからBaselineプロファイルの.m4vファイルを明示的に作成するために、このような処理を実行することが考えられます。 リスト1に示すコードを使用して、16:9 DV NTSCの720×480のクリップをエクスポートした結果を図1(クリーンアパチャーモードを使用した場合)および図2(クラシックアパチャーモードを使用した場合)に示します。 図1:円が円形である
図2:円が円形でない
重要:表4に示すように、iPodエクスポートコンポーネントは、アスペクト比を維持しつつ、640×480よりも大きいムービー画像のみを適切なサイズに合わせるために縮小し、Baseline Low-Complexityプロファイルの.m4vを作成します。320×240未満のBaselineプロファイルの.m4vファイル、または320×240より大きい(ただし640×480以下の)Baseline Low-Complexityプロファイルを作成する場合は、アスペクト比を自身で修正する必要があります。 リスト2は、リスト1で呼び出しているユーティリティ関数を示します。 リスト1:iPodエクスポートコンポーネントの使用
// iPodエクスポートコンポーネントを使用したエクスポート
// この関数では、入力ムービーサイズに関係なく、320×240に収まるよう
// ムービーボックスを明示的に設定する。これは 16:9 DVメディアでわかりやすい
// 結果が出るので妥当なデモである。
OSStatus ExportiPodMovieToDesktop(Movie inMovie, Boolean inUseCleanApertureMode)
{
// iPodエクスポータ用のコンポーネント記述
ComponentDescription cd = { MovieExportType, // 'spit'型
'M4V ', // iPodエクスポートコンポーネント
kAppleManufacturer, // 'appl'
0, // 任意のフラグ
kAnyComponentFlagsMask };
Component aComponent = 0;
MovieExportComponent theExportComponent = 0;
Handle dataRef = NULL;
OSType dataRefType = 0;
OSType savedApertureMode = 0;
Rect savedMovieBox = { 0 };
OSStatus status = paramErr;
if (NULL == inMovie) return status;
// 出力ファイルのデータ参照を作成する
status = QTNewDataReferenceFromFullPathCFString(
CFSTR("/Volumes/MacOSX/Users/ed/Desktop/iPodMovie.m4v"),
kQTNativeDefaultPathStyle,
0,
&dataRef,
&dataRefType);
if (status) goto bail;
// アパチャーモードを「クリーン」に設定。これによってムービーボックスのサイズが変わる可能性がある。
// そのため、ほかの操作をする前に実行する
if (true == inUseCleanApertureMode) {
status = SetMovieCleanApertureMode(inMovie, &savedApertureMode);
if (status) goto bail;
}
// ムービーサイズに手を加えるため、元のムービーサイズを保存
GetMovieBox(inMovie, &savedMovieBox);
if (status = GetMoviesError()) goto bail;
// エクスポータを見つける。OpenADefaultComponentを使うこともできる
aComponent = FindNextComponent(aComponent, &cd);
if (0 == aComponent) { status = badComponentType; goto bail; };
// エクスポータを開く
status = OpenAComponent(aComponent, &theExportComponent);
if (status) goto bail;
// 望みの結果が生成されるように、ムービーボックスを設定するルーチンを
// 呼び出す(この場合、320×240までのBaseline)
SetExportMovieBox(inMovie, 320, 240);
// .m4vにエクスポート
status = MovieExportToDataRef(theExportComponent, // エクスポートコンポーネントインスタンス
dataRef, // 出力先データ参照
dataRefType, // 出力先データ参照タイプ
inMovie, // エクスポートするムービー
0, // 特定のトラックをエクスポートするか?
0, // 開始時間
GetMovieDuration(inMovie)); // 所要時間
// 保存したムービーボックスを復元
SetMovieBox(inMovie, &savedMovieBox);
bail:
// 元のアパチャーモードを復元
if (savedApertureMode) {
QTSetMovieProperty(inMovie,
kQTPropertyClass_Visual,
kQTVisualPropertyID_ApertureMode,
sizeof(savedApertureMode),
&savedApertureMode);
}
// データ参照ハンドルを使い終わったら破棄する
if (dataRef) DisposeHandle(dataRef);
// 完了したらコンポーネントを必ず閉じること
if (theExportComponent) CloseComponent(theExportComponent);
return status;
}
リスト2:リスト1で使用している関数群
// ムービーのアパチャーモードを「クリーン」に設定。このモードでは、
// 可能な場合、ビデオは正しいピクセルアスペクト比で表示され、
// クリーンアパチャーに合わせてトリミングされる
// たとえば、4:3 DVメディアは720×480ではなく、640×480で表示される
OSErr SetMovieCleanApertureMode(Movie inMovie, OSTypePtr outSavedApertureMode)
{
OSType mode = kQTApertureMode_CleanAperture;
Boolean hasApertureModeDimensions = false;
OSErr err;
// ムービーにアパチャーモードのサイズがあるか?
err = QTGetMovieProperty(inMovie,
kQTPropertyClass_Visual,
kQTVisualPropertyID_HasApertureModeDimensions,
sizeof(hasApertureModeDimensions),
&hasApertureModeDimensions,
NULL);
if (noErr == err) {
if (false == hasApertureModeDimensions) {
// ムービーを更新してアパチャーモードをサポートする
err = GenerateMovieApertureModeDimensions(inMovie);
}
if (noErr == err) {
// 元のモードを返す
err = QTGetMovieProperty(inMovie,
kQTPropertyClass_Visual,
kQTVisualPropertyID_ApertureMode,
sizeof(OSType),
outSavedApertureMode,
NULL);
if (noErr == err) {
// 希望のアスペクト比とクリーンアパチャーサイズになるように、ムービーの
// アパチャーモードプロパティを設定する
err = QTSetMovieProperty(inMovie,
kQTPropertyClass_Visual,
kQTVisualPropertyID_ApertureMode,
sizeof(mode),
&mode);
}
}
}
return err;
}
static void SetExportMovieBox(Movie inMovie, float inWantedWidth, float inWantedHeight)
{
Rect movieRect;
float movieRatio, wantedRatio;
float movieWidth, movieHeight;
float newWidth, newHeight;
// 現在のムービーボックスを取得
GetMovieBox(inMovie, &movieRect);
// ムービーボックスを正規化
MacOffsetRect(&movieRect, -movieRect.left, -movieRect.top);
// サイズを取得
movieWidth = movieRect.right;
movieHeight = movieRect.bottom;
// 簡単なサニティチェック。ムービーの幅が640または高さが480よりも大きい場合、
// 640×480より大きいサイズを要求しても意味がない。
// iPodエクスポータは、アスペクト比を維持しつつ、640×480に収まるようムービーを
// 縮小しようとする。したがって、余分な作業はしないこと
if ((movieWidth >= 640 && inWantedWidth >= 640) ||
(movieHeight >= 480 && inWantedHeight >= 480)) return;
/** アスペクト比を維持しつつ、希望の矩形にムービーが収まるよう新しい矩形を計算する */
movieRatio = movieWidth / movieHeight;
wantedRatio = inWantedWidth / inWantedHeight;
if (movieRatio > wantedRatio) {
newHeight = (inWantedWidth * movieHeight) / movieWidth;
newWidth = inWantedWidth;
} else {
newWidth = (inWantedHeight * movieWidth) / movieHeight;
newHeight = inWantedHeight;
}
// 新しいムービーボックスを設定
MacSetRect(&movieRect, 0, 0, newWidth, newHeight);
SetMovieBox(inMovie, &movieRect);
}
Apple TVエクスポートコンポーネントApple TVエクスポートコンポーネントは、QuickTime 7.1.5以降で利用可能で、B-FramesおよびAAC-LCエンコードされたステレオオーディオを使った1280×720 (720p)までのメインプロファイル(Level 3.1まで)のプログレッシブH.264ビデオをサポートしています。 Apple TVエクスポートコンポーネントを見つけるには、表5に示すコンポーネント記述を使用します。 表5:Apple TVエクスポートコンポーネントのコンポーネント記述
機能の概要Apple TVは、表6に示すように、1280×720(720p)までのB-Framesおよび最大サンプリングレート44.1kHzのAAC-LCステレオオーディオを使った、メインプロファイル(Level 3.1まで)のH.264プログレッシブビデオを24fpsで再生する能力を備えています。 表6:B-Framesを使ったメインプロファイルのプログレッシブ.m4vファイルタイプ
*最大は12 Mbpsまで変動。 **1280×720の最大フレームレートは24fps。 Apple TVエクスポータを使ったエクスポート操作の出力結果を定義するのは、コンポーネントに渡されるソースムービーのプロパティです。その中で最も重要なのは、 Apple TVエクスポートコンポーネントは、ソースムービーの画像サイズとフレームレートに応じて、適切なサイズとプロファイルレベルの.m4vファイルを作成します。 Apple TV向けのエクスポートサポート機能を追加するデベロッパは、設定を行うためのエクスポートダイアログに特定の出力オプションを表示することを考えるかもしれません。しかし、Apple TVエクスポートコンポーネントにはユーザやデベロッパによる設定が可能なオプションはない点に注意してください。 重要:Apple TVエクスポータコンポーネントフラグ ムービーサイズ表7に示すように、出力先ムービーの画像サイズは、ソースムービーの画像サイズのほかにソースムービーのフレームレートによって決まります。最大サイズは、24fpsで1280×720、30fpsで960×540です。 表7:
フレームレート出力先のフレームレートは、ソースムービーのフレームレートのほかにソースムービーの画像サイズによって決まります。エクスポータは、常にフレームレートを維持しようとします。そのため、ソースムービーのフレームレートが30以下の場合は変更を加えません(ただし、出力先のムービーの画像サイズを変更する場合もあります。たとえば、1280×720、29.97fpsソースムービーから作成される出力先のムービーは960×540、29.97fpsになります)。 データレートデータレートは、最大5 Mbps(5000 kbps)に制限されており、ソースに応じて変わります。データレートは、出力先ムービーの有効画像サイズ(必要に応じて縮小が行われた後のムービー画像サイズ)に基づきます。表8に示すとおり、サイズは定義されたムービーサイズとの間で線形に補間されます。 また、データレートは、エンコードされたムービーの中で最大12 Mbpsまで変動する可能性があります。 表8:
コード例リスト3に、Apple TVエクスポートコンポーネントを使用して、エクスポートの前にソースムービーを確実にクリーンアパチャーモードに設定する標準的な方法を示します。 リスト3:Apple TVエクスポートコンポーネントの使用
// ソースムービーが確実にクリーンアパチャーのサイズを使用するようにしてATVに単純にエクスポート
OSStatus ExportATVMovieToDesktop(Movie inMovie, Boolean inUseCleanApertureMode)
{
MovieExportComponent theExportComponent = 0;
Handle dataRef = NULL;;
OSType dataRefType = 0;
OSType savedApertureMode = kQTApertureMode_Classic;
OSStatus status = paramErr;
if (NULL == inMovie) return status;
// 出力ファイルのデータ参照を作成する
status = QTNewDataReferenceFromFullPathCFString(
CFSTR("/Volumes/MacOSX/Users/ed/Desktop/ATVMovie.m4v"),
kQTNativeDefaultPathStyle,
0,
&dataRef,
&dataRefType);
if (status) goto bail;
// ATVエクスポートコンポーネントを探し出して開く
status = OpenADefaultComponent(MovieExportType, 'M4VH', &theExportComponent);
if (status) goto bail;
// アパチャーモードを「クリーン」に設定。これによってムービーボックスのサイズが変わる可能性がある。
// そのため、ほかの操作をする前に実行する
if (true == inUseCleanApertureMode) {
status = SetMovieCleanApertureMode(inMovie, &savedApertureMode);
if (status) goto bail;
}
// .m4vにエクスポート
status = MovieExportToDataRef(theExportComponent, // エクスポートコンポーネントインスタンス
dataRef, // 出力先データ参照
dataRefType, // 出力先データ参照タイプ
inMovie, // エクスポートするムービー
0, // 特定のトラックをエクスポートするか?
0, // 開始時間
GetMovieDuration(inMovie)); // 所要時間
// 元のアパチャーモードを復元
if (true == inUseCleanApertureMode) {
QTSetMovieProperty(inMovie,
kQTPropertyClass_Visual,
kQTVisualPropertyID_ApertureMode,
sizeof(savedApertureMode),
&savedApertureMode);
}
bail:
// 完了したらコンポーネントを必ず閉じること
if (theExportComponent) CloseComponent(theExportComponent);
// データ参照ハンドルを使い終わったら破棄する
if (dataRef) DisposeHandle(dataRef);
return status;
}
参考資料ドキュメント改訂履歴
掲載日: 2007-03-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|