Files
adaptive-video-converter/docs/api/profiles.md
2025-12-03 22:46:15 +03:00

317 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Профили качества
Работа с профилями качества видео (разрешения, битрейты, 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 тип