ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
AVFoundationを使用したHDR動画の編集と再生
MacOS AppでHDRの編集と再生をサポートする方法および特定のハードウェア構成がHDRの再生に適しているかどうかを判断する方法を紹介します。内蔵コンポジターでAVMutableVideoCompositionを使用し、HDRコンテンツを簡単に編集する方法、Core Imageの内蔵イメージフィルターを使用して独自のAVMutableVideoCompositionを作成する方法、HDR編集を可能にするカスタムコンポジターの作成方法と使用方法について説明します。
リソース
関連ビデオ
Tech Talks
WWDC22
WWDC21
-
ダウンロード
こんにちは WWDCへようこそ “AVFoundationを使用した HDR動画の編集と再生” 私の名前はシュ・ガオです 今日は AVFoundationを使用した HDRビデオの編集と 再生についてお話しします Appleは 2~3年前にiOSへ そして昨年macOSに HDR再生を導入しました さらに今年は HDRのビデオ編集に 対応するためのHDRサポートを フレームワークに追加します こちらのセッションでは AVFoundationを用い このサポートの利点を活用する― 方法について解説します 初めにHDRと― 様々なビデオ編集ワークフローの ビデオについて簡単に説明します さらに それらでHDRを 利用する方法について話します また HDR編集を構成する際に 利用可能ないくつかの きめ細かな制御 主に 色特性についても解説します 最後にHDR再生について話します さて HDRとは何でしょう HDRはハイダイナミックレンジを表します HDRは 標準のダイナミックレンジでは 実現し得なかった領域まで ビデオのダイナミックレンジの 表現力を大幅に拡張します HDRにより 輝くような白 深みのある黒 より鮮やかなコントラストや 明暗がくっきりと際立った ディテールなど より鮮明な画像のビデオを 生成することができます 量的な意味で言えば― SDRビデオは最大100カンデラ毎平方メートル または100ニトが限界でした 一方 HDRビデオの輝度はその100倍 最大1万ニトまで達することができます
HDRは しばしば暗黙的にWide Colorと 組み合わせて用いられることがあります Wide Colorとハイダイナミックレンジを 組み合わせることで― 大量のカラーボリュームを 定義できます 言い換えれば SDRビデオでは 一度も 目にしたことがないような色も生成できます
より高い輝度と色範囲に適応するため HDRはより高いビット深度に― 関連付けられており 一般的な配布メディアの― ビット深度は10ビットとなっています
転送機能では シーンの直線光源が ビデオの非線形符号値に どのようにマッピングされ さらにディスプレイの照明設定に 戻されるかについて解説します HDRビデオには HLGまたはPQ 転送機能のいずれかが備わっています Appleはどちらのタイプの 転送機能もサポートします
HDRの詳細については― 今年のWWDCの HDR Exportセッションをご確認ください このHDRの上位概念では― ビデオの編集ワークフローについて レビューします 詳細について話す前に ビデオ編集に関する― 以前に行われたWWDCセッションに 触れておきたいと思います ビデオ編集に慣れていない方は― これらの動画をご視聴されることを 強くお勧めします これらの動画は ここで お話しする重要なクラスの― 基礎知識を理解するのに役立ちます ここに ビデオ編集の 共通ワークフローがあります 単一または複数のアセットから スタートして AVCompositionと― AVVideoCompositionを構築します これら2つのオブジェクトはともに ビデオ編集の芸術的意図を達成するための― アセットのトラックのスライス スプライス ポジショニングや― ブレンドを指示します AVCompositionはソーストラックの temporal alignmentを指示します AVVideoCompositionは 任意の時点での― トラックのジオメトリー変換と ブレンドを指示します これらの2つのオブジェクトを使用して AVPlayerItemを構築し さらにそこからAVPlayerを作成して 編集効果を再生することができます これはワークフローのプレビューパスです また AVCompositionと AVVideoCompositionを使用して AVAssetExportSessionを提供し ムービーファイルに編集結果を 書き込むこともできます
これは より低レベルのAPIを使用する 別のワークフローです これはエクスポートのみを行うワークフローです プレビューパスはありません 単一のアセットでスタートし AVAssetReaderを使用して アセットのサンプルを読み取ります 編集作業は― AVAssetReaderVideoComposition Outputオブジェクトに挿入されます このオブジェクトには 編集意図の詳細を指示する― AVVideoCompositionオブジェクトが 含まれています AVAssetReaderVideoComposition Outputオブジェクトから― 編集したフレームを抽出し それをAVAssetWriterに送信して ムービーファイルに書き込みます ここまで ビデオ編集ワークフローについて 話してきました 次は これらのワークフローでHDRを 利用可能にする方法を見てみましょう 先ほどお見せした それぞれのワークフローでは AVVideoCompositionが中心となっています 一部のワークフローでは AVComposition オブジェクトも必要ですが その役割は― トラックのtemporal alignmentの 指示だけであるため HDRとの― 依存関係はほとんどありません 一方 AVVideoCompositionは ブレンドや変換で使用する必要があるため HDR編集をサポートするためには HDRアウェアである必要があります
編集のプレビューを行う場合も システムがHDRビデオを 再生できるのが望ましいでしょう この点については このセッションの 終わりで取り上げます ビデオコンポジションを― エクスポートする場合も AVAssetExportSession または― AVAssetWriterで適切な設定を 確実に選択する必要があります 今年行われた別のセッションで HDRの― エクスポートについて理解しておく必要がある 詳細情報について解説しています
ディスプレイがHDRビデオを表示可能で エクスポート設定が― HDRをサポートするよう設定されているなら AVVideoCompositionについて― 詳しく調べながら HDRサポートを実現するために 何が必要かを確認しましょう AVVideoCompositionを 構築する方法は3つあります それらについて1つずつ解説します 1番目は AVMutableVideoCompositionを使用し ゼロから新たに構築する方法で 内蔵のCompositorを使用します
この方法はビデオの複数の レイヤをブレンドしたい場合や cropping スケーリング translationやローテーションなどの フレームレベルのジオメトリー変換を 適用したい場合に適しています 最も一般的なユースケースは 2つのビデオクリップの間で スワイプや― フェードイン フェードアウトなどの トランジションエフェクトを使用する場合です blurring color tintや ファンシーな 芸術的効果などのフィルタリング効果を 使用したい場合は この方法は あまり適切ではありません この方法でAVVideoCompositionを構築する コードスニペットを見てみましょう
空のAVMutableVideoCompositionから スタートして そこから構築を進めます videoComposition instructionには レイヤのブレンド または― 変換方法をcompositorに 正確に指示するための複雑な― パラメータ階層構造が含まれることに 注意してください それぞれが編集のタイムラインの 異なるセグメントをカバーする コンポジションインストラクションの アレイを指示することも可能です この例では アレイには1つの エレメントしかありません 複数の― ビデオコンポジションインストラクションを 実行する場合 それらの時間を― 重複させることはできませんし 間にギャップを入れることもできません ここでは時間の注意事項について 詳しい説明は行いません
customVideoCompositor Classフィールドは 未設定のままにしました これは コンポジションインストラクションの 実行に 内蔵compositorを使用することを― フレームワークに指示するためです ここまでHDRについては 何も触れていませんでした 実際に 既存のビデオ編集アプリケーションには これに類似したコードの― 一部が含まれています このAVVideoComposition HDRを 利用可能にするために 追加する必要があるコードについて 確認しましょう
何もありません Appleは フレームワーク 特に内蔵compositorで HDRのビデオフレームを 正しく扱えるようにすることに 力を注いできました 既存のビデオ編集アプリケーションで 内蔵compositorを使用し 何も変更せずに HDRビデオのフィードを開始しても おそらくHDRビデオは 同じコンポジションインストラクションが HDRソースに正しく適用された かのように出力されます
次に AVVideoCompositionを 構築する2番目の方法を見てみましょう それはAVMutableVideoComposition の構築に “applyingCIFiltersWithHandler”パラメータを 使用する方法です この方法は 単一レイヤの ビデオでフィルタリング効果を 適用しながら作業を行う場合に 適しています この方法では 複数のレイヤを ブレンドすることはできません コードを見てみましょう
AVMutableVideoCompositionクラスの 異なるコンストラクターを 使用していることが分かります コンポジションの適用対象のアセットと アセットの最初の― 有効なビデオトラックの フレームにCIFilterを適用 するハンドラーを渡しています
アセットの最初の有効なビデオトラックだけが フィルタリングされ― ビデオコンポジションから 出力されることに注意してください
ハンドラーが呼び出されると AVAsynchronousCIImageFilteringRequest オブジェクトが渡されます この要求オブジェクトを使用して 入力トラックの現在のフレームを フィルタリング効果を適用する― CIFilterへの送信に適したCIImageオブジェクト として取得することができます フィルタリングした出力イメージが 用意できると “request.finish”を呼び出して それを送信します
このビデオコンポジションの構築方法は AVVideoCompositionオブジェクトを構築する コンポジションインストラクションの― セットアップや 他の煩雑な作業から ユーザーを解放します それにより ソースイメージの― フィルタリング方法に意識を集中し 全ての労力を注ぎ込むことができます この例では sourceImageを内蔵の “CIZoomBlur”CIFilterに渡しています 内蔵CIFilterを複数連結して より複雑なフィルタリング効果を生成したり 自分のmetal CoreImageカーネルコードから 構築可能な専用のCIFilterを 適用することができます では このタイプのAVVideoCompositionを 利用して HDRをサポートするには― 何をすればいいでしょうか 答えは 前と同様 ほとんど 何もすることはありません ハンドラーがCoreImageの 内蔵CIFilterを呼び出したのであれば 全てのCIFilterが HDRソースを処理できます 考慮すべき唯一の点は ハンドラーに 自分のmetal CoreImageカーネルコードから― 構築された専用のCIFilterを 使用しているかどうかということです metal CoreImageカーネルコードでは HDRと共に導入される拡張ダイナミックレンジを 認識する必要があります いくつか例を見てみましょう これは 拡張ダイナミックレンジを認識している metal CoreImage カーネルコードの一部です このフィルターの意図は 通常の― ゼロから1までのダイナミックレンジを超えた 全てのピクセルを強調することにあります “r”“g”または“b”のいずれかの チャネルの強度が1を超えた場合 そのピクセルはultra brightレッドで ペイントされます お気づきの方がいるかもしれませんが この例ではCoreImageヘッダーを― 組み込んでいるため 構文は通常の metalコードと少し違っています このタイプのコードは“Metal CoreImage Kernel”と呼ばれています これについて詳しく知りたい方は 今年のWWDCの このセッションをご覧ください “Build Metal-Based Core Image kernels with Xcode” 既存のSDR metal CoreImageフィルターが HDRで ブレークダウンする例を示します これはカラーインバーターです SDRの世界では 最大の強度を1と想定し 各チャネルの強度を1から 差し引いています HDRフレームを使用した場合 結果的に 強度が負の値になる可能性があります 続いて AVVideoComposition作成の 3番目はカスタムcompositorを― 使用する方法で これは 最も柔軟性の高いやり方です ユーザーは複数の ビデオレイヤをブレンドし 各レイヤで― フレームレベルのジオメトリー変換を 行うことができ さらに― 各レイヤへのフィルタリング効果の適用を 制御することができます 柔軟性の高さゆえに ユーザーは自分で より多くの作業を行う必要があります 最初にカスタムcompositorクラスを 定義する必要があります フレームワークは そのクラスを使用して 実際のコンポジットジョブを行う― カスタムcompositorオブジェクトの ライフサイクルの作成と保守を行います
AVVideoCompositionオブジェクトの構築は 内蔵compositorのケースと同様に 空の― AVMutableVideoCompositionから スタートして構築を進めます 違いは videoCompositionの customVideoCompositorClassフィールドに 設定することにより カスタムcompositorのクラスを フレームワークに指示することです
このタイプのAVVideoCompositionで HDRを 利用可能にするためには何が必要でしょうか 前の2つのケースと異なり 行わなければならないことがあります 最初に明確なことは カスタム compositorで行う実際の作業では HDRが利用可能でなければ ならないということです 大部分のHDRソースは10ビットの ピクセルフォーマットを使用しています カスタムcompositorは それらを 処理できる必要があります ピクセル値を操作する場合 HDRソースが使用する拡張ダイナミックレンジを 認識する必要があります
ここまでが一通り完了した後 カスタムcompositorクラスで― さらにもう2つの設定を行って HDRで作業が行えるようになったことを フレームワークに知らせる必要があります 第一の設定は 入力と出力 の両方で10ビット以上の ビット深度のピクセルフォーマットを サポートしていることを示します 第二は カスタムcompositorが 入力としてHDRソースフレームを 受け入れ可能であることを示します コードを見てみましょう
このカスタムcompositorは HDRを サポートするよう適正に設定されています 最初に sourcePixelBufferAttributesと requiredPixelBufferAttributes― ForRenderContextの両方に 10ビットのピクセルフォーマットが― 含まれるように設定します 実際にサポートする フォーマットを入力します フレームワークは リストに示された ピクセルフォーマットの1つで ソースフレームを取得し サポート可能なフォーマットで 出力フレームのrenderコンテキストを作成します 必要であれば フォーマット変換を行います
次は supportsHDRSourceFramesフィールドです これは HDR用に導入された新しいフィールドです このフィールドにはtrueを設定して カスタムcompositorがHDRソースフレームを 受け入れるようにします このフィールドがないか または falseが設定されている場合 フレームワークはHDRフレームを 処理できないものと判断し 送信前に それらを 標準のダイナミックレンジに変換します 従って 実際にカスタムcompositorで HDRを処理するためには 必要な作業を 全て行った後で 忘れずにこのフィールドを 設定するようにしてください 概要説明で述べたように 通常 HDRビデオは Wide Colorで表示されます そのため カスタムcompositorがWide Colorを 処理できるようにしておく必要もあります 実際には フレームワークは HDRを処理可能であれば― Wide Colorも処理可能であると想定します ここでは 明確にtrueを設定しています
startRequestは コンポジションの 実際の作業を行う関数です 前にも述べたように 作業を行うためには HDRの拡張されたダイナミックレンジを 認識している必要があります 次に HDR対応のカスタムcompositorが 実際に動作しているデモを見てみましょう
ストリーミングリンクが HDRかどうかによっては このデモを― HDRで視聴できない可能性がありますが それでもビデオの編集効果は はっきり見えるはずです これは カスタムcompositorが カスタムCIFilterを使用して フィルタリング効果を付加して 生成したライブプレビューです
これは 前にお見せしたmetal CoreImage カーネルコードを強調するよう― アップグレードしたバージョンのHDRです ここでは HDRリージョンを1色で塗りつぶす のではなく rolling stripeを使用しています 明るい縞模様が見えるということは ソースビデオが実際にHDRであることの証拠です サンプルコードをダウンロードして 新しいmacOSで実行すると― ultra brightレッドの縞模様で ハイダイナミックレンジを体験できます
ここまでは ビデオ編集のために AVVideoCompositionを― 構築する様々な方法と それらでHDRサポートを― 利用する方法について話しました 次は HDRを利用可能にした後に HDR動作のいくつかの局面を― 制御する方法において 主に― ビデオコンポジションのカラープロパティの 制御について話を進めましょう HDRサポートに必要な 最低限の処理だけを行い 他はデフォルトのままにしておいた場合 ビデオコンポジションに 様々なタイプのビデオを取り込むと どうなるでしょうか この表は 異なる入力を混成した場合の ビデオコンポジションの― 出力フォーマットを示したものです Appleは 転送機能に応じて分類された HLGとPQの2種類の― HDRビデオをサポートしています 従って 利用可能な入力のタイプは HLG PQ SDRの3種類となります コンポジションのカラープロパティを 指示しない場合 フレームワークは ポリシーに従い HLG PQ SDRの順に 入力タイプを選択します この表は ポリシーが2つのビデオ入力に どのように対応するかを示したものです 多重入力への拡張は容易です この対応を変更するには― AVVideoCompositionオブジェクトで ビデオコンポジションの― カラープロパティを指示します すなわち colorPrimaries colorTransferFunctionと― colorYCbCrMatrixフィールドです この3つのフィールドに HLG転送機能を使用する カラープロパティを設定すれば― コンポジションの出力は 入力ビデオフォーマットに関係なく 常にHLGになります 同様に PQまたはSDRのプロパティを 設定することもできます 内部的には 内蔵compositorと カスタムcompositorの― どちらかに関係なく compositorに 送信する前に フレームワークは― 入力ソースフレームを指定された カラープロパティに変換します このセッションで前に述べたように 内蔵compositorを使用する― 既存のビデオ編集アプリケーションを 使用している場合 HDRソースの― フィードを開始すると おそらくは コードを変更しなくても HDR出力を取得できます “おそらく”と言ったのには ワケがあります アプリケーションがAVVideoCompositionで これらのカラープロパティを― 明確に指示しない場合 内蔵compositorのデフォルト動作では HDRビデオが生成されます 一方 アプリケーションが これらのプロパティを― 明確にSDR色空間に設定した場合 内蔵compositorは その設定を尊重し コンポジットを行う前に HDRソースをSDRに変換します 実際に必要になるであろうシナリオを 紹介しましょう 例えば 編集したHDRビデオを eメールに添付したいけれども 受信先のシステムがHDRビデオ再生に 対応していないことが分かっているとします このような場合には 編集したビデオの SDRバージョンを生成することになります これらのカラープロパティの 標準的な値を見てみましょう この表は ユーザーが設定可能な― ビデオコンポジションのカラープロパティの 値の例を示したものです コンポジションをHLGで作成したい場合は colorTransferFunctionに “HLG”を設定します コンポジションをPQで生成したい場合は colorTransferFunctionに “PQ”を設定します
HLGとPQのいずれについても 通常 colorPrimaries とYCbCrMatrixには Wide Colorに関連する ITU_R_2020を設定します
ここまではビデオコンポジションについて 話しました ここからは 再生の過程について話します 前に触れたように 編集したものを再生するには― このようなパイプラインを構築します AVCompositionと― AVVideoCompositionから AVPlayerItemを構築した後 他の再生でもそうしてきたように そのAVPlayerItemを― 再生するAVPlayerを作成します 特別なことは何もありません HDRビデオコンポジションは HDRで表示されるものと考えてはいませんか? いつもそうであるとは限りません システムが HDRを再生可能であることを 確認する必要があります それは当然のことですが システムが 再生可能かどうかはどうすれば分かるでしょうか このような時には eligibleForHDRPlayback APIが役に立ちます
HDR再生をサポートするプラットフォームを 覚えておく代わりに AVPlayerクラスの― eligibleForHDRPlaybackフィールドで 照会することで 求める答えが得られます これはvarのクラスなので 照会にAVPlayerインスタンスは 必要ありません プロパティが“true”であれば― 第一に システムは HDRビデオの視聴に対応しており 第二に 内蔵または外付けの 少なくとも1つのディスプレイが― HDRビデオの表示に 対応していることを意味します なお watchOSとmacOS Catalystでは― HDR再生が利用できないことを お伝えしておきます HDR再生に適合しているかどうかに基づいて ビデオコンポジションのカラープロパティを 設定するコードの例を示します システムがHDRを再生できない場合 HDRでコンポジションを作成することに 処理能力を費やすのは無駄なので カラープロパティをSDRに設定します このフィールドは再生のみに関する ステートメントであることに注意してください システムがHDRを再生できないからといって HDRのエクスポートも― できないとは限りません コンポジションのカラープロパティの エクスポートパスをHDRに― 設定することは可能です HDRエクスポートをサポートしている プラットフォームに関する情報は― 今年のWWDCの“HDR Export”関連セッションを ご確認ください “Export HDR media in your app with AV Foundation” 今日お話ししたことを まとめてみます 第一に HDRビデオ編集が 利用可能になりました これまではHDR作品を 受け取る側でしたが これからは― ユーザーが製作する側に立つことを 支援できます ユーザーは HDRビデオ編集を通して HDRで自分の創造性を 示すことができるようになります 次に ビデオ編集ワークフローのレビューを通し AVVideoCompositionが ビデオ編集の― 中心に位置していることが 理解できました 内蔵のcompositorを使用 または applyingCIFiltersWithHandlerと 内蔵のCIFilterを使用して― AVVideoCompositionを作成する場合 HDRを利用可能にするための 追加作業を行う必要がない という利点があります
カスタムcompositorを使用する場合 いくつか追加の作業が必要であり 10ビット以上のピクセルフォーマットを サポートしていること HDRとWide Colorのソースフレームを サポートしていること そして実際に行う作業がHDR対応であることを 指示する必要があります さらに デフォルト設定のままで コンポジションのカラープロパティと デフォルト動作を 制御する方法について話しました 最後に システムがHDR再生を サポートしているかの確認に使用できる eligibleForHDRPlayback API について話しました このセッションをご視聴いただき ありがとうございました 引き続き WWDCをお楽しみください 皆さんのHDR対応ビデオ編集アプリケーションを 楽しみにしています
-
-
6:43 - Create AVVideoComposition with custom compositor class
// Create AVVideoComposition with custom compositor class let videoComposition = AVMutableVideoComposition() videoComposition.instructions = [videoCompositionInstruction] videoComposition.frameDuration = CMTimeMake(value: 1, timescale: 30) videoComposition.renderSize = assetSize
-
9:55 - Create AVVideoComposition using “applyingCIFiltersWithHandler”
// Create AVVideoComposition using “applyingCIFiltersWithHandler” let videoComposition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: { (request: AVAsynchronousCIImageFilteringRequest) -> Void in let ciFilter = CIFilter(name: “CIZoomBlur”) ciFilter!.setValue(request.sourceImage, forKey: kCIInputImageKey) request.finish(with: ciFilter!.outputImage!, context: nil) })
-
10:57 - First CIKernel
// HDRHighlight.metal #include <metal_stdlib> #include <CoreImage/CoreImage.h> using namespace metal; extern “C” float4 HDRHighlight(coreimage::sample_t s, coreimage::destination dest) { if (s.r > 1.0 || s.g > 1.0 || s.b > 1.0) return float4(2.0, 0.0, 0.0, 1.0); else return s; }
-
11:22 - Color Inverter CI Kernel
// ColorInverter.metal - not HDR ready #include <metal_stdlib> #include <CoreImage/CoreImage.h> using namespace metal; extern “C” float4 ColorInverter(coreimage::sample_t s, coreimage::destination dest) { return float4(1.0 - s.r, 1.0 - s.g, 1.0 - s.b, 1.0); }
-
12:23 - Custom compositor class
// Custom compositor class class SampleCustomCompositor: NSObject, AVVideoCompositing { … } // Create AVVideoComposition with custom compositor class let videoComposition = AVMutableVideoComposition() videoComposition.instructions = [videoCompositionInstruction] videoComposition.frameDuration = CMTimeMake(value: 1, timescale: 30) videoComposition.renderSize = assetSize videoComposition.customVideoCompositorClass = SampleCustomCompositor.self
-
13:58 - Setting custom compositor to support HDR
// Setting custom compositor to support HDR class SampleCustomCompositor: NSObject, AVVideoCompositing { var sourcePixelBufferAttributes: [String : Any]? = [kCVPixelBufferPixelFormatTypeKey as String: [kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange]] var requiredPixelBufferAttributesForRenderContext: [String : Any] = [kCVPixelBufferPixelFormatTypeKey as String: [kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange]] var supportsHDRSourceFrames = true var supportsWideColorSourceFrames = true func startRequest(_ request: AVAsynchronousVideoCompositionRequest) { ... } func renderContextChanged(_ newRenderContext: AVVideoCompositionRenderContext) { } }
-
21:01 - AVPlayer API definition
// API definition extension AVPlayer { @available(macOS 10.15, *) open class var eligibleForHDRPlayback: Bool { get } }
-
21:41 - AVPlayer API definition 2
// API definition extension AVPlayer { @available(macOS 10.15, *) open class var eligibleForHDRPlayback: Bool { get } } // Set video composition color properties based on HDR playback eligibility if AVPlayer.eligibleForHDRPlayback { videoComposition.colorPrimaries = AVVideoColorPrimaries_ITU_R_2020 videoComposition.colorTransferFunction = AVVideoTransferFunction_ITU_R_2100_HLG videoComposition.colorYCbCrMatrix = AVVideoYCbCrMatrix_ITU_R_2020 } else { videoComposition.colorPrimaries = AVVideoColorPrimaries_ITU_R_709_2 videoComposition.colorTransferFunction = AVVideoTransferFunction_ITU_R_709_2 videoComposition.colorYCbCrMatrix = AVVideoYCbCrMatrix_ITU_R_709_2 }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。