# 📚 Video Player - Kapsamlı Dokümantasyon
Modern, hafif ve özellik açısından zengin bir React video player kütüphanesi. Bu dokümantasyon, kütüphaneyi projelerinizde kullanmak için ihtiyacınız olan her şeyi içerir.
## 📦 Kurulum
### NPM ile Kurulum
```bash
npm install @alper/video-player
```
### Yarn ile Kurulum
```bash
yarn add @alper/video-player
```
### Peer Dependencies
Video player, React 18+ gerektirmektedir:
```bash
npm install react react-dom
```
### Opsiyonel Bağımlılıklar
HLS streaming desteği için hls.js otomatik olarak yüklenecektir (gerektiğinde):
```bash
npm install hls.js # Opsiyonel
```
---
## 🚀 Hızlı Başlangıç
### Basit Kullanım
```tsx
import { VideoPlayer } from '@alper/video-player'
import '@alper/video-player/styles.css'
function App() {
return (
)
}
```
### TypeScript Desteği
Kütüphane tam TypeScript desteğine sahiptir ve tip tanımları otomatik olarak gelir:
```tsx
import { VideoPlayer, VideoPlayerProps } from '@alper/video-player'
import '@alper/video-player/styles.css'
const MyPlayer: React.FC = () => {
const props: VideoPlayerProps = {
src: "video.mp4",
autoplay: false,
loop: true,
}
return
}
```
---
## 🎬 Özellikler
### ✅ Temel Özellikler
- ▶️ **Oynatma Kontrolleri**: Play, pause, seek
- 🔊 **Ses Kontrolü**: Volume slider ve mute
- ⚡ **Hız Kontrolü**: 0.25x - 2x oynatma hızı
- 🔄 **Loop Desteği**: Sürekli tekrar
- 🖼️ **Poster Resmi**: Video başlamadan önce görünen thumbnail
- ⌨️ **Klavye Kısayolları**: 15+ klavye kısayolu
- 📱 **Touch Gesture'lar**: Mobil cihazlar için özel kontroller
### 🎨 Gelişmiş Özellikler
- 📺 **HLS Streaming**: .m3u8 dosyaları için otomatik HLS desteği
- 📝 **Altyazı Desteği**: WebVTT ve SRT formatları
- 🎵 **Çoklu Ses Kanalı**: Farklı dil seçenekleri
- 🎯 **Kalite Seçimi**: HLS stream'lerinde otomatik kalite geçişi
- 🖥️ **Fullscreen**: Native fullscreen API desteği
- 📺 **Picture-in-Picture**: PIP mode desteği
- 🌍 **i18n Desteği**: İngilizce ve Türkçe dil desteği
- 🎨 **Tema Özelleştirme**: CSS değişkenleri ile kolay özelleştirme
### ⚡ Performans
- 📦 **Küçük Boyut**: Sadece ~15KB (gzipped)
- 🚀 **Sıfır Runtime Bağımlılık**: React dışında bağımlılık yok
- 🔄 **Lazy Loading**: HLS.js sadece gerektiğinde yüklenir
- 🎯 **Optimize Edilmiş**: Tree-shakeable exports
---
## 📖 API Referansı
### VideoPlayer Props
| Prop | Tip | Varsayılan | Açıklama |
|------|-----|------------|----------|
| `src` | `string` | **zorunlu** | Video kaynağı URL (MP4, WebM, HLS) |
| `poster` | `string` | - | Poster/thumbnail resmi URL'si |
| `autoplay` | `boolean` | `false` | Otomatik oynatma |
| `loop` | `boolean` | `false` | Video tekrarı |
| `muted` | `boolean` | `false` | Sessiz başlat |
| `controls` | `boolean` | `true` | Kontrolleri göster |
| `subtitles` | `SubtitleTrack[]` | `[]` | Altyazı track'leri |
| `theme` | `PlayerTheme` | - | Özel tema renkleri |
| `language` | `string` | `'tr'` | Arayüz dili (`'tr'` veya `'en'`) |
| `keyboardShortcuts` | `boolean` | `true` | Klavye kısayollarını etkinleştir |
| `pictureInPicture` | `boolean` | `true` | PIP butonunu göster |
| `className` | `string` | - | Özel CSS class'ı |
| `style` | `CSSProperties` | - | Inline style'lar |
| `onPlay` | `() => void` | - | Oynatma başladığında |
| `onPause` | `() => void` | - | Oynatma durduğunda |
| `onEnded` | `() => void` | - | Video bittiğinde |
| `onTimeUpdate` | `(time: number) => void` | - | Zaman güncellendiğinde |
| `onVolumeChange` | `(volume: number) => void` | - | Ses seviyesi değiştiğinde |
| `onError` | `(error: Error) => void` | - | Hata oluştuğunda |
| `onLoadedMetadata` | `() => void` | - | Metadata yüklendiğinde |
| `onSeeking` | `() => void` | - | Seek başladığında |
| `onSeeked` | `() => void` | - | Seek bittiğinde |
### SubtitleTrack
```typescript
interface SubtitleTrack {
src: string // Altyazı dosyası URL'si (.vtt veya .srt)
lang: string // Dil kodu (örn: 'en', 'tr')
label: string // Görüntülenecek etiket
default?: boolean // Varsayılan altyazı olarak ayarla
}
```
### AudioTrack
```typescript
interface AudioTrack {
name: string // Ses track'inin adı
language: string // Dil kodu
url: string // Ses dosyası URL'si
groupId: string // Grup ID'si
default?: boolean // Varsayılan olarak seç
}
```
### VideoQuality
```typescript
interface VideoQuality {
height?: number // Video yüksekliği (px)
label: string // Görüntülenecek etiket (örn: "1080p")
width?: number // Video genişliği (px)
bitrate?: number // Bitrate (bps)
levelIndex?: number // HLS level index
}
```
### PlayerTheme
```typescript
interface PlayerTheme {
primaryColor?: string // Ana renk (varsayılan: #ef4444)
accentColor?: string // Vurgu rengi (varsayılan: #dc2626)
backgroundColor?: string // Arkaplan rengi (varsayılan: #000000)
textColor?: string // Yazı rengi (varsayılan: #ffffff)
}
```
---
## 💡 Kullanım Örnekleri
### 1. Basit Video Oynatma
En temel kullanım:
```tsx
import { VideoPlayer } from '@alper/video-player'
import '@alper/video-player/styles.css'
function SimplePlayer() {
return (
)
}
```
### 2. Otomatik Oynatma ve Loop
Video otomatik başlasın ve sürekli tekrarlansın:
```tsx
```
### 3. Altyazılı Video
Çoklu altyazı desteği ile:
```tsx
```
### 4. HLS Streaming
HLS video için (hls.js otomatik yüklenir):
```tsx
```
HLS streaming ile kalite seçimi otomatik olarak aktif olur.
### 5. Event Handler'lar ile İleri Seviye Kullanım
Video olaylarını dinleme:
```tsx
import { useState } from 'react'
import { VideoPlayer } from '@alper/video-player'
function AdvancedPlayer() {
const [currentTime, setCurrentTime] = useState(0)
const [isPlaying, setIsPlaying] = useState(false)
return (
{
console.log('Video başladı!')
setIsPlaying(true)
}}
onPause={() => {
console.log('Video durdu!')
setIsPlaying(false)
}}
onTimeUpdate={(time) => {
setCurrentTime(time)
}}
onEnded={() => {
console.log('Video bitti!')
// Örnek: Sonraki videoya geç
}}
onError={(error) => {
console.error('Video hatası:', error)
// Hata gösterimi veya fallback
}}
/>
Durum: {isPlaying ? 'Oynatılıyor' : 'Durdu'}
Zaman: {Math.floor(currentTime)}s
)
}
```
### 6. Özel Tema
Kendi renk şemanızla özelleştirme:
```tsx
```
### 7. Türkçe Arayüz
Türkçe dil desteği:
```tsx
```
### 8. Klavye Kısayolları Devre Dışı
Bazı durumlarda klavye kısayollarını kapatmak isteyebilirsiniz:
```tsx
```
### 9. Responsive Layout
Farklı ekran boyutlarında:
```tsx
```
### 10. Video Playlist
Sıralı video oynatma:
```tsx
import { useState } from 'react'
import { VideoPlayer } from '@alper/video-player'
const videos = [
{ id: 1, src: '/videos/episode1.mp4', title: 'Bölüm 1' },
{ id: 2, src: '/videos/episode2.mp4', title: 'Bölüm 2' },
{ id: 3, src: '/videos/episode3.mp4', title: 'Bölüm 3' },
]
function Playlist() {
const [currentIndex, setCurrentIndex] = useState(0)
const handleEnded = () => {
// Sonraki videoya geç
if (currentIndex < videos.length - 1) {
setCurrentIndex(currentIndex + 1)
}
}
return (
{videos[currentIndex].title}
{videos.map((video, index) => (
setCurrentIndex(index)}
style={{
fontWeight: index === currentIndex ? 'bold' : 'normal'
}}
>
{video.title}
))}
)
}
```
---
## ⌨️ Klavye Kısayolları
Video player, kullanıcı deneyimini geliştirmek için kapsamlı klavye desteği sunar:
| Tuş | Aksiyon |
|-----|---------|
| `Space` veya `K` | Oynat/Duraklat |
| `←` (Sol Ok) | 5 saniye geri sar |
| `→` (Sağ Ok) | 5 saniye ileri sar |
| `J` | 10 saniye geri sar |
| `L` | 10 saniye ileri sar |
| `↑` (Yukarı Ok) | Ses seviyesini artır (%5) |
| `↓` (Aşağı Ok) | Ses seviyesini azalt (%5) |
| `M` | Sessiz/Sesli |
| `F` | Tam ekran aç/kapat |
| `P` | Picture-in-Picture |
| `0` | Başa dön (%0) |
| `1-9` | İlgili yüzdeye atla (%10-%90) |
| `Home` | Başa dön |
| `End` | Sona git |
| `<` | Oynatma hızını azalt (0.25x) |
| `>` | Oynatma hızını artır (0.25x) |
**Not:** Klavye kısayolları sadece video player'a focus edildiğinde çalışır.
---
## 📱 Touch Gesture'lar
Mobil cihazlarda kullanıcı deneyimini geliştiren touch gesture'lar:
### Temel Gesture'lar
- **Tek Dokunuş**: Oynat/Duraklat
- **Çift Dokunuş (Sol)**: 10 saniye geri sar
- **Çift Dokunuş (Sağ)**: 10 saniye ileri sar
### Swipe Gesture'ları
- **Sağa Kaydır**: İleri sar (kaydırma mesafesine göre)
- **Sola Kaydır**: Geri sar (kaydırma mesafesine göre)
- **Yukarı Kaydır**: Ses seviyesini artır
- **Aşağı Kaydır**: Ses seviyesini azalt
### Pinch & Zoom
- **Pinch**: Video zoom (bazı tarayıcılarda)
---
## 🎨 Stil ve Özelleştirme
### CSS Değişkenleri
Video player, CSS değişkenleri kullanarak kolayca özelleştirilebilir. İşte tüm değişkenler:
```css
:root {
/* Ana Renkler */
--player-primary: #ef4444; /* Ana renk */
--player-primary-hover: #dc2626; /* Hover rengi */
--player-primary-active: #b91c1c; /* Active rengi */
--player-primary-light: rgba(239, 68, 68, 0.2); /* Açık renk */
/* Arkaplan Renkleri */
--player-bg: #000000; /* Ana arkaplan */
--player-bg-controls: rgba(0, 0, 0, 0.85); /* Kontrol paneli */
--player-bg-overlay: rgba(0, 0, 0, 0.6); /* Overlay */
--player-bg-menu: rgba(20, 20, 20, 0.95); /* Menu arkaplan */
/* Yazı Renkleri */
--player-text: #ffffff; /* Ana yazı */
--player-text-secondary: #d1d5db; /* İkincil yazı */
--player-text-muted: #9ca3af; /* Soluk yazı */
/* Kenarlık & Ayırıcı */
--player-border: #374151;
--player-divider: rgba(255, 255, 255, 0.1);
/* Progress & Buffered */
--player-buffered: rgba(239, 68, 68, 0.3);
--player-progress-bg: rgba(255, 255, 255, 0.3);
/* Gölgeler */
--player-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--player-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
--player-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
/* Geçişler */
--player-transition-fast: 150ms;
--player-transition-normal: 250ms;
--player-transition-slow: 400ms;
/* Z-index */
--player-z-video: 1;
--player-z-subtitle: 10;
--player-z-controls: 20;
--player-z-menu: 30;
--player-z-loading: 40;
/* Boşluklar */
--player-spacing-xs: 6px;
--player-spacing-sm: 10px;
--player-spacing-md: 14px;
--player-spacing-lg: 20px;
--player-spacing-xl: 28px;
/* Border Radius */
--player-radius-sm: 4px;
--player-radius-md: 6px;
--player-radius-lg: 8px;
--player-radius-full: 9999px;
/* İkon Boyutları */
--player-icon-sm: 20px;
--player-icon-md: 28px;
--player-icon-lg: 36px;
--player-icon-xl: 56px;
}
```
### Tema Özelleştirme Örnekleri
#### Koyu Mavi Tema
```css
:root {
--player-primary: #3b82f6;
--player-primary-hover: #2563eb;
--player-primary-active: #1d4ed8;
--player-bg: #0f172a;
}
```
```tsx
// veya JavaScript ile
```
#### Yeşil Tema
```css
:root {
--player-primary: #10b981;
--player-primary-hover: #059669;
--player-primary-active: #047857;
}
```
#### Mor Tema
```css
:root {
--player-primary: #8b5cf6;
--player-primary-hover: #7c3aed;
--player-primary-active: #6d28d9;
}
```
### Özel CSS ile Özelleştirme
Daha fazla kontrol için özel CSS yazabilirsiniz:
```css
/* Video player container boyutu */
.video-player {
max-width: 1200px;
margin: 0 auto;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3);
}
/* Kontrol paneli opacity */
.video-controls {
background: rgba(0, 0, 0, 0.95) !important;
}
/* Progress bar yüksekliği */
.progress-bar {
height: 6px !important;
}
/* Button boyutları */
.control-button {
width: 48px !important;
height: 48px !important;
}
```
---
## 🔧 Gelişmiş Kullanım
### Context API ile Video Kontrolü
Video player'ın context'ini kullanarak programatik kontrol:
```tsx
import { VideoPlayer, usePlayerContext, PlayerProvider } from '@alper/video-player'
function VideoControls() {
const {
play,
pause,
seek,
setVolume,
toggleFullscreen,
videoState
} = usePlayerContext()
return (
Oynat
Duraklat
seek(30)}>30. saniyeye git
setVolume(0.5)}>%50 ses
Tam Ekran
Oynatılıyor: {videoState.playing ? 'Evet' : 'Hayır'}
Süre: {videoState.duration}s
Mevcut: {videoState.currentTime}s
)
}
function App() {
return (
)
}
```
### Custom Hook'lar Kullanımı
Kendi player'ınızı oluşturmak için hook'ları kullanabilirsiniz:
```tsx
import { useKeyboardShortcuts, useTouchGestures } from '@alper/video-player'
function CustomPlayer() {
const videoRef = useRef(null)
// Klavye kısayollarını ekle
useKeyboardShortcuts(videoRef, {
onPlayPause: () => {
if (videoRef.current?.paused) {
videoRef.current?.play()
} else {
videoRef.current?.pause()
}
},
onSeek: (seconds) => {
if (videoRef.current) {
videoRef.current.currentTime += seconds
}
}
})
// Touch gesture'ları ekle
useTouchGestures(videoRef, {
onDoubleTapLeft: () => console.log('Geri sar'),
onDoubleTapRight: () => console.log('İleri sar'),
})
return
}
```
### Altyazı İşlemleri
Altyazıları programatik olarak işleme:
```tsx
import { parseSRT, createSubtitleBlobURL, fetchSubtitle } from '@alper/video-player'
// SRT dosyasını VTT'ye dönüştür
async function convertSRTtoVTT(srtUrl: string) {
const srtContent = await fetch(srtUrl).then(r => r.text())
const vttContent = parseSRT(srtContent)
const blobUrl = createSubtitleBlobURL(vttContent)
return blobUrl
}
// Altyazıyı fetch et ve kullan
async function loadSubtitle(url: string) {
const subtitle = await fetchSubtitle(url)
console.log(subtitle)
}
```
### CORS Kontrolü
Video URL'lerini yüklemeden önce CORS kontrolü:
```tsx
import { validateVideoURL, checkVideoCORS } from '@alper/video-player'
async function loadVideo(url: string) {
// URL validasyonu
const validation = validateVideoURL(url)
if (!validation.valid) {
alert(`Geçersiz URL: ${validation.error}`)
return
}
// CORS kontrolü
const corsCheck = await checkVideoCORS(url)
if (!corsCheck.supported) {
console.error('CORS hatası:', corsCheck.error)
if (corsCheck.needsProxy) {
console.log('Proxy gerekiyor')
// Proxy kullanarak yükle
}
return
}
// Güvenli şekilde yükle
return
}
```
### Zaman Formatı Yardımcıları
```tsx
import { formatTime, parseTime } from '@alper/video-player'
// Saniyeyi formatla
formatTime(125) // "02:05"
formatTime(3661) // "01:01:01"
// Formatlanmış zamanı saniyeye çevir
parseTime("02:05") // 125
parseTime("01:01:01") // 3661
```
---
## 🌍 Çoklu Dil Desteği (i18n)
Video player İngilizce ve Türkçe dil desteği ile gelir.
### Dil Değiştirme
```tsx
// Türkçe arayüz
// İngilizce arayüz
```
### Özel Çeviriler
Kendi çevirilerinizi eklemek için:
```tsx
import { translations, getTranslations } from '@alper/video-player'
// Mevcut çevirileri genişlet
translations.tr.customKey = 'Özel metin'
translations.en.customKey = 'Custom text'
// Çevirileri kullan
const t = getTranslations('tr')
console.log(t.play) // "Oynat"
console.log(t.pause) // "Duraklat"
```
### Desteklenen Diller
| Dil | Kod | Durum |
|-----|-----|-------|
| Türkçe | `tr` | ✅ Tam destek |
| İngilizce | `en` | ✅ Tam destek |
---
## 🎯 HLS Streaming Detayları
### Otomatik HLS Algılama
Video player, `.m3u8` uzantılı dosyaları otomatik algılar ve hls.js'i yükler:
```tsx
```
### Manuel HLS Kontrolü
```tsx
import Hls from 'hls.js'
// HLS desteğini kontrol et
if (Hls.isSupported()) {
console.log('HLS destekleniyor (hls.js ile)')
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
console.log('Native HLS destekleniyor (Safari)')
}
```
### HLS Kalite Seçimi
HLS stream'inde kalite seçimi otomatik olarak aktif olur:
```tsx
```
### HLS Hata Yönetimi
```tsx
{
console.error('HLS hatası:', error)
// Fallback video göster
}}
/>
```
---
## 📱 Responsive Tasarım
### Mobil Uyumluluk
Video player mobil cihazlarda mükemmel çalışır:
```tsx
```
```css
.mobile-container {
width: 100%;
padding: 0;
}
/* Mobil için özel ayarlar */
@media (max-width: 768px) {
.video-player {
border-radius: 0;
}
.video-controls {
padding: 8px !important;
}
}
```
### Aspect Ratio Koruması
```tsx
```
### Grid Layout ile Çoklu Video
```css
.video-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
padding: 20px;
}
```
```tsx
```
---
## ⚠️ Dikkat Edilmesi Gerekenler
### 1. CORS (Cross-Origin Resource Sharing)
Video dosyaları farklı bir domain'de ise CORS header'ları gereklidir:
```
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, HEAD, OPTIONS
Access-Control-Allow-Headers: Range
```
**Çözüm:**
- Sunucunuzda CORS'u etkinleştirin
- CDN kullanıyorsanız CORS ayarlarını yapın
- Veya proxy sunucu kullanın
### 2. Otomatik Oynatma Kısıtlamaları
Modern tarayıcılar, kullanıcı etkileşimi olmadan otomatik oynatmayı engelleyebilir:
```tsx
// Otomatik oynatma için sessiz gereklidir
```
### 3. iOS Safari Davranışları
iOS Safari'de bazı özel durumlar vardır:
- Fullscreen native player'ı açar
- Volume kontrolü çalışmaz (sistem ses seviyesi kullanılır)
- Otomatik oynatma kısıtlamaları daha katıdır
```tsx
import { features } from '@alper/video-player'
if (features.isIOSSafari()) {
console.log('iOS Safari tespit edildi')
// iOS spesifik ayarlamalar
}
if (!features.hasVolumeControl()) {
// Volume kontrolünü gizle
}
```
### 4. Büyük Video Dosyaları
Büyük video dosyaları için HTTP Range Request desteği önemlidir:
```
Accept-Ranges: bytes
Content-Range: bytes 0-1024/5242880
```
### 5. HLS.js Yükleme
HLS.js optional dependency olarak eklenmiştir. NPM'den yüklenemezse CDN'den otomatik yüklenir.
**Manuel kurulum:**
```bash
npm install hls.js
```
### 6. Performance İpuçları
```tsx
// ❌ Kötü: Her render'da yeni object
// ✅ İyi: Dışarıda tanımla
const theme = { primaryColor: '#ff0000' }
// ✅ Daha iyi: useMemo kullan
const theme = useMemo(() => ({
primaryColor: '#ff0000'
}), [])
```
### 7. Memory Leak Önleme
Component unmount olduğunda player otomatik temizlenir. Manuel cleanup gerekmez.
### 8. TypeScript Strict Mode
TypeScript strict mode ile tam uyumludur:
```typescript
import type { VideoPlayerProps } from '@alper/video-player'
const props: VideoPlayerProps = {
src: 'video.mp4',
// TypeScript tüm prop'ları kontrol eder
}
```
---
## 🧪 Test ve Hata Ayıklama
### Hata Yakalama
```tsx
function SafePlayer() {
const [error, setError] = useState(null)
if (error) {
return (
Video yüklenemedi
{error.message}
setError(null)}>Tekrar Dene
)
}
return (
{
console.error('Video hatası:', err)
setError(err)
}}
/>
)
}
```
### Loading State
```tsx
function PlayerWithLoading() {
const [loading, setLoading] = useState(true)
return (
{loading && (
Yükleniyor...
)}
setLoading(false)}
/>
)
}
```
### Console Debug
```tsx
console.log('[DEBUG] Play')}
onPause={() => console.log('[DEBUG] Pause')}
onTimeUpdate={(t) => console.log('[DEBUG] Time:', t)}
onError={(e) => console.error('[DEBUG] Error:', e)}
onLoadedMetadata={() => console.log('[DEBUG] Metadata loaded')}
/>
```
---
## 📊 Browser Desteği
| Browser | Versiyon | Destek |
|---------|----------|--------|
| Chrome | 90+ | ✅ Tam |
| Firefox | 88+ | ✅ Tam |
| Safari | 14+ | ✅ Tam |
| Edge | 90+ | ✅ Tam |
| Opera | 76+ | ✅ Tam |
| iOS Safari | 14+ | ✅ Tam |
| Chrome Mobile | 90+ | ✅ Tam |
| Samsung Internet | 15+ | ✅ Tam |
### Feature Desteği
| Özellik | Chrome | Firefox | Safari | Edge |
|---------|--------|---------|--------|------|
| HLS | ✅* | ✅* | ✅ | ✅* |
| PIP | ✅ | ✅ | ✅ | ✅ |
| Fullscreen | ✅ | ✅ | ✅ | ✅ |
| Subtitles | ✅ | ✅ | ✅ | ✅ |
| Touch | ✅ | ✅ | ✅ | ✅ |
*hls.js ile desteklenir (Safari'de native)
---
## 🚀 Production Deployment
### Build Optimizasyonu
```bash
# Production build
npm run build:lib
# Bundle boyutunu kontrol et
npm run build:lib -- --mode production
# Gzip sıkıştırma ile
gzip -k dist/video-player.js
```
### CDN Kullanımı
```html
```
### Lazy Loading
```tsx
import { lazy, Suspense } from 'react'
const VideoPlayer = lazy(() =>
import('@alper/video-player').then(m => ({ default: m.VideoPlayer }))
)
function App() {
return (
Video player yükleniyor...}>
)
}
```
### Code Splitting
```tsx
// Route-based splitting
import { lazy } from 'react'
const VideoPage = lazy(() => import('./pages/VideoPage'))
// Router
} />
```
---
## 💡 En İyi Pratikler
### 1. Video Dosyası Optimizasyonu
```bash
# FFmpeg ile video optimizasyonu
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k -movflags +faststart output.mp4
```
### 2. Poster Resmi Kullanımı
Her zaman poster resmi ekleyin:
```tsx
```
### 3. Loading State Yönetimi
```tsx
const [videoLoading, setVideoLoading] = useState(true)
setVideoLoading(false)}
/>
```
### 4. Error Boundaries
```tsx
import { ErrorBoundary } from 'react-error-boundary'
Video hatası}>
```
### 5. Accessibility
```tsx
```
---
## 🎓 Örnek Projeler
### Next.js ile Kullanım
```tsx
// pages/video.tsx
import dynamic from 'next/dynamic'
import '@alper/video-player/styles.css'
const VideoPlayer = dynamic(
() => import('@alper/video-player').then(m => m.VideoPlayer),
{ ssr: false }
)
export default function VideoPage() {
return (
Video Sayfası
)
}
```
### Gatsby ile Kullanım
```tsx
// src/pages/video.tsx
import React from 'react'
import { VideoPlayer } from '@alper/video-player'
import '@alper/video-player/styles.css'
const VideoPage = () => {
return (
Video Sayfası
)
}
export default VideoPage
```
### Vite ile Kullanım
```tsx
// src/App.tsx
import { VideoPlayer } from '@alper/video-player'
import '@alper/video-player/styles.css'
function App() {
return (
)
}
export default App
```
---
## 📝 SSS (Sıkça Sorulan Sorular)
### Video oynatılmıyor, ne yapmalıyım?
1. Console'da hata kontrolü yapın
2. CORS ayarlarını kontrol edin
3. Video dosya formatını kontrol edin (MP4, WebM desteklenir)
4. URL'in doğru olduğundan emin olun
### HLS streaming çalışmıyor?
- hls.js'in yüklendiğinden emin olun: `npm install hls.js`
- URL'in `.m3u8` uzantılı olduğunu kontrol edin
- Tarayıcı console'unda hata kontrolü yapın
### Otomatik oynatma çalışmıyor?
Modern tarayıcılar, `muted` olmadan otomatik oynatmaya izin vermez:
```tsx
```
### iOS'ta tam ekran native player açılıyor?
Bu iOS Safari'nin varsayılan davranışıdır ve değiştirilemez. İOS native player'ı kullanır.
### Altyazılar görünmüyor?
- Altyazı dosyasının CORS header'larına sahip olduğundan emin olun
- Format kontrolü yapın (VTT veya SRT)
- URL'in doğru olduğunu kontrol edin
### Bundle boyutunu nasıl azaltırım?
- hls.js'i optional olarak bırakın (sadece HLS kullanıyorsanız)
- Tree-shaking için ES Module import kullanın
- Lazy loading kullanın
### Kendi ikonlarımı kullanabilir miyim?
Evet, CSS ile override edebilirsiniz veya kütüphaneyi fork edip özelleştirebilirsiniz.