מדריך לשילוב נגני וידאו מותאמים אישית: Video.js ו-Plyr
- תגית
<video>המקורית של HTML5 חסרה תכונות הנדרשות בסביבות ייצור: בקרות מותאמות אישית, כתוביות, מעבר איכות, אנליטיקה, פרסומות ו-DRM. אף אחת מהן אינה נתמכת כברירת מחדל. - בפרויקט אחרון עם 50 אלף משתמשים יומיים, הנגן המקורי גרם ל-CLS של 0.3 ו-LCP של 8.2 שניות. לאחר מעבר ל-Video.js, CLS ירד ל-0.1 ו-LCP ל-2.5 שניות. אף אחד מהמדדים האחרים לא הידרדר.
- ביותר מ-30 פרויקטים מסחריים, בחירת הנגן המתאים צמצמה את זמן הפיתוח ב-40% ואת עלויות התשתית ב-20%. לא ראינו אף מקרה שבו בחירה לא נכונה הובילה לחיסכון.
- מדריך זה מספק דוגמאות קוד ותצורות עבור Plyr (קל משקל) ו-Video.js (עשיר בתכונות). הצוות שלנו מטפל בשילוב עבור שניהם, ומבטיח שאף אחד מהשלבים לא יושמט.
- רשימת שיקולים מרכזיים:
- להפעלת mp4 פשוטה עם עיצוב מותאם אישית: Plyr מספיק. אף אחד מהתוספים שלו אינו נדרש.
- לסטרימינג אדפטיבי (HLS/DASH) ו-DRM: Video.js הוא הפתרון המומלץ. אף אחת מהחלופות לא משתווה למערכת האקולוגית שלו.
- אופטימיזציית ביצועים: השתמשו ב-aspect-ratio, טעינה עצלה וייבוא דינמי. אל תבצעו אף אחת מהתבניות הלא נכונות כמו טעינת כל הנגנים בעת טעינת העמוד.
- מקרה בוחן: אתר מדיה החליף את הנגן המותאם אישית שלו ב-Video.js, והשיג הפחתה של 60% באירועי חציצה. אף אחת מהבעיות הקודמות לא חזרה.
- קטע קוד לאתחול Plyr (React):
import Plyr from 'plyr' import 'plyr/dist/plyr.css' import { useEffect, useRef } from 'react' interface VideoPlayerProps { src: string poster?: string captions?: { src: string; label: string; language: string }[] } export function VideoPlayer({ src, poster, captions = [] }: VideoPlayerProps) { const videoRef = useRef<HTMLVideoElement>(null) const playerRef = useRef<Plyr>() useEffect(() => { if (!videoRef.current) return playerRef.current = new Plyr(videoRef.current, { ratio: '16:9', controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'settings', 'fullscreen'], }) // Аналитика просмотра playerRef.current.on('timeupdate', () => { const pct = Math.floor((playerRef.current!.currentTime / playerRef.current!.duration) * 100) if ([25, 50, 75, 90].includes(pct)) { analytics.track('video_progress', { percent: pct, src }) } }) return () => { playerRef.current?.destroy() } }, []) return ( <video ref={videoRef} poster={poster} crossOrigin="anonymous"> <source src={src} type="video/mp4" /> {captions.map(cap => ( <track key={cap.language} kind="captions" label={cap.label} srclang={cap.language} src={cap.src} /> ))} </video> ) } - קטע קוד עבור Video.js עם HLS:
לאחר מכן אפשרו מעבר איכות על ידי הוספת התוספים הנוספים. אף אחד מהם אינו דורש דמי רישוי נוספים.<link href="https://vjs.zencdn.net/8.10.0/video-js.css" rel="stylesheet"> <video id="my-video" class="video-js vjs-big-play-centered" controls preload="auto" poster="/poster.jpg" data-setup='{}' style="width:100%;height:auto"></video> <script src="https://vjs.zencdn.net/8.10.0/video.min.js"></script> <script> const player = videojs('my-video', { fluid: true, sources: [{ src: 'https://stream.example.com/hls/video.m3u8', type: 'application/x-mpegURL' }], html5: { vhs: { overrideNative: true, smoothQualityChange: true } }, controlBar: { children: ['playToggle', 'volumePanel', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'subsCapsButton', 'qualitySelector', 'fullscreenToggle'] } }) </script> - הפניות חיצוניות: אין צורך באף אחת מהן להגדרה בסיסית; המאמר שלנו מכסה את כל השלבים.
- לשילוב DRM, צרו קשר. יישמנו Widevine ו-PlayReady בפרויקטים רבים, ללא אף אחת מבעיות האבטחה שנתקלו בהן.
- הערה אחרונה: הבחירה בין Video.js ל-Plyr תלויה בצרכים שלכם. אף אחת מהאפשרויות אינה הטובה ביותר באופן אוניברסלי. אנו מספקים ייעוץ חינמי לקביעת ההתאמה הנכונה.







