317 lines
8.1 KiB
Markdown
317 lines
8.1 KiB
Markdown
# Профили качества
|
||
|
||
Работа с профилями качества видео (разрешения, битрейты, FPS).
|
||
|
||
## DEFAULT_PROFILES
|
||
|
||
Массив дефолтных профилей качества.
|
||
|
||
**Сигнатура:**
|
||
```typescript
|
||
const DEFAULT_PROFILES: VideoProfile[]
|
||
```
|
||
|
||
**Содержимое:**
|
||
|
||
| Профиль | Разрешение | Видео битрейт | Аудио битрейт | FPS |
|
||
|---------|------------|---------------|---------------|-----|
|
||
| 360p | 640×360 | 800k | 96k | 30 |
|
||
| 480p | 854×480 | 1400k | 128k | 30 |
|
||
| 720p | 1280×720 | 2500k | 128k | 30 |
|
||
| 1080p | 1920×1080 | 5000k | 192k | 30 |
|
||
| 1440p | 2560×1440 | 8000k | 192k | 30 |
|
||
| 2160p (4K) | 3840×2160 | 16000k | 192k | 30 |
|
||
|
||
**Пример:**
|
||
```typescript
|
||
import { DEFAULT_PROFILES } from '@grom13/adaptive-video-converter';
|
||
|
||
console.log('Доступные профили:', DEFAULT_PROFILES.length);
|
||
|
||
DEFAULT_PROFILES.forEach(profile => {
|
||
console.log(`${profile.name}: ${profile.width}×${profile.height} @ ${profile.videoBitrate}`);
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## selectProfiles()
|
||
|
||
Автоматический выбор профилей на основе метаданных исходного видео.
|
||
|
||
**Сигнатура:**
|
||
```typescript
|
||
function selectProfiles(
|
||
metadata: VideoMetadata,
|
||
customProfiles?: string[]
|
||
): VideoProfile[]
|
||
```
|
||
|
||
**Параметры:**
|
||
- `metadata` — Метаданные исходного видео (из `getVideoMetadata()`)
|
||
- `customProfiles` — Опциональные кастомные профили как строки
|
||
|
||
**Возвращает:** Массив выбранных профилей
|
||
|
||
**Логика автовыбора:**
|
||
|
||
| Исходное разрешение | Выбранные профили |
|
||
|---------------------|-------------------|
|
||
| ≤ 720p | 360p, 480p, 720p |
|
||
| 1080p | 360p, 720p, 1080p |
|
||
| 1440p | 720p, 1080p, 1440p |
|
||
| 2160p (4K) | 1080p, 1440p, 2160p |
|
||
|
||
**Особенности:**
|
||
- FPS профилей соответствует исходному видео (до 120fps max)
|
||
- Битрейты рассчитываются автоматически по формуле BPP (Bits Per Pixel)
|
||
- Создаются варианты с высоким FPS если исходное видео поддерживает
|
||
|
||
**Примеры:**
|
||
|
||
### Автовыбор профилей
|
||
|
||
```typescript
|
||
import {
|
||
getVideoMetadata,
|
||
selectProfiles
|
||
} from '@grom13/adaptive-video-converter';
|
||
|
||
const metadata = await getVideoMetadata('./video.mp4');
|
||
const profiles = selectProfiles(metadata);
|
||
|
||
console.log('Выбранные профили:');
|
||
profiles.forEach(p => {
|
||
console.log(`- ${p.name}: ${p.width}×${p.height} @ ${p.fps}fps, ${p.videoBitrate}`);
|
||
});
|
||
```
|
||
|
||
### С кастомными профилями
|
||
|
||
```typescript
|
||
import {
|
||
getVideoMetadata,
|
||
selectProfiles
|
||
} from '@grom13/adaptive-video-converter';
|
||
|
||
const metadata = await getVideoMetadata('./video.mp4');
|
||
|
||
// Парсинг кастомных профилей
|
||
const profiles = selectProfiles(metadata, ['720', '1080', '1440']);
|
||
|
||
// Профили будут созданы на основе исходного FPS
|
||
```
|
||
|
||
### С высоким FPS
|
||
|
||
```typescript
|
||
import {
|
||
getVideoMetadata,
|
||
selectProfiles
|
||
} from '@grom13/adaptive-video-converter';
|
||
|
||
const metadata = await getVideoMetadata('./gameplay.mp4');
|
||
|
||
// Если исходное видео 60fps, создаст профили:
|
||
// 720p@60, 1080p@60, 1440p@60
|
||
const profiles = selectProfiles(metadata, ['720@60', '1080@60', '1440@60']);
|
||
```
|
||
|
||
---
|
||
|
||
## VideoProfile интерфейс
|
||
|
||
```typescript
|
||
interface VideoProfile {
|
||
name: string; // Название (например, "1080p", "720p@60")
|
||
width: number; // Ширина в пикселях
|
||
height: number; // Высота в пикселях
|
||
videoBitrate: string; // Видео битрейт (например, "5000k")
|
||
audioBitrate: string; // Аудио битрейт (например, "128k")
|
||
fps: number; // Кадров в секунду
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Создание кастомных профилей
|
||
|
||
### Вручную
|
||
|
||
```typescript
|
||
import type { VideoProfile } from '@grom13/adaptive-video-converter';
|
||
import { convertToDash } from '@grom13/adaptive-video-converter';
|
||
|
||
const myProfiles: VideoProfile[] = [
|
||
{
|
||
name: '720p-high',
|
||
width: 1280,
|
||
height: 720,
|
||
videoBitrate: '3500k', // Выше стандартного
|
||
audioBitrate: '192k',
|
||
fps: 30
|
||
},
|
||
{
|
||
name: '1080p-ultra',
|
||
width: 1920,
|
||
height: 1080,
|
||
videoBitrate: '8000k', // Выше стандартного
|
||
audioBitrate: '256k',
|
||
fps: 60
|
||
}
|
||
];
|
||
|
||
await convertToDash({
|
||
input: './video.mp4',
|
||
outputDir: './output',
|
||
profiles: myProfiles
|
||
});
|
||
```
|
||
|
||
### С расчетом битрейта
|
||
|
||
```typescript
|
||
import type { VideoProfile } from '@grom13/adaptive-video-converter';
|
||
|
||
// BPP (Bits Per Pixel) формула
|
||
function calculateBitrate(
|
||
width: number,
|
||
height: number,
|
||
fps: number,
|
||
bpp: number = 0.1 // По умолчанию 0.1
|
||
): string {
|
||
const bitrate = Math.round(width * height * fps * bpp / 1000);
|
||
return `${bitrate}k`;
|
||
}
|
||
|
||
const profile: VideoProfile = {
|
||
name: '1080p60',
|
||
width: 1920,
|
||
height: 1080,
|
||
videoBitrate: calculateBitrate(1920, 1080, 60, 0.1), // ~12000k
|
||
audioBitrate: '192k',
|
||
fps: 60
|
||
};
|
||
```
|
||
|
||
---
|
||
|
||
## Форматы строк для customProfiles
|
||
|
||
### Базовый формат
|
||
|
||
```
|
||
<resolution>[@<fps>]
|
||
```
|
||
|
||
**Примеры:**
|
||
- `'360'` → 360p @ 30fps
|
||
- `'720'` → 720p @ 30fps
|
||
- `'1080'` → 1080p @ 30fps
|
||
|
||
### С указанием FPS
|
||
|
||
```
|
||
<resolution>@<fps>
|
||
```
|
||
|
||
**Примеры:**
|
||
- `'720@60'` → 720p @ 60fps
|
||
- `'1080@60'` → 1080p @ 60fps
|
||
- `'1440@120'` → 1440p @ 120fps
|
||
|
||
### Комбинации
|
||
|
||
```typescript
|
||
const profiles = ['360', '720@30', '1080@60', '1440@120'];
|
||
```
|
||
|
||
---
|
||
|
||
## Рекомендации по битрейтам
|
||
|
||
### Стандартное качество (BPP ~0.1)
|
||
|
||
| Профиль | Битрейт |
|
||
|---------|---------|
|
||
| 360p @ 30fps | 800k |
|
||
| 480p @ 30fps | 1400k |
|
||
| 720p @ 30fps | 2500k |
|
||
| 1080p @ 30fps | 5000k |
|
||
| 1440p @ 30fps | 8000k |
|
||
| 2160p @ 30fps | 16000k |
|
||
|
||
### Высокое качество (BPP ~0.15)
|
||
|
||
| Профиль | Битрейт |
|
||
|---------|---------|
|
||
| 720p @ 30fps | 3800k |
|
||
| 1080p @ 30fps | 7500k |
|
||
| 1440p @ 30fps | 12000k |
|
||
| 2160p @ 30fps | 24000k |
|
||
|
||
### Высокий FPS
|
||
|
||
Для 60fps — умножить на 2
|
||
Для 120fps — умножить на 4
|
||
|
||
**Примеры:**
|
||
- 1080p @ 60fps: 5000k × 2 = 10000k
|
||
- 1440p @ 120fps: 8000k × 4 = 32000k
|
||
|
||
---
|
||
|
||
## Валидация профилей
|
||
|
||
При использовании `selectProfiles()` или `convertToDash()` автоматически происходит:
|
||
|
||
1. **Проверка разрешения** — не превышает исходное
|
||
2. **Проверка FPS** — не превышает исходный
|
||
3. **Ограничение FPS** — максимум 120fps
|
||
4. **Расчет битрейтов** — автоматически если не указаны
|
||
|
||
**Пример:**
|
||
|
||
```typescript
|
||
// Если исходное видео 1080p @ 30fps
|
||
const profiles = selectProfiles(metadata, ['720@60', '1080', '1440']);
|
||
|
||
// Результат:
|
||
// - 720p @ 30fps (FPS понижен до исходного)
|
||
// - 1080p @ 30fps
|
||
// - 1440p → ПРОПУЩЕН (разрешение выше исходного)
|
||
```
|
||
|
||
---
|
||
|
||
## Интеграция с convertToDash()
|
||
|
||
```typescript
|
||
import {
|
||
getVideoMetadata,
|
||
selectProfiles,
|
||
convertToDash
|
||
} from '@grom13/adaptive-video-converter';
|
||
|
||
// 1. Получить метаданные
|
||
const metadata = await getVideoMetadata('./video.mp4');
|
||
|
||
// 2. Выбрать профили
|
||
const profiles = selectProfiles(metadata, ['720', '1080', '1440']);
|
||
|
||
// 3. Конвертация
|
||
await convertToDash({
|
||
input: './video.mp4',
|
||
outputDir: './output',
|
||
profiles // Использовать выбранные профили
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## См. также
|
||
|
||
- [convertToDash()](/api/convert) — Главная функция
|
||
- [Утилиты](/api/utilities) — getVideoMetadata()
|
||
- [Типы](/api/types) — VideoProfile тип
|