VideoObject schema 有效但拿不到视频 rich result

VideoObject JSON-LD 过了 Rich Results Test,但 Search Console 显示视频没被索引。真正的原因通常是缩略图、embed URL 或视频显著度——本文教你定位是哪一种。

你在文章页里嵌入了视频(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 仍要求四件事:缩略图可抓且格式受支持、contentUrlembedUrl 指向真正的播放器或视频文件、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 thumbnailthumbnailUrl 缺失、被挡、或格式不对2
Thumbnail could not be reached / Thumbnail blocked by robots.txtGooglebot 抓不到那张图2
Video not found on host serviceembedUrl / contentUrl 指向 HTML,或视频私有3、4
Rich Results Test「Valid」但报告几周都没动静页面还没被抓,或 uploadDate 不是 ISO 86015、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 reachedThumbnail 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-typetext/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:embedUrlhttps://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 markupisAccessibleForFree: 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。如果它们的 namecontentUrl 一样,Google 会判定为重复 / 歧义,可能两个都不选。

修复:每页只保留一个 canonical VideoObject,代表主视频。如果一页真的有多个不同视频,每个给独立的 namecontentUrl,并考虑是否该拆成独立 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,可选。

最短修复路径

按命中率排序:

  1. 先读 Video indexing report 里确切的 issue 名search.google.com/search-console/video-index)——它会告诉你该修哪一项,不用瞎猜。
  2. 让播放器显著:真实播放器、放在首屏、大于 140px、放在 watch 式页面上——能修掉大部分「No video indexed」。
  3. embedUrl 改成真正的播放器 URL(YouTube /embed/VIDEO_ID、Vimeo /video/VIDEO_ID)。
  4. curl -A "Googlebot/2.1" 验证缩略图可抓;用受支持的格式提供 1280x720+。
  5. uploadDate 改成带时区的 ISO 8601
  6. 每页一个 canonical VideoObject

怎么确认修好了

  1. 把 URL 跑一遍 Rich Results Test——确认 VideoObject 解析无错、缩略图预览能渲染。
  2. 在 Search Console 用 URL Inspection → Test Live URL → View crawled page,确认渲染后的 HTML 里播放器以真实尺寸出现在首屏。
  3. 回到 Video indexing report,点进 URL,确认 issue 转为 Indexed。重新抓取可能要几天到几周;用「Validate fix」排队验证。
  4. 索引后搜 site:yourdomain.com/your-page,在视频 tab 看是否有缩略图。

预防建议

  • 把 VideoObject 输出做进通用视频嵌入组件,每个视频自动有 schema。各页手写 JSON-LD 会漂移。
  • 构建期校验必填字段:缺 namedescriptionthumbnailUrluploadDatecontentUrl / 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:namedescriptionthumbnailUrluploadDate,再加 contentUrlembedUrl 二选一。两个都给兼容性最好。

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 markupisAccessibleForFree: false)。Google 有单独的合规路径——注册站点,按指南走。

相关阅读

标签: #SEO #排查 #排查 #结构化数据 #Video Schema #JSON-LD