動画最適化
このページでは、Next.jsアプリケーションで動画を使用する方法について説明します。パフォーマンスに影響を与えずに動画ファイルを保存・表示する方法を紹介します。
<video>
と<iframe>
の使用
動画は、直接的な動画ファイルにはHTMLの**<video>
タグを、外部プラットフォームでホストされた動画には<iframe>
**タグを使用してページに埋め込むことができます。
<video>
HTMLの<video>
タグは、自己ホスト型または直接配信される動画コンテンツを埋め込むことができ、再生や外観を完全に制御できます。
export function Video() {
return (
<video width="320" height="240" controls preload="none">
<source src="/path/to/video.mp4" type="video/mp4" />
<track
src="/path/to/captions.vtt"
kind="subtitles"
srcLang="en"
label="English"
/>
お使いのブラウザはvideoタグをサポートしていません。
</video>
)
}
一般的な<video>
タグの属性
属性 | 説明 | 例 |
---|---|---|
src | 動画ファイルのソースを指定します。 | <video src="/path/to/video.mp4" /> |
width | 動画プレーヤーの幅を設定します。 | <video width="320" /> |
height | 動画プレーヤーの高さを設定します。 | <video height="240" /> |
controls | 指定すると、デフォルトの再生コントロールが表示されます。 | <video controls /> |
autoPlay | ページ読み込み時に動画を自動再生します。注意: 自動再生ポリシーはブラウザによって異なります。 | <video autoPlay /> |
loop | 動画再生をループします。 | <video loop /> |
muted | デフォルトで音声をミュートします。autoPlay と併用されることが多いです。 | <video muted /> |
preload | 動画のプリロード方法を指定します。値: none , metadata , auto 。 | <video preload="none" /> |
playsInline | iOSデバイスでインライン再生を有効にします。iOS Safariで自動再生を機能させるためによく必要です。 | <video playsInline /> |
知っておくと便利:
autoPlay
属性を使用する場合、ほとんどのブラウザで動画が自動再生されるようにmuted
属性を含めることが重要です。また、iOSデバイスとの互換性のためにplaysInline
属性も含めると良いでしょう。
動画属性の完全なリストについては、MDNドキュメントを参照してください。
動画のベストプラクティス
- フォールバックコンテンツ:
<video>
タグを使用する際は、動画再生をサポートしていないブラウザのためにタグ内にフォールバックコンテンツを含めてください。 - 字幕またはキャプション: 聴覚障害のあるユーザーのために字幕やキャプションを含めてください。
<video>
要素と共に<track>
タグを使用してキャプションファイルのソースを指定します。 - アクセシブルなコントロール: キーボードナビゲーションとスクリーンリーダーの互換性のために、標準のHTML5動画コントロールが推奨されます。高度なニーズがある場合は、react-playerやvideo.jsなどのサードパーティプレーヤーを検討してください。これらはアクセシブルなコントロールと一貫したブラウザ体験を提供します。
<iframe>
HTMLの<iframe>
タグを使用すると、YouTubeやVimeoなどの外部プラットフォームから動画を埋め込むことができます。
export default function Page() {
return (
<iframe
src="https://www.youtube.com/watch?v=gfU1iZnjRZM"
frameborder="0"
allowfullscreen
/>
)
}
一般的な<iframe>
タグの属性
属性 | 説明 | 例 |
---|---|---|
src | 埋め込むページのURL。 | <iframe src="https://example.com" /> |
width | iframeの幅を設定します。 | <iframe width="500" /> |
height | iframeの高さを設定します。 | <iframe height="300" /> |
frameborder | iframeの周囲に境界線を表示するかどうかを指定します。 | <iframe frameborder="0" /> |
allowfullscreen | iframeコンテンツをフルスクリーンモードで表示できるようにします。 | <iframe allowfullscreen /> |
sandbox | iframe内のコンテンツに追加の制限を適用します。 | <iframe sandbox /> |
loading | 読み込み動作を最適化します(例: 遅延読み込み)。 | <iframe loading="lazy" /> |
title | アクセシビリティをサポートするためにiframeにタイトルを提供します。 | <iframe title="説明" /> |
iframe属性の完全なリストについては、MDNドキュメントを参照してください。
動画埋め込み方法の選択
Next.jsアプリケーションに動画を埋め込む方法は2つあります:
- 自己ホスト型または直接の動画ファイル: プレーヤーの機能や外観を詳細に制御する必要があるシナリオでは、
<video>
タグを使用して自己ホスト型動画を埋め込みます。Next.js内でのこの統合方法により、動画コンテンツのカスタマイズと制御が可能になります。 - 動画ホスティングサービス(YouTube、Vimeoなど)の使用: YouTubeやVimeoなどの動画ホスティングサービスの場合は、
<iframe>
タグを使用してiframeベースのプレーヤーを埋め込みます。この方法ではプレーヤーの一部の制御が制限されますが、これらのプラットフォームが提供する使いやすさと機能を利用できます。
アプリケーションの要件と提供したいユーザーエクスペリエンスに合わせて埋め込み方法を選択してください。
外部ホスト動画の埋め込み
外部プラットフォームからの動画を埋め込むには、Next.jsを使用して動画情報を取得し、React Suspenseを使用して読み込み中のフォールバック状態を処理できます。
1. 動画埋め込み用のサーバーコンポーネントを作成
最初のステップは、動画を埋め込むための適切なiframeを生成するサーバーコンポーネントを作成することです。このコンポーネントは動画のソースURLを取得し、iframeをレンダリングします。
export default async function VideoComponent() {
const src = await getVideoSrc()
return <iframe src={src} frameborder="0" allowfullscreen />
}
2. React Suspenseを使用して動画コンポーネントをストリーミング
動画を埋め込むサーバーコンポーネントを作成した後、次のステップはReact Suspenseを使用してコンポーネントをストリーミングすることです。
import { Suspense } from 'react'
import VideoComponent from '../ui/VideoComponent.jsx'
export default function Page() {
return (
<section>
<Suspense fallback={<p>動画を読み込んでいます...</p>}>
<VideoComponent />
</Suspense>
{/* ページの他のコンテンツ */}
</section>
)
}
知っておくと便利: 外部プラットフォームから動画を埋め込む際は、以下のベストプラクティスを考慮してください:
- 動画埋め込みがレスポンシブであることを確認してください。CSSを使用してiframeや動画プレーヤーが異なる画面サイズに適応するようにします。
- 特にデータプランが限られているユーザーのために、ネットワーク条件に基づいて動画を読み込む戦略を実装します。
このアプローチにより、ページがブロックされず、動画コンポーネントがストリーミングされている間もユーザーがページを操作できるため、より良いユーザーエクスペリエンスが得られます。
より魅力的で情報量の多い読み込み体験を得るためには、単純な読み込みメッセージではなく、動画プレーヤーに似たスケルトンをフォールバックUIとして表示することを検討してください:
import { Suspense } from 'react'
import VideoComponent from '../ui/VideoComponent.jsx'
import VideoSkeleton from '../ui/VideoSkeleton.jsx'
export default function Page() {
return (
<section>
<Suspense fallback={<VideoSkeleton />}>
<VideoComponent />
</Suspense>
{/* ページの他のコンテンツ */}
</section>
)
}
自己ホスト型動画
動画を自己ホストするのは、いくつかの理由で望ましい場合があります:
- 完全な制御と独立性: 自己ホストにより、再生から外観まで動画コンテンツを直接管理でき、外部プラットフォームの制約から解放された完全な所有権と制御が可能です。
- 特定のニーズに合わせたカスタマイズ: 動的な背景動画などの独自の要件に理想的で、デザインや機能的なニーズに合わせたカスタマイズが可能です。
- パフォーマンスとスケーラビリティの考慮: 増加するトラフィックとコンテンツサイズを効果的にサポートするために、高性能でスケーラブルなストレージソリューションを選択します。
- コストと統合: Next.jsフレームワークやより広範な技術エコシステムへの容易な統合の必要性と、ストレージと帯域幅のコストをバランスさせます。
Vercel Blobを使用した動画ホスティング
Vercel Blobは、動画をホストする効率的な方法を提供し、Next.jsとよく連携するスケーラブルなクラウドストレージソリューションです。Vercel Blobを使用して動画をホストする方法は次のとおりです:
1. Vercel Blobへの動画アップロード
Vercelダッシュボードで「Storage」タブに移動し、Vercel Blobストアを選択します。Blobテーブルの右上隅にある「Upload」ボタンを探してクリックします。次に、アップロードしたい動画ファイルを選択します。アップロードが完了すると、動画ファイルがBlobテーブルに表示されます。
または、サーバーアクションを使用して動画をアップロードすることもできます。詳細な手順については、Vercelのサーバーサイドアップロードに関するドキュメントを参照してください。Vercelはクライアントサイドアップロードもサポートしています。この方法は特定のユースケースで好ましい場合があります。
2. Next.jsで動画を表示
動画がアップロードされ保存されたら、Next.jsアプリケーションで表示できます。以下は、<video>
タグとReact Suspenseを使用してこれを行う方法の例です:
import { Suspense } from 'react'
import { list } from '@vercel/blob'
export default function Page() {
return (
<Suspense fallback={<p>動画を読み込んでいます...</p>}>
<VideoComponent fileName="my-video.mp4" />
</Suspense>
)
}
async function VideoComponent({ fileName }) {
const { blobs } = await list({
prefix: fileName,
limit: 1,
})
const { url } = blobs[0]
return (
<video controls preload="none" aria-label="動画プレーヤー">
<source src={url} type="video/mp4" />
お使いのブラウザはvideoタグをサポートしていません。
</video>
)
}
このアプローチでは、ページは動画の@vercel/blob
URLを使用してVideoComponent
で動画を表示します。React Suspenseは、動画URLが取得され動画が表示できるようになるまでフォールバックを表示するために使用されます。
動画に字幕を追加する
動画に字幕がある場合は、<video>
タグ内に<track>
要素を使用して簡単に追加できます。動画ファイルと同様に、字幕ファイルをVercel Blobから取得できます。以下は、字幕を含めるように<VideoComponent>
を更新する方法です。
async function VideoComponent({ fileName }) {
const {blobs} = await list({
prefix: fileName,
limit: 2
});
const { url } = blobs[0];
const { url: captionsUrl } = blobs[1];
return (
<video controls preload="none" aria-label="動画プレーヤー">
<source src={url} type="video/mp4" />
<track
src={captionsUrl}
kind="subtitles"
srcLang="en"
label="English">
お使いのブラウザはvideoタグをサポートしていません。
</video>
);
};
このアプローチに従うことで、Next.jsアプリケーションに動画を効果的に自己ホストして統合できます。
リソース
動画最適化とベストプラクティスについてさらに学ぶには、以下のリソースを参照してください:
- 動画フォーマットとコーデックの理解: 動画のニーズに合わせて、互換性のためのMP4やWeb最適化のためのWebMなど、適切なフォーマットとコーデックを選択します。詳細はMozillaの動画コーデックガイドを参照してください。
- 動画圧縮: FFmpegなどのツールを使用して、品質とファイルサイズのバランスを取りながら動画を効果的に圧縮します。圧縮技術についてはFFmpeg公式サイトで学べます。
- 解像度とビットレートの調整: 視聴プラットフォームに基づいて解像度とビットレートを調整し、モバイルデバイスには低い設定を使用します。
- コンテンツデリバリーネットワーク(CDN): 動画配信速度を向上させ、高トラフィックを管理するためにCDNを活用します。Vercel Blobなどのストレージソリューションを使用する場合、CDN機能は自動的に処理されます。CDNとその利点について詳細を学ぶ。
Next.jsプロジェクトに動画を統合するための以下の動画ストリーミングプラットフォームを探索してください:
オープンソースのnext-video
コンポーネント
- Vercel Blob、S3、Backblaze、Muxなどのさまざまなホスティングサービスと互換性のあるNext.js用の
<Video>
コンポーネントを提供します。 - 異なるホスティングサービスで
next-video.dev
を使用するための詳細なドキュメント。
Cloudinary統合
- Next.jsでCloudinaryを使用するための公式ドキュメントと統合ガイド。
- ドロップイン動画サポートのための
<CldVideoPlayer>
コンポーネントを含みます。 - Adaptive Bitrate Streamingを含むNext.jsとCloudinaryの統合の例を見つけます。
- Node.js SDKを含む他のCloudinaryライブラリも利用可能です。
Mux Video API
- Muxは、MuxとNext.jsを使用してビデオコースを作成するためのスターターテンプレートを提供します。
- Next.jsアプリケーションに高性能動画を埋め込むためのMuxの推奨事項について学びます。
- Next.jsとMuxをデモンストレーションするサンプルプロジェクトを探索します。
Fastly
- Next.js への ビデオオンデマンド (Video on Demand) やストリーミングメディアの統合について詳しく学びましょう。