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

iPodとApple TV向けにムービーをエクスポートする

QuickTimeではバージョン7.0.3以降、iPodエクスポートコンポーネントを使用して、iPodで再生可能な.m4vファイルをエクスポートできるようになっています。QuickTime 7.1.5では、特にApple TV向けのエクスポートをサポートするApple TVエクスポートコンポーネントが導入されました。このテクニカルノートでは、各デバイスで再生可能な.m4vファイルを作成する2つのエクスポートコンポーネントの使用について説明します。





はじめに

ムービーエクスポータにあまり詳しくないデベロッパのために、ムービーエクスポートコンポーネント(MovieExportTypeもしくはその4文字コードにちなんで'spit')とは、ほかのアプリケーションやデバイスでメディアデータを使用できるように、ムービーをほかの形式に変換するコンポーネントです。たとえば、iPodのムービーエクスポートコンポーネントを使用すると、QuickTimeムービーのビデオやオーディオのメディアデータをアプリケーションで取り出し、Video iPodでの表示に適した.m4vファイルに格納されるH.264/AAC-LCデータとしてエクスポートできます。

エクスポートコンポーネントを見つけるには、Component ManagerのFindNextComponent APIを使用します。探しているコンポーネントの特性は、コンポーネント記述レコード(ComponentDescription)に記述されており、componentTypeフィールド、componentSubTypeフィールド、componentManufacturerフィールド、componentFlagsフィールドとして指定されています。

エクスポートコンポーネントは、componentSubType値を使用して、サポートしているデータの種類を示し、componentFlagsフィールドを使用して、コンポーネントの機能についてより詳細な情報を示します。

指定したエクスポートコンポーネント(Component)を見つけたら、そのコンポーネントを開くにはOpenAComponentを呼び出す必要があります。OpenAComponentからは、コンポーネントのインスタンス(ComponentInstance)が返されます。返されたインスタンスは、MovieExportToDataRefConvertMovieToDataRefなどのエクスポートAPIで使用できます。

コンポーネントをcomponentTypeフィールドとcomponentSubTypeフィールドのみを使用して記述できる場合には、OpenADefaultComponent簡易APIを使用してコンポーネントを検索して開くこともできます。

コンポーネントを使い終わったら、必ずCloseComponentを呼び出して、開いたコンポーネントをすべて閉じるようにします。

先頭に戻る

iPodエクスポートコンポーネント

最初のiPodエクスポートコンポーネントは、QuickTime 7.0.3に同梱され、最大320×240のH.264ビデオをサポートしていました。QuickTime 7.1.3のリリース以降、iPodエクスポートコンポーネントは最大640×480のH.264ビデオへのエクスポートもサポートしています。

iPodエクスポートコンポーネントを見つけるには、表1に示すコンポーネント記述を使用します。

表1:iPodエクスポートコンポーネントのコンポーネント記述

コンポーネント記述iPodエクスポータ
componentTypeMovieExportType
componentSubType'M4V '
componentManufacturerkAppleManufacturer
componentFlags0
componentFlagsMaskkAnyComponentFlagsMask

機能の概要

第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ファイルタイプ

メディアコーデック最大ビットレート速度最大サイズ/チャネルプロファイル
ビデオH.2641.5 Mbps30 fps640×480Baseline Low-Complexity
オーディオAAC-LC160 Kbps48 kHzステレオ、2

表3:Baseline(Level 1.3まで).m4vファイルタイプ

メディアコーデック最大ビットレート速度最大サイズ/チャネルプロファイル
ビデオH.264768 Kbps30 fps320×240Baseline(Level 1.3まで)
オーディオAAC-LC160 Kbps48 kHzステレオ、2

注:H.264標準には、プロファイルと呼ばれる機能の集合が含まれています。Baselineプロファイルのさまざまなレベルの詳細については「H.264 Profiles」を参照してください。

H.264 Baseline Low-Complexityプロファイルは、AppleがiPodのために定義しました。

iPodエクスポータを使ったエクスポート操作の出力結果を定義するのは、エクスポータに渡されるソースムービーのプロパティです。その中で最も重要なのは、GetMovieBox APIまたはQTMovie -attributeForKey:メソッドがQTMovieCurrentSizeAttributeキーを使用して返すムービーサイズです。

iPodエクスポートコンポーネントは、ソースムービーの画像サイズに応じて、Baseline Low-Complexityプロファイル.m4vファイル(表2を参照)か、もしくはBaselineプロファイル.m4vファイル(表3を参照)のどちらかを作成します。

iPod向けのエクスポートサポート機能を追加するデベロッパは、設定を行うためのエクスポートダイアログに特定の出力プロファイルオプションを表示することを考えるかもしれません。しかし、iPodエクスポートコンポーネントにはユーザやデベロッパによる設定が可能なオプションはない点に注意してください。

重要:iPodエクスポータコンポーネントフラグhasMovieExportUserInterfaceはクリアされています。これは、コンポーネントがユーザインターフェイスを提供しないことを示します。

注:ムービーの表示境界領域を囲む矩形は、ムービーボックスと呼ばれます。QuickTimeは、SetMovieBox APIを備えており、それを使ってディスプレイの座標系に合わせてムービーのサイズを設定し配置できます。QuickTimeが、要求に応えてムービー変換行列を自動的に調整します。ムービーボックスは、ムービー変換行列を直接、調整して変更することもできます。

ムービーの構成とサイズは、選択したアパチャーモードに応じて異なることがあります。たとえば、「クリーンアパチャー」モードを選択した場合、4:3 DV NTSCトラックは640×480で表示され、16:9 DV NTSCトラックでは853×480で表示されます。表示されるムービーのサイズは、アパチャーモードに応じて異なるので、iPodエクスポータによる出力も異なる可能性があります。

先頭に戻る

ムービーサイズ

iPodエクスポートコンポーネントは、ソースムービーの画像サイズを調べて.mp4出力ファイルを作成するために使うプロファイルを決定します。

出力先ムービーの画像サイズとプロファイルは、表4が示すように決定されます。

表4:

ソースムービーサイズ出力先ムービーサイズ出力先ムービープロファイル
320×240以下(≦320×240)ソースと同じBaselineプロファイルLevel 1.3まで
320×240よりも大きく640×480以下(>320×240 ≦ 640×480)ソースと同じBaseline Low-Complexity
640×480よりも大きい(>640×480)アスペクト比を維持して640×480以内に収まるようサイズ調整Baseline Low-Complexity

先頭に戻る

フレームレート

出力フレームレートは、ソースムービーのフレームレートによって決まります。適応フレームサンプリングを使用して上限は30 fpsです。

先頭に戻る

データレート

出力先ムービーサイズは可変なため、目的のデータレートは出力先ムービーの有効画像サイズ(必要に応じて拡大縮小が行われた後のムービー画像サイズ)に基づいて計算されます。

出力データレートは次の通りです:

  • ムービーの有効画像サイズがQVGA(320×240)以下の場合、データレートは700 kbpsです。

  • ムービーの有効画像サイズがHVGA(640×240)よりも大きい場合、データレートは1.5 Mbps(1500 kbps)です。

  • ムービーの有効画像サイズが上記の2つの間の場合、データレートは「DR = { (nMC * 8 ) / 3 } - 100」という式を用いてその2つの値の間で補間されます。ここでDRはデータレート(kbps)、nMCは画像中のマクロブロックの数です。

ムービーの画像サイズの比較は、ムービー画像中のマクロブロック数に基づいて行われます。

注:このコーデックは、最速データレートを2.6秒間で249600バイト以下に維持することも試みます。

先頭に戻る

コード例

リスト1では、iPodエクスポートコンポーネントの1つの使用法を示し、320×240に収まるBaselineプロファイルの.m4vファイルを作成します。これは、エクスポートコンポーネントに渡す前に、入力ムービーのサイズに関係なく、ソースムービーボックスを適切に変更することで実現します。アプリケーションでは、正しいアスペクト比を維持しながら、より大きなソースメディアからBaselineプロファイルの.m4vファイルを明示的に作成するために、このような処理を実行することが考えられます。

リスト1に示すコードを使用して、16:9 DV NTSCの720×480のクリップをエクスポートした結果を図1(クリーンアパチャーモードを使用した場合)および図2(クラシックアパチャーモードを使用した場合)に示します。

図1:円が円形である

図1 円が円形である

GetMovieBoxは、853×480を返しますが、希望のサイズ320×180に設定します。

図2:円が円形でない

図2 円が円形でない

GetMovieBoxは、720×480を返しますが、希望のサイズ320×213に設定します。

重要:表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エクスポートコンポーネントのコンポーネント記述

コンポーネント記述iPodエクスポータ
componentTypeMovieExportType
componentSubType'M4VH'
componentManufacturerkAppleManufacturer
componentFlags0
componentFlagsMaskkAnyComponentFlagsMask

機能の概要

Apple TVは、表6に示すように、1280×720(720p)までのB-Framesおよび最大サンプリングレート44.1kHzのAAC-LCステレオオーディオを使った、メインプロファイル(Level 3.1まで)のH.264プログレッシブビデオを24fpsで再生する能力を備えています。

表6:B-Framesを使ったメインプロファイルのプログレッシブ.m4vファイルタイプ

メディアコーデック最大ビットレート速度最大サイズ/チャネルプロファイル最大プロファイルレベル
ビデオH.2645 Mbps*30 fps**1280×720B-Framesを使ったプログレッシブメインプロファイル3.1
オーディオAAC-LC128 Kbps44.1 kHzステレオ、2 
*最大は12 Mbpsまで変動。
**1280×720の最大フレームレートは24fps。

Apple TVエクスポータを使ったエクスポート操作の出力結果を定義するのは、コンポーネントに渡されるソースムービーのプロパティです。その中で最も重要なのは、GetMovieBox APIまたはQTMovie -attributeForKey:メソッドがQTMovieCurrentSizeAttributeキーを使用して返すムービーサイズです。

Apple TVエクスポートコンポーネントは、ソースムービーの画像サイズとフレームレートに応じて、適切なサイズとプロファイルレベルの.m4vファイルを作成します。

Apple TV向けのエクスポートサポート機能を追加するデベロッパは、設定を行うためのエクスポートダイアログに特定の出力オプションを表示することを考えるかもしれません。しかし、Apple TVエクスポートコンポーネントにはユーザやデベロッパによる設定が可能なオプションはない点に注意してください。

重要:Apple TVエクスポータコンポーネントフラグhasMovieExportUserInterfaceはクリアされています。これは、コンポーネントがユーザインターフェイスを提供しないことを示します。

先頭に戻る

ムービーサイズ

表7に示すように、出力先ムービーの画像サイズは、ソースムービーの画像サイズのほかにソースムービーのフレームレートによって決まります。最大サイズは、24fpsで1280×720、30fpsで960×540です。

表7:

ソースフレームレートソースサイズが960×540以下(≦960×540)ソースサイズが1280×720以下(≦1280×720)ソースサイズが1280x720より大きい(>1280×720)
25fpsより小さい(<25)出力先のサイズはソースと同じ出力先のサイズはソースと同じ出力先のサイズはアスペクト比を維持しつつ、1280x720以下に収まるよう縮小
25fps以上(≧25)出力先のサイズはソースと同じ出力先のサイズはアスペクト比を維持しつつ、960×540以下に収まるよう縮小出力先のサイズはアスペクト比を維持しつつ、960×540以下に収まるよう縮小

先頭に戻る

フレームレート

出力先のフレームレートは、ソースムービーのフレームレートのほかにソースムービーの画像サイズによって決まります。エクスポータは、常にフレームレートを維持しようとします。そのため、ソースムービーのフレームレートが30以下の場合は変更を加えません(ただし、出力先のムービーの画像サイズを変更する場合もあります。たとえば、1280×720、29.97fpsソースムービーから作成される出力先のムービーは960×540、29.97fpsになります)。

先頭に戻る

データレート

データレートは、最大5 Mbps(5000 kbps)に制限されており、ソースに応じて変わります。データレートは、出力先ムービーの有効画像サイズ(必要に応じて縮小が行われた後のムービー画像サイズ)に基づきます。表8に示すとおり、サイズは定義されたムービーサイズとの間で線形に補間されます。

また、データレートは、エンコードされたムービーの中で最大12 Mbpsまで変動する可能性があります。

表8:

出力先ムービーサイズ出力先ムービーの最大データレート
320×240以下(≦320×240)768 kbps
320×240より大きく848×480以下(>320×240 ≦ 848×480)3000 kbps
848×480より大きく1280×720以下(>848×480 ≦ 1280×720)5000 kbps

先頭に戻る

コード例

リスト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初版

掲載日: 2007-03-21




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.