本页面介绍了如何在 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"
/>
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" /> |
playsInline | 在 iOS 设备上启用内联播放,这通常是 iOS Safari 上自动播放的必要条件。 | <video playsInline /> |
须知:使用
autoPlay属性时,务必同时包含muted属性以确保视频在大多数浏览器中自动播放,以及playsInline属性以兼容 iOS 设备。
有关视频属性的完整列表,请参阅 MDN 文档。
<video> 标签时,请在标签内包含备用内容,以用于不支持视频播放的浏览器。<track> 标签与 <video> 元素一起指定字幕文件来源。<iframe>HTML <iframe> 标签允许你嵌入来自 YouTube 或 Vimeo 等外部平台的视频。
export default function Page() {
return (
<iframe src="https://www.youtube.com/embed/19g66ezsKAg" allowFullScreen />
)
}<iframe> 标签属性| 属性 | 描述 | 示例值 |
|---|---|---|
src | 要嵌入的页面 URL。 | <iframe src="https://example.com" /> |
width | 设置 iframe 的宽度。 | <iframe width="500" /> |
height | 设置 iframe 的高度。 | <iframe height="300" /> |
allowFullScreen | 允许 iframe 内容以全屏模式显示。 | <iframe allowFullScreen /> |
sandbox | 对 iframe 内的内容启用一组额外的限制。 | <iframe sandbox /> |
loading | 优化加载行为(例如,延迟加载)。 | <iframe loading="lazy" /> |
title | 为 iframe 提供标题以支持可访问性。 | <iframe title="Description" /> |
有关 iframe 属性的完整列表,请参阅 MDN 文档。
您可以通过两种方式将视频嵌入到 Next.js 应用程序中:
<video> 标签嵌入自托管视频。这种在 Next.js 中的集成方法允许自定义和控制您的视频内容。<iframe> 标签嵌入其基于 iframe 的播放器。虽然这种方法限制了对播放器的某些控制,但它提供了易用性和这些平台提供的功能。选择符合您应用程序需求和您希望提供的用户体验的嵌入方法。
要嵌入来自外部平台的视频,您可以使用 Next.js 获取视频信息,并使用 React Suspense 处理加载时的回退状态。
1. 创建一个用于视频嵌入的服务器组件
第一步是创建一个 Server Component,用于生成嵌入视频所需的 iframe。此组件将获取视频的源 URL 并渲染 iframe。
export default async function VideoComponent() {
const src = await getVideoSrc()
return <iframe src={src} 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>Loading video...</p>}>
<VideoComponent />
</Suspense>
{/* Other content of the page */}
</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>
{/* Other content of the page */}
</section>
)
}自托管视频可能因多种原因而更受青睐:
Vercel Blob 提供了一种高效的视频托管方式,它提供了一个可扩展的云存储解决方案,与 Next.js 配合良好。以下是您如何使用 Vercel Blob 托管视频的方法:
1. 将视频上传到 Vercel Blob
在您的 Vercel 控制台中,导航到“Storage”选项卡并选择您的 Vercel Blob 存储。在 Blob 表的右上角,找到并单击“Upload”按钮。然后,选择您希望上传的视频文件。上传完成后,视频文件将显示在 Blob 表中。
或者,您可以使用服务器动作上传视频。有关详细说明,请参阅 Vercel 文档中的 server-side uploads。Vercel 还支持 client-side uploads。对于某些用例,此方法可能更可取。
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>Loading video...</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="Video player">
<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> 以包含字幕的方法。
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="Video player">
<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 应用程序中。
要继续了解视频优化和最佳实践,请参阅以下资源:
探索这些视频流媒体平台,将视频集成到您的 Next.js 项目中:
next-video 组件<Video> 组件,兼容各种托管服务,包括 Vercel Blob、S3、Backblaze 和 Mux。next-video.dev 与不同的托管服务一起使用。<CldVideoPlayer> 组件。<IKVideo> 组件,提供 无缝视频支持。