你在文章页里嵌入了视频(YouTube、Vimeo、自托管 MP4),并加上了 VideoObject JSON-LD。Rich Results Test 显示「Valid」,解析预览也对。过了几周,Search Console 的 Video indexing report 还是把页面标成「No video indexed」,或者页面被索引了但没有视频外观,你的 URL 也始终没出现在 Google 视频 tab 里。
先说最快的修法:有效的 schema 是必要但不充分的。打开 search.google.com/search-console/video-index 的 Video indexing report,点进出问题的页面,看 Google 给出的具体原因。十有八九是这三件事之一:(1) 视频不在「watch page」上 / Google 判断不了它的位置和尺寸,(2) 缩略图抓不到或格式不对,(3) embedUrl 指向包装页而不是播放器。报告会写明具体 issue 名——对照下面的章节即可。
截至 2026 年 6 月,除了语法有效之外,Google 仍要求四件事:缩略图可抓且格式受支持、contentUrl 或 embedUrl 指向真正的播放器或视频文件、uploadDate 是 ISO 8601、视频对公网可抓且是页面上的显著内容。本文按命中率走完六种失败模式,并标出 Search Console 里确切的 issue 名。
10 秒判断你是哪种情况
打开 Video indexing report,点进 URL,看 Google 报的 issue 名,对照这里:
| Search Console issue 名 | 真正原因 | 章节 |
|---|---|---|
Video isn't on a watch page | 视频是装饰性的 / 不是页面的主内容 | 1 |
Cannot determine video position and size | 播放器加载在屏外、太小、太高、或要点一下才出 | 1 |
No thumbnail URL provided / Invalid thumbnail | thumbnailUrl 缺失、被挡、或格式不对 | 2 |
Thumbnail could not be reached / Thumbnail blocked by robots.txt | Googlebot 抓不到那张图 | 2 |
Video not found on host service | embedUrl / contentUrl 指向 HTML,或视频私有 | 3、4 |
| Rich Results Test「Valid」但报告几周都没动静 | 页面还没被抓,或 uploadDate 不是 ISO 8601 | 5、6 |
如果报告显示页面视频已索引、但 SERP 不显示缩略图,那几乎都是缩略图问题(第 2 节)。
常见原因(按命中率排序)
1. 视频显著度——「not on a watch page」或「无法判断位置和尺寸」
这是嵌入视频拿不到索引的头号原因,跟你的 JSON-LD 一点关系都没有。Google 只在视频是页面上显著内容时才索引它——也就是在 Google 所说的「watch page」(主要目的就是展示这一个视频的页面)上。
有两个 Search Console issue 对应这种情况:
Video isn't on a watch page—— Google 判定视频是装饰性的(一段被正文包围的小内嵌片段)。一个 90% 是文字、视频夹在中间的页面经常踩到这个。Cannot determine video position and size—— 页面首次加载时播放器没有以真实尺寸和位置显示出来。播放器被 click-to-play 封面遮住懒加载、藏在 tab/折叠面板里、或被推到首屏以下,都会触发它。
Google 对显著度的几个子问题给了明确阈值。截至 2026 年 6 月:
| 子问题 | 阈值 | 修复 |
|---|---|---|
| Video outside the viewport | 加载时播放器不在可渲染区域内 | 重新摆放,让整个播放器在页面加载时就可见 |
| Video too small | 宽或高小于 140px,或不足页面宽度的三分之一 | 让播放器大于 140px 且至少占页面宽度三分之一 |
| Video too tall | 高于 1080px | 把播放器高度降到 1080px 以下 |
修复:用真实播放器(不是 click-to-play 占位图),以真实尺寸渲染在首屏,放在以视频为主的页面上。如果你的视频确实只是长文里的辅助内容,那就接受这些页面可能凭文章排名、但拿不到独立视频结果——这是预期行为,不是 bug。
2. thumbnailUrl 缺失、不可达、或格式不对
thumbnailUrl 是必填字段。如果 Google 既抓不到你的缩略图、也生成不了,视频就根本不会被索引。确切规则(Google 视频文档,截至 2026 年 6 月):
- 支持格式:BMP、GIF、JPEG、PNG、WebP、SVG、AVIF。
.jpg配了错的Content-Type、或用了不支持的格式,会触发Invalid thumbnail/Unsupported thumbnail format。 - 最小尺寸:
60x30像素。并没有硬性的1200x720要求,但太小的缩略图在 SERP 里基本不会渲染——为了真正显示出来,做到1280x720(16:9)或更大。 - 必须可达:用稳定的 HTTPS URL 提供,不被 robots.txt 挡,不需要登录。被挡的图会得到
Thumbnail could not be reached或Thumbnail blocked by robots.txt。 - 透明度:至少 80% 的像素 alpha 值要高于 250(即大体不透明)。一张大面积透明的 PNG 会触发
Thumbnail is transparent。
{
"@type": "VideoObject",
"thumbnailUrl": [
"https://yourdomain.com/videos/foo-thumb-1280x720.jpg",
"https://yourdomain.com/videos/foo-thumb-1920x1080.jpg"
]
}
可以传数组——Google 自己挑最好的。每个视频用一个稳定、唯一的 URL。
怎么判断:
curl -A "Googlebot/2.1 (+http://www.google.com/bot.html)" -I "https://yourdomain.com/videos/foo-thumb.jpg"
# 期望:HTTP/2 200,content-type 为 image/jpeg(或 png/webp/avif)
identify "https://yourdomain.com/videos/foo-thumb.jpg" # ImageMagick 确认尺寸和格式
状态 403/401/302 表示缩略图被挡。content-type 是 text/html 表示这个 URL 返回的是页面,不是图片。
3. contentUrl 或 embedUrl 指向页面,不是视频
contentUrl 必须是视频文件的直链(mp4、webm、mov),不是包含 <video> 标签的文章页 URL。embedUrl 必须是播放器 iframe URL,也不是文章页。
{
"@context": "https://schema.org",
"@type": "VideoObject",
"contentUrl": "https://yourdomain.com/articles/how-to-foo/",
"embedUrl": "https://yourdomain.com/articles/how-to-foo/"
}
上面两个 URL 都是错的——它们指向包着视频的文章页。Googlebot 抓回 HTML,找不到视频文件或播放器,就会报 Video not found on host service。
修复:contentUrl 直链到文件,embedUrl 指向播放器:
{
"@type": "VideoObject",
"contentUrl": "https://cdn.yourdomain.com/videos/how-to-foo.mp4",
"embedUrl": "https://www.youtube.com/embed/VIDEO_ID"
}
YouTube:embedUrl 是 https://www.youtube.com/embed/VIDEO_ID——注意是 /embed/,不是 /watch?v=。Vimeo 是 https://player.vimeo.com/video/VIDEO_ID。Google 建议能给 contentUrl 就给——这是它抓取文件最可靠的方式。如果只有 embedUrl(YouTube/Vimeo 嵌入),单独用也可以。
4. 视频被挡——登录墙、付费墙、区域锁、或私有
Googlebot 抓不到视频文件(或它的 embed 页)就没法验证视频存在,于是给你 Video not found on host service。付费墙内容、Vimeo 私有视频、区域锁内容都会被排除在视频结果之外。
怎么判断:
curl -A "Googlebot/2.1" -I "https://www.youtube.com/embed/VIDEO_ID"
# 期望 200;302-to-login 或 401 表示被挡
YouTube unlisted(未公开列出)视频,只要 embedUrl 是公开 embed URL,VideoObject 仍然能工作。真正私有的视频拿不到视频结果。
修复:付费墙视频用 paywalled content markup(isAccessibleForFree: false + hasPart + cssSelector)。Google 对付费视频有单独的合规路径。
5. uploadDate 不是 ISO 8601
uploadDate 必填,且必须是 ISO 8601,最好带时区。"2026-05-19" 能用但只到日期;"2026-05-19T14:30:00-07:00"(Google 文档里的示例格式)才是该输出的。
{
"@type": "VideoObject",
"uploadDate": "2026-05-19T14:30:00-07:00"
}
常见错:输出成 "5/19/2026"(US locale),或带非 ASCII 分隔符的本地化字符串(比如用中文或日文年号字符渲染的日期)。两者都过不了校验。
6. 同页多个 VideoObject 冲突
页面上既有 hero 视频又有正文里嵌入视频,可能输出两个 VideoObject。如果它们的 name 或 contentUrl 一样,Google 会判定为重复 / 歧义,可能两个都不选。
修复:每页只保留一个 canonical VideoObject,代表主视频。如果一页真的有多个不同视频,每个给独立的 name 和 contentUrl,并考虑是否该拆成独立 URL——记住 Google 每页只索引一个显著视频(见第 1 节)。
可直接复制的 VideoObject 模板
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "How to set up a self-hosted server in 10 minutes",
"description": "Step-by-step walkthrough covering hardware selection, OS install, and SSH hardening.",
"thumbnailUrl": [
"https://yourdomain.com/videos/server-setup-thumb-1280x720.jpg",
"https://yourdomain.com/videos/server-setup-thumb-1920x1080.jpg"
],
"uploadDate": "2026-05-19T14:30:00-07:00",
"duration": "PT10M30S",
"contentUrl": "https://cdn.yourdomain.com/videos/server-setup.mp4",
"embedUrl": "https://www.youtube.com/embed/VIDEO_ID",
"publisher": {
"@type": "Organization",
"name": "Site name",
"logo": {
"@type": "ImageObject",
"url": "https://yourdomain.com/logo.png"
}
},
"potentialAction": {
"@type": "SeekToAction",
"target": "https://yourdomain.com/videos/server-setup#t={seek_to_second_number}",
"startOffset-input": "required name=seek_to_second_number"
}
}
duration 用 ISO 8601 duration 格式:PT10M30S = 10 分 30 秒,PT1H5M = 1 小时 5 分。SeekToAction 块用于 Key Moments,可选。
最短修复路径
按命中率排序:
- 先读 Video indexing report 里确切的 issue 名(
search.google.com/search-console/video-index)——它会告诉你该修哪一项,不用瞎猜。 - 让播放器显著:真实播放器、放在首屏、大于
140px、放在 watch 式页面上——能修掉大部分「No video indexed」。 embedUrl改成真正的播放器 URL(YouTube/embed/VIDEO_ID、Vimeo/video/VIDEO_ID)。- 用
curl -A "Googlebot/2.1"验证缩略图可抓;用受支持的格式提供1280x720+。 uploadDate改成带时区的 ISO 8601。- 每页一个 canonical VideoObject。
怎么确认修好了
- 把 URL 跑一遍 Rich Results Test——确认
VideoObject解析无错、缩略图预览能渲染。 - 在 Search Console 用 URL Inspection → Test Live URL → View crawled page,确认渲染后的 HTML 里播放器以真实尺寸出现在首屏。
- 回到 Video indexing report,点进 URL,确认 issue 转为 Indexed。重新抓取可能要几天到几周;用「Validate fix」排队验证。
- 索引后搜
site:yourdomain.com/your-page,在视频 tab 看是否有缩略图。
预防建议
- 把 VideoObject 输出做进通用视频嵌入组件,每个视频自动有 schema。各页手写 JSON-LD 会漂移。
- 构建期校验必填字段:缺
name、description、thumbnailUrl、uploadDate、contentUrl/embedUrl之一就 fail build。 - 缩略图从
1920x1080源图制作,schema 数组里降采样到1280x720。每个视频用一个稳定 URL。 - 想要被索引,就把播放器以真实尺寸渲染在首屏、放在以视频为主的页面上——别藏在 click-to-play 后面。
- 每周看 Video indexing report。骤降通常意味着模板回归。
FAQ
Q:嵌入 YouTube iframe 会自动给我的页面生成 VideoObject 吗?
A:不会。YouTube 在它自己的 watch 页(youtube.com/watch?v=...)上输出 VideoObject,不在你的页面上。你 iframe 嵌入后,除非自己加 JSON-LD,否则页面没有 schema。
Q:VideoObject 的必填字段是哪些?
A:name、description、thumbnailUrl、uploadDate,再加 contentUrl 或 embedUrl 二选一。两个都给兼容性最好。
Q:Rich Results Test 显示「Valid」,但几周后还是没视频列出,为什么? A:校验只检 schema 语法。被索引还要 Googlebot 真去抓 embed / content URL、确认视频存在、并判断视频在页面上显著。打开 Video indexing report 读确切 issue——多数「No video indexed」是第 1 节的显著度规则,不是你的 JSON-LD。
Q:Google 实际要求多大的缩略图?
A:硬性最小是 60x30 像素,格式为 BMP、GIF、JPEG、PNG、WebP、SVG 或 AVIF。想在 SERP 真正显示缩略图,用 1280x720(16:9)或更大。缩略图必须 Googlebot 能抓、不被 robots.txt 挡、且至少 80% 不透明。
Q:YouTube watch 页能进 Google 视频 tab,我的页面却进不去。 A:正常。YouTube watch 页是那个视频的 canonical。你的页面也能排,但需要 embed 正确,且页面在 embed 之外有独特增值。
Q:用 contentUrl 还是 embedUrl?
A:能给就都给。Google 偏好 contentUrl(视频文件直链),因为它能自己抓视频;embedUrl 是用户看到的播放器。自托管两个都设;YouTube/Vimeo 嵌入只有 embedUrl,可以接受。
Q:付费墙文章里的视频还能拿视频结果吗?
A:可以,用 paywalled content markup(isAccessibleForFree: false)。Google 有单独的合规路径——注册站点,按指南走。