VideoObject 與 ImageObject:影音與圖片的搜尋曝光
這兩個型別讓 影片與圖片本身 成為搜尋結果的一部分,而不只是頁面的附屬品。
本頁的範例只寫在程式碼區塊裡
這一頁沒有影片,也沒有需要宣告授權的圖片,所以 檔頭沒有真的注入這兩種標記。標記不存在的內容是 結構化資料的政策紅線 。
VideoObject
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "如何設定 robots.txt",
"description": "三分鐘完成爬蟲規則的設定與驗證。",
"thumbnailUrl": ["https://example.com/thumb-1280.jpg"],
"uploadDate": "2026-09-07T10:00:00+08:00",
"duration": "PT3M20S",
"contentUrl": "https://example.com/videos/robots-txt.mp4",
"embedUrl": "https://example.com/embed/robots-txt",
"publisher": {
"@type": "Organization",
"name": "某某科技",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
}
}欄位一覽
| 欄位 | 必要性 | 說明 |
|---|---|---|
name | 必填 | 影片標題 |
description | 必填 | 影片描述 |
thumbnailUrl | 必填 | 縮圖網址 |
uploadDate | 必填 | 上傳日期 |
duration | 強烈建議 | 搜尋結果會顯示時長 |
contentUrl | 建議 | 影片檔案的網址 |
embedUrl | 建議 | 嵌入播放器的網址 |
expires | 選填 | 到期時間(有版權期限時) |
interactionStatistic | 選填 | 觀看次數 |
hasPart | 選填 | 關鍵時刻 |
contentUrl 與 embedUrl 至少要有一個
要取得影片預覽(搜尋結果中可直接播放的版位),搜尋引擎需要拿得到影片本身。兩者填一個就好,都填也可以。
縮圖要求
| 項目 | 要求 |
|---|---|
| 最小尺寸 | 60 × 30 像素 |
| 建議尺寸 | 1280 × 720 或更高 |
| 格式 | JPEG、PNG、WebP 等常見格式 |
| 可爬取 | 不能被 robots.txt 擋住 |
可以提供多種比例讓搜尋引擎挑:
"thumbnailUrl": [
"https://example.com/thumb-16x9.jpg",
"https://example.com/thumb-4x3.jpg",
"https://example.com/thumb-1x1.jpg"
]duration 的格式
這是最常寫錯的欄位
用 ISO 8601 的 期間格式:
| 時長 | 寫法 |
|---|---|
| 3 分 20 秒 | PT3M20S |
| 8 分 30 秒 | PT8M30S |
| 1 小時 5 分 | PT1H5M |
| 45 秒 | PT45S |
P 開頭代表 Period,T 之後才是時間部分。少了 T,P8M 會被解讀成「8 個月」。
// 從秒數轉成期間格式
function toDuration(seconds) {
const h = Math.floor(seconds / 3600);
const m = Math.floor((seconds % 3600) / 60);
const s = seconds % 60;
return `PT${h ? `${h}H` : ''}${m ? `${m}M` : ''}${s ? `${s}S` : ''}`;
}
toDuration(200); // PT3M20S關鍵時刻
關鍵時刻(Key Moments)讓搜尋結果顯示影片的章節,使用者可以直接跳到想看的段落。有兩種方式。
方式一:手動標記
用 hasPart 加上 Clip:
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "如何設定 robots.txt",
"description": "三分鐘完成爬蟲規則的設定與驗證。",
"thumbnailUrl": ["https://example.com/thumb.jpg"],
"uploadDate": "2026-09-07T10:00:00+08:00",
"duration": "PT3M20S",
"contentUrl": "https://example.com/videos/robots-txt.mp4",
"hasPart": [
{
"@type": "Clip",
"name": "建立檔案",
"startOffset": 0,
"endOffset": 45,
"url": "https://example.com/videos/robots-txt?t=0"
},
{
"@type": "Clip",
"name": "寫入規則",
"startOffset": 45,
"endOffset": 150,
"url": "https://example.com/videos/robots-txt?t=45"
},
{
"@type": "Clip",
"name": "驗證",
"startOffset": 150,
"endOffset": 200,
"url": "https://example.com/videos/robots-txt?t=200"
}
]
}| 欄位 | 說明 |
|---|---|
startOffset | 起始秒數(純數字,不是期間格式) |
endOffset | 結束秒數 |
url | 帶時間參數的網址 |
startOffset 用秒數,duration 用期間格式
同一個標記裡兩種時間表示法並存,很容易搞混:
duration:"PT3M20S"(期間格式的字串)startOffset:45(純數字秒數)
方式二:讓搜尋引擎自動偵測
頁面上有清楚的章節時間軸時,搜尋引擎可能自動抓取:
<ul>
<li><a href="?t=0">00:00 建立檔案</a></li>
<li><a href="?t=45">00:45 寫入規則</a></li>
<li><a href="?t=150">02:30 驗證</a></li>
</ul>手動標記較精確
自動偵測不保證會發生,也不保證章節切得跟您想的一樣。有明確章節的影片建議手動標記。
影片頁的其他要點
| 項目 | 說明 |
|---|---|
| 影片要能被爬取 | 影片檔案與縮圖都不能被封鎖 |
| 頁面上要有播放器 | 標記的影片必須在頁面上真的能看 |
| 一頁一個主要影片 | 多影片頁面用 ItemList 包起來 |
| 提供逐字稿 | 文字內容讓搜尋引擎理解影片主題 |
逐字稿的價值被低估
搜尋引擎不會看影片內容。放一份逐字稿或詳細的摘要,等於把影片的資訊變成可索引的文字,這通常比標記本身帶來更多流量。
ImageObject
一般的內容圖片 不需要 單獨標記,有 alt 與適當的檔名就夠了。它主要用在兩個場合。
場合一:宣告授權資訊
搜尋結果的圖片旁可以顯示「可授權」標示:
{
"@context": "https://schema.org",
"@type": "ImageObject",
"contentUrl": "https://example.com/photo.jpg",
"license": "https://example.com/license",
"acquireLicensePage": "https://example.com/photo/purchase",
"creditText": "攝影:某某",
"creator": {
"@type": "Person",
"name": "某某"
},
"copyrightNotice": "© 2026 某某"
}| 欄位 | 說明 |
|---|---|
contentUrl | 圖片本身的網址 |
license | 授權條款頁面 |
acquireLicensePage | 取得授權的頁面 |
creditText | 圖片出處標示 |
creator | 創作者 |
copyrightNotice | 版權宣告 |
license 與 acquireLicensePage 至少要有一個
要取得可授權標示,這兩個欄位至少要填一個。純粹標了 creator 與 copyrightNotice 不會觸發那個呈現。
場合二:當其他型別的欄位值
這是 ImageObject 最常見的用途,出現在其他標記的欄位裡:
// Organization 的 logo
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png",
"width": 512,
"height": 512
}
// VideoObject 的 publisher logo
"publisher": {
"@type": "Organization",
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
}要不要準備專用 sitemap
| 情況 | 需要嗎 |
|---|---|
| 有結構化資料且圖片與影片都在同一網域 | 不必 |
| 影片檔案放在其他網域 | 需要 |
| 圖片由程式碼動態插入,爬蟲讀不到 | 需要 |
| 圖片本身就是主要內容(作品集、圖庫) | 建議 |
結構化資料與專用 sitemap 高度重疊
兩者提供的資訊幾乎相同,而結構化資料還更完整(多了關鍵時刻、授權資訊)。有結構化資料就不必再做專用 sitemap,除非上表的例外情況。
一般網站地圖的做法見 網站地圖 sitemap.xml 。
影片 sitemap 的格式大致是這樣:
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"
>
<url>
<loc>https://example.com/videos/robots-txt</loc>
<video:video>
<video:thumbnail_loc>https://example.com/thumb.jpg</video:thumbnail_loc>
<video:title>如何設定 robots.txt</video:title>
<video:description>三分鐘完成爬蟲規則的設定與驗證。</video:description>
<video:content_loc>https://example.com/videos/robots-txt.mp4</video:content_loc>
<video:duration>200</video:duration>
</video:video>
</url>
</urlset>注意這裡的 duration 用的是 純秒數,與結構化資料的期間格式不同。
檢查清單
VideoObject
| 項目 | 標準 |
|---|---|
| 四個必填欄位齊全 | 必備 |
duration 為期間格式(含 T) | 必備 |
有 contentUrl 或 embedUrl | 建議 |
| 縮圖可被爬取 | 必備 |
| 頁面上真的有播放器 | 必備 |
startOffset 用純秒數 | 必備 |
| 有提供逐字稿或詳細摘要 | 建議 |
ImageObject
| 項目 | 標準 |
|---|---|
| 只在需要宣告授權時單獨標記 | 建議 |
有 license 或 acquireLicensePage | 必備(若要授權標示) |
一般圖片改用 alt | 建議 |
常見問題
VideoObject 的必填欄位有哪些?
名稱、描述、縮圖網址與上傳日期四個。要取得影片預覽還需要提供 contentUrl 或 embedUrl 其中之一,duration 則是強烈建議填寫,因為搜尋結果會顯示它。
duration 要怎麼寫?
用 ISO 8601 的期間格式,例如:8 分 30 秒寫成 PT8M30S。字母 P 開頭代表期間,T 之後是時間部分,少了 T 會被解讀成月份。這是最常寫錯的欄位。
關鍵時刻怎麼標?
有兩種方式。一是用 hasPart 加上 Clip 物件標出每一段的起迄秒數與名稱;二是讓搜尋引擎自動偵測,只要頁面上有清楚的章節時間軸。手動標記較精確。
ImageObject 什麼時候需要單獨標記?
需要宣告授權資訊時。搜尋結果的圖片旁可以顯示可授權標示,那需要 license 或 acquireLicensePage 欄位。一般的內容圖片只要有 替代文字 就夠,不必額外標記。
需要準備影片或圖片的 sitemap 嗎?
有結構化資料的話通常不必。兩者的資訊高度重疊,結構化資料還更完整。真正需要專用網站地圖的情況是影片檔案放在其他網域、或圖片由程式碼動態插入而爬蟲讀不到。
延伸閱讀
參考資料:Google 搜尋中心:影片結構化資料