Proč řešit VideoObject precizně: kapitoly, přepisy a náhledy jako nositele relevance
Videoobsah je dnes indexován nejen přes titulek a popis, ale také přes strukturu. Správně nasazený VideoObject s kapitolami (Clip), přepisem a náhledy (thumbnails) zvyšuje pokrytí dotazů, viditelnost v „Key moments“, dostupnost obsahu a konzistenci dat napříč kanály (SERP, sociální sítě, interní vyhledávání). Tento článek je praktickým manuálem, jak tyto prvky modelovat a udržet v souladu s principy „Strukturovaná data a datová konzistence“.
Jádro VideoObject: minimální pole a konzistentní hodnoty
- Identita videa:
name,description,inLanguage,uploadDate(ISO 8601),duration(ISO 8601, např.PT12M5S),contentUrl(přímé přehrání),embedUrl(iframe). - Náhledy:
thumbnailUrl(jedna nebo více URL) a/neboimagesImageObject(url,width,height). - Vydavatelství & autorství:
publisher(Organization slogo),creator/author,license(pokud relevantní). - Technické parametry (volitelné, avšak užitečné):
encodingFormat,contentSize,bitrate(naMediaObject),regionsAllowed,expires.
Kapitoly: modelování přes Clip + hasPart pro „Key moments“
Kapitoly ve videu mapujte jako seznam objektů typu Clip v poli hasPart. Každý Clip by měl mít name, startOffset (v sekundách), volitelně endOffset a vlastní url s časovým parametrem (deep-link na sekundu). Doplňte také position pro deterministické pořadí.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "@id": "https://www.example.com/video/ai-seo#video", "url": "https://www.example.com/video/ai-seo", "name": "AI SEO: Entitní strategie v praxi", "description": "Praktický workshop s kapitolami o entitách, clusterech a interním prolinkování.", "inLanguage": "sk", "uploadDate": "2025-09-01T09:00:00+02:00", "duration": "PT18M42S", "contentUrl": "https://cdn.example.com/videos/ai-seo.mp4", "embedUrl": "https://player.example.com/embed/ai-seo", "thumbnailUrl": [ "https://cdn.example.com/videos/ai-seo/cover-1280.jpg", "https://cdn.example.com/videos/ai-seo/cover-640.jpg" ], "hasPart": [ { "@type": "Clip", "name": "Úvod a cíle", "startOffset": 0, "endOffset": 75, "position": 1, "url": "https://www.example.com/video/ai-seo?t=0" }, { "@type": "Clip", "name": "Entitní mapa a zdroje dat", "startOffset": 76, "endOffset": 420, "position": 2, "url": "https://www.example.com/video/ai-seo?t=76" }, { "@type": "Clip", "name": "Topic clustery a interní linky", "startOffset": 421, "endOffset": 900, "position": 3, "url": "https://www.example.com/video/ai-seo?t=421" } ], "potentialAction": { "@type": "SeekToAction", "target": "https://www.example.com/video/ai-seo?t={seek_to_second_number}", "startOffset-input": "required name=seek_to_second_number" }, "publisher": { "@type": "Organization", "name": "Example Media", "logo": { "@type": "ImageObject", "url": "https://www.example.com/static/logo-600x60.png", "width": 600, "height": 60 } } } </script>
Přepisy: transcript, caption a vícejazyčnost
- Přepis uložte do
transcript(Text) v rámciVideoObject, nebo u delších souborů poskytnětecaptionjakoMediaObject(např. VTT/SRT) sinLanguageacontentUrl. - Vícejazyčnost: použijte více
captionobjektů pro jednotlivé jazyky.transcriptdržte v primárním jazyce videa. - Časované kapitoly v přepisu: pokud přepis obsahuje timestampy, zachovejte stejné
startOffsethodnoty jako vClip– to je klíč ke konzistenci.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "@id": "https://www.example.com/video/ai-seo#video", "transcript": "00:00 Úvod... 01:16 Entitní mapa... 07:01 Topic clustery...", "caption": [ { "@type": "MediaObject", "inLanguage": "sk", "encodingFormat": "text/vtt", "contentUrl": "https://cdn.example.com/videos/ai-seo/subtitles/sk.vtt" }, { "@type": "MediaObject", "inLanguage": "en", "encodingFormat": "text/vtt", "contentUrl": "https://cdn.example.com/videos/ai-seo/subtitles/en.vtt" } ] } </script>
Náhledy a filmstripy: thumbnailUrl, image a sprite mapy
- Thumbnail jako signál kvality: poskytněte alespoň dva rozdílné rozměry v
thumbnailUrl(1280×720a640×360), alternativně použijteimagesImageObject. - Sprite/filmstrip: samotný sprite není vlastnost schématu, ale odkazujte na něj v
hasPart(volitelně) jakoMediaObjectsencodingFormatimage/jpegneboimage/webpa v přehrávači mapujte čas → souřadnici sprite. - Konzistentní URL: neměňte názvy souborů při běžných aktualizacích; při forced refresh použijte query hash (
?v=169).
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "thumbnailUrl": [ "https://cdn.example.com/videos/ai-seo/cover-1280.jpg", "https://cdn.example.com/videos/ai-seo/cover-640.jpg" ], "image": { "@type": "ImageObject", "url": "https://cdn.example.com/videos/ai-seo/cover-1920.jpg", "width": 1920, "height": 1080 }, "hasPart": [ { "@type": "MediaObject", "name": "Preview sprite", "encodingFormat": "image/webp", "contentUrl": "https://cdn.example.com/videos/ai-seo/sprite.webp" } ] } </script>
URL vzory a kompatibilita: SeekToAction, deeplinky a parametry
- Podpořte SeekToAction s
urlTemplatepoužívajícím parametr sekund ({seek_to_second_number}), který funguje i bez JavaScriptu. - Deeplink
urlpři každémClipsměřuje na stejný základní URL videa s časovým parametrem, aby nedošlo ke kanibalizaci (nemá jít o novou stránku). - Stabilizujte parametry (
?t=nebo?start=) napříč přehrávačem, oEmbed a otevřenou schémou.
Datová konzistence: jeden zdroj pravdy pro video metadata
Zaveďte „source-of-truth“ pro video metadata (CMS/JSON). Odtud generujte:
- JSON-LD (
VideoObject,Clip,SeekToAction), - Open Graph (
og:video,og:image) a Twitter Cards, - sitemapy (video-sitemap s
thumbnail_loc,duration,publication_date), - oEmbed (pro externí vložení),
- interní vyhledávání (index kapitol a přepisu).
Klíčem je, aby name, description, duration, uploadDate a kapitoly byly totožné v každém kanálu.
Více enkódů a adaptivní streaming: modelování
Pokud máte HLS/DASH, doplňte VideoObject o encoding s MediaObject položkami (různé bitrate/rozlišení). Každý encoding má contentUrl, volitelně encodingFormat (application/x-mpegURL pro HLS) a bitrate.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "name": "AI SEO: Entitní strategie v praxi", "encoding": [ { "@type": "MediaObject", "encodingFormat": "application/x-mpegURL", "contentUrl": "https://cdn.example.com/videos/ai-seo/index.m3u8" }, { "@type": "MediaObject", "encodingFormat": "video/mp4", "contentUrl": "https://cdn.example.com/videos/ai-seo/1080p.mp4", "contentSize": "500MB" } ] } </script>
Testování a validace: co kontrolovat před zveřejněním
- Schéma: validita JSON-LD;
@idje kanonický identifikátor, na který se vážou kapitoly (isPartOf/hasPart). - Konzistence času:
startOffsetnepřesahujeduration; pořadí kapitol je souvislé a bez překrývání (pokud to není úmyslné). - Náhledy: dostupnost, správné rozměry, rozumná velikost souborů, rychlý TTFB.
- Přepisy: existuje minimálně hlavní jazyk; soubor VTT/SRT je bez chyb (časové značky).
- Deeplinky: parametry
?t=nebo?start=fungují i bez JS a vracejí 200.
Accessibility a UX: benefity nad rámec SEO
- Captions a transcript zlepšují srozumitelnost pro neslyšící a pro vícekanálovou konzumaci (mobil/bez zvuku).
- Kapitoly snižují bounce rate – uživatelé přeskočí přímo na relevantní úsek.
- Náhledy (cover + filmstrip) zkracují čas rozhodování a zvyšují CTR v seznamech.
Verzionování a governance: jak udržet pořádek při změnách
- Každá úprava kapitol mění i přepis – nastavte workflow, kde změna
startOffset/endOffsetautomaticky aktualizuje timestampy v přepisech. - Průběžné kontroly konzistence mezi JSON-LD, sitemapou a Open Graph (CI kontrola).
- Changelog: dateModified na stránce videa a interní audit log kapitol/thumbnailů.
Antivzory: čemu se vyhnout při VideoObject
- Chybějící kapitola „Úvod“ se
startOffset0– klíčová pro parsery i uživatele. - Nesoulad duration (VideoObject má jinou délku než skutečný soubor/stream).
- Generické náhledy (rozmazané, s textem malého kontrastu) – ovlivňuje CTR.
- Duplicitní URL kapitol (nesprávné parametry nebo hash-only
#t=bez serverové podpory).
Kompletní šablona: VideoObject s kapitolami, přepisem, náhledy a encodingy
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "@id": "https://www.example.com/video/ai-seo#video", "url": "https://www.example.com/video/ai-seo", "name": "AI SEO: Entitní strategie v praxi", "description": "Workshop s přehledem entit, clusterů a interního prolinkování.", "inLanguage": "sk", "uploadDate": "2025-09-01T09:00:00+02:00", "dateModified": "2025-10-10T12:30:00+02:00", "duration": "PT18M42S", "contentUrl": "https://cdn.example.com/videos/ai-seo/1080p.mp4", "embedUrl": "https://player.example.com/embed/ai-seo", "thumbnailUrl": [ "https://cdn.example.com/videos/ai-seo/cover-1280.jpg", "https://cdn.example.com/videos/ai-seo/cover-640.jpg" ], "image": { "@type": "ImageObject", "url": "https://cdn.example.com/videos/ai-seo/cover-1920.jpg", "width": 1920, "height": 1080 }, "hasPart": [ { "@type": "Clip", "name": "Úvod a cíle", "startOffset": 0, "endOffset": 75, "position": 1, "url": "https://www.example.com/video/ai-seo?t=0" }, { "@type": "Clip", "name": "Entitní mapa a zdroje dat", "startOffset": 76, "endOffset": 420, "position": 2, "url": "https://www.example.com/video/ai-seo?t=76" }, { "@type": "Clip", "name": "Topic clustery a interní linky", "startOffset": 421, "endOffset": 900, "position": 3, "url": "https://www.example