はじめに/ガイド/動画

動画の使用方法と最適化

このページでは、Next.jsアプリケーションで動画を使用する方法について説明し、パフォーマンスに影響を与えずに動画ファイルを保存および表示する方法を示します。

<video><iframe>の使用

動画は、直接的な動画ファイルにはHTMLの**<video>タグを、外部プラットフォームでホストされた動画には<iframe>**を使用してページに埋め込むことができます。

<video>

HTMLの<video>タグは、自己ホストまたは直接配信される動画コンテンツを埋め込むことができ、再生と外観を完全に制御できます。

app/ui/video.jsx
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"
      />
      Your browser does not support the video tag.
    </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" />
playsInlineiOSデバイスでインライン再生を有効にします。iOS Safariで自動再生が機能するためによく必要です。<video playsInline />

知っておくと便利: autoPlay属性を使用する場合、ほとんどのブラウザで動画が自動再生されるようにmuted属性を含め、iOSデバイスとの互換性のためにplaysInline属性を含めることが重要です。

動画属性の完全なリストについては、MDNドキュメントを参照してください。

動画のベストプラクティス

  • フォールバックコンテンツ: <video>タグを使用する場合、動画再生をサポートしていないブラウザのためにタグ内にフォールバックコンテンツを含めます。
  • 字幕またはキャプション: 聴覚障害のあるユーザーのために字幕またはキャプションを含めます。<video>要素と共に<track>タグを使用してキャプションファイルのソースを指定します。
  • アクセシブルなコントロール: キーボードナビゲーションとスクリーンリーダーの互換性のために、標準のHTML5動画コントロールが推奨されます。高度なニーズには、react-playervideo.jsなどのサードパーティプレーヤーを検討してください。これらはアクセシブルなコントロールと一貫したブラウザエクスペリエンスを提供します。

<iframe>

HTMLの<iframe>タグを使用すると、YouTubeやVimeoなどの外部プラットフォームから動画を埋め込むことができます。

app/page.jsx
export default function Page() {
  return (
    <iframe src="https://www.youtube.com/embed/19g66ezsKAg" allowFullScreen />
  )
}

<iframe>タグの一般的な属性

属性説明
src埋め込むページのURL。<iframe src="https://example.com" />
widthiframeの幅を設定します。<iframe width="500" />
heightiframeの高さを設定します。<iframe height="300" />
allowFullScreeniframeコンテンツをフルスクリーンモードで表示できるようにします。<iframe allowFullScreen />
sandboxiframe内のコンテンツに追加の制限を適用します。<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をレンダリングします。

app/ui/video-component.jsx
export default async function VideoComponent() {
  const src = await getVideoSrc()

  return <iframe src={src} allowFullScreen />
}

2. React Suspenseを使用して動画コンポーネントをストリーミング

動画を埋め込むサーバーコンポーネントを作成した後、次のステップはReact Suspenseを使用してコンポーネントをストリーミングすることです。

app/page.jsx
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として表示することを検討してください:

app/page.jsx
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を使用してこれを行う方法の例です:

app/page.jsx
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" />
      Your browser does not support the video tag.
    </video>
  )
}

このアプローチでは、ページは動画の@vercel/blob URLを使用してVideoComponentで動画を表示します。React Suspenseは、動画URLが取得され動画が表示できるようになるまでフォールバックを表示するために使用されます。

動画に字幕を追加する

動画に字幕がある場合は、<video>タグ内の<track>要素を使用して簡単に追加できます。動画ファイルと同様に、字幕ファイルをVercel Blobから取得できます。以下は、字幕を含めるように<VideoComponent>を更新する方法です。

app/page.jsx
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" />
      Your browser does not support the video tag.
    </video>
  )
}

このアプローチに従うことで、Next.jsアプリケーションに動画を効果的に自己ホストおよび統合できます。

リソース

動画の最適化とベストプラクティスについてさらに学ぶには、以下のリソースを参照してください:

  • 動画フォーマットとコーデックの理解: 互換性のためにMP4、ウェブ最適化のために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統合

Mux Video API

Fastly

  • Next.jsにビデオオンデマンドとストリーミングメディアのFastlyソリューションを統合する方法についてさらに学びます。

ImageKit.io インテグレーション