Media SEO — Images & Video
Google indexes images referenced via img src, never CSS background-image. Descriptive alt text, filenames, and responsive images; the three distinct video URL roles; VideoObject required properties; and image and video sitemaps.
Image SEO
Google indexes images referenced via <img src> (or inline Data URIs). Supported: BMP, GIF, JPEG, PNG, WebP, SVG, AVIF. CSS background-image is NOT indexed. Don't block image URLs; verify CDN domain ownership in Search Console.
- Alt text: descriptive, context-relevant, not stuffed (
alt="Dalmatian puppy playing fetch", notalt="puppy dog baby dog pup pups"). Inline SVG uses<title>. - Responsive images: always keep a fallback
srcin<picture>/srcset. - Filenames: short, descriptive (
my-black-kitten.jpgnotIMG00023.JPG); URL-encode non-Latin; place each image near relevant text; reference with the same URL consistently. - Lazy loading: native
loading="lazy"; never gate loading behind interaction; don't overuse inline Data-URIs (bloat). - Signal the preferred image with
primaryImageOfPage+ Open Graphog:image. Prefer high-res representative images. - Image sitemap:
xmlns:image=".../sitemap-image/1.1",image:image+image:loc, max 1,000 images per page URL (caption/title/geo/license deprecated).
Video SEO
Requirements to index a video (all must hold): (1) watch page indexed and performing; (2) video is the main content (one prominent video per page); (3) standard embed (<video>/<iframe>/<embed>/<object>, no fragment/interaction-gated loading, JS-injected must appear rendered); (4) file at a stable non-expiring URL (no Data URLs); (5) thumbnail accessible (stable URL); (6) contentUrl/embedUrl accessible — don't block the CDN; (7) not hidden; paywalled → add paywall markup; (8) unique title/description.
Keep three URL roles distinct (common pitfall):
| URL | Purpose | Where |
|---|---|---|
| Watch page | Page embedding the video | sitemap <loc> |
| Player | Embeddable player | embedUrl / <video:player_loc> |
| Video file | Content bytes on CDN | contentUrl / <video:content_loc> |
content_loc/player_loc cannot equal <loc>; embedUrl/contentUrl must not point at the watch page.
VideoObject — Required: name, thumbnailUrl, uploadDate (ISO 8601 with timezone). Recommended: contentUrl (most effective), embedUrl, duration (ISO 8601 PT1M54S), description, expires, regionsAllowed.
{
"@context": "https://schema.org", "@type": "VideoObject",
"name": "How to Make an Origami Boat", "description": "Step-by-step folding guide.",
"thumbnailUrl": ["https://example.com/1x1.jpg","https://example.com/16x9.jpg"],
"uploadDate": "2024-07-19T08:00:00+08:00", "duration": "PT1M54S",
"contentUrl": "https://example.com/video/123/file.mp4", "embedUrl": "https://example.com/embed/123"
}
Key Moments (two mutually-exclusive approaches; video must be ≥30s): Clip markup (manual name+startOffset seconds+url with timestamp, chronological, no duplicate start times) OR SeekToAction (give Google your ?t={seek_to_second_number} pattern; startOffset-input must be exactly "required name=seek_to_second_number"). LIVE badge: BroadcastEvent in publication with isLiveBroadcast: true, startDate, and endDate when the stream ends — use the Indexing API on live/stop/change. nosnippet disables Key Moments; duration must be ISO 8601 not seconds.
Video sitemap (xmlns:video=".../sitemap-video/1.1") — required: video:video, video:thumbnail_loc, video:title, video:description (≤2048), one of video:content_loc/video:player_loc. Notable limits: video:duration 1–28800 s (8 h), video:rating 0.0–5.0, video:tag max 32. Removed: video:category, video:price, video:gallery_loc, autoplay/allow_embed. mRSS is an accepted alternative.
News sitemap (xmlns:news): required news:publication (name+language), news:publication_date, news:title; max 1,000 URLs, only last-2-days articles.
Related on Crawlinx
- Image SEO: Alt Text, Formats & Lazy-Loading
- Schema Markup Guide 2026: Types, JSON-LD & Testing
- agent.heading_skip
Sources
Audit your own site — free
156 checks, internal PageRank, render-diff. No signup, results in ~30s.