237 lines
5.5 KiB
Markdown
237 lines
5.5 KiB
Markdown
|
|
# API Библиотеки
|
|||
|
|
|
|||
|
|
Adaptive Video Converter можно использовать программно в ваших Node.js/TypeScript проектах.
|
|||
|
|
|
|||
|
|
## Установка
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
npm install @grom13/adaptive-video-converter
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Быстрый старт
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import { convertToDash } from '@grom13/adaptive-video-converter';
|
|||
|
|
|
|||
|
|
const result = await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output'
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
console.log('Готово!', result.manifestPath);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Основные экспорты
|
|||
|
|
|
|||
|
|
### Функции
|
|||
|
|
|
|||
|
|
- [`convertToDash()`](/api/convert) — Главная функция конвертации
|
|||
|
|
- [Утилиты](/api/utilities) — Вспомогательные функции (checkFFmpeg, getVideoMetadata и др.)
|
|||
|
|
- [Профили](/api/profiles) — Работа с профилями качества
|
|||
|
|
|
|||
|
|
### TypeScript типы
|
|||
|
|
|
|||
|
|
- [Типы](/api/types) — Все доступные типы и интерфейсы
|
|||
|
|
|
|||
|
|
## Структура API
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// Основная функция
|
|||
|
|
export { convertToDash } from './core/converter';
|
|||
|
|
|
|||
|
|
// Утилиты
|
|||
|
|
export {
|
|||
|
|
checkFFmpeg,
|
|||
|
|
checkMP4Box,
|
|||
|
|
checkNvenc,
|
|||
|
|
checkAV1Support,
|
|||
|
|
getVideoMetadata,
|
|||
|
|
selectAudioBitrate
|
|||
|
|
} from './utils';
|
|||
|
|
|
|||
|
|
// Профили
|
|||
|
|
export {
|
|||
|
|
DEFAULT_PROFILES,
|
|||
|
|
selectProfiles
|
|||
|
|
} from './config/profiles';
|
|||
|
|
|
|||
|
|
// Типы
|
|||
|
|
export type {
|
|||
|
|
DashConvertOptions,
|
|||
|
|
DashConvertResult,
|
|||
|
|
VideoProfile,
|
|||
|
|
ThumbnailConfig,
|
|||
|
|
ConversionProgress,
|
|||
|
|
VideoMetadata,
|
|||
|
|
VideoOptimizations,
|
|||
|
|
CodecType
|
|||
|
|
} from './types';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Примеры использования
|
|||
|
|
|
|||
|
|
### Базовая конвертация
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import { convertToDash } from '@grom13/adaptive-video-converter';
|
|||
|
|
|
|||
|
|
await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output'
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### С кастомными профилями
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output',
|
|||
|
|
customProfiles: ['720', '1080', '1440']
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### С обработкой прогресса
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output',
|
|||
|
|
onProgress: (progress) => {
|
|||
|
|
console.log(`${progress.percent}% - ${progress.stage}`);
|
|||
|
|
console.log(`ETA: ${progress.eta}s`);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Выбор кодека и формата
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output',
|
|||
|
|
codecType: 'dual', // 'h264' | 'av1' | 'dual'
|
|||
|
|
format: 'both' // 'dash' | 'hls' | 'both'
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### С проверкой системы
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import {
|
|||
|
|
convertToDash,
|
|||
|
|
checkFFmpeg,
|
|||
|
|
checkNvenc
|
|||
|
|
} from '@grom13/adaptive-video-converter';
|
|||
|
|
|
|||
|
|
// Проверка перед конвертацией
|
|||
|
|
try {
|
|||
|
|
await checkFFmpeg();
|
|||
|
|
const hasNvenc = await checkNvenc();
|
|||
|
|
|
|||
|
|
console.log('NVENC:', hasNvenc ? 'доступен' : 'недоступен');
|
|||
|
|
|
|||
|
|
await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output'
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('Ошибка:', error.message);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### С анализом исходного видео
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import {
|
|||
|
|
getVideoMetadata,
|
|||
|
|
convertToDash
|
|||
|
|
} from '@grom13/adaptive-video-converter';
|
|||
|
|
|
|||
|
|
// Получить метаданные
|
|||
|
|
const metadata = await getVideoMetadata('./video.mp4');
|
|||
|
|
|
|||
|
|
console.log('Разрешение:', `${metadata.width}×${metadata.height}`);
|
|||
|
|
console.log('FPS:', metadata.fps);
|
|||
|
|
console.log('Длительность:', metadata.duration, 'сек');
|
|||
|
|
|
|||
|
|
// Конвертация с учетом метаданных
|
|||
|
|
await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output',
|
|||
|
|
customProfiles: metadata.height >= 1080
|
|||
|
|
? ['720', '1080', '1440']
|
|||
|
|
: ['360', '720']
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Обработка ошибок
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import { convertToDash } from '@grom13/adaptive-video-converter';
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const result = await convertToDash({
|
|||
|
|
inputPath: './video.mp4',
|
|||
|
|
outputDir: './output'
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
console.log('✅ Успешно:', result.manifestPath);
|
|||
|
|
} catch (error) {
|
|||
|
|
if (error.message.includes('FFmpeg not found')) {
|
|||
|
|
console.error('❌ FFmpeg не установлен');
|
|||
|
|
} else if (error.message.includes('MP4Box not found')) {
|
|||
|
|
console.error('❌ MP4Box не установлен');
|
|||
|
|
} else {
|
|||
|
|
console.error('❌ Ошибка:', error.message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Интеграция в Express
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import express from 'express';
|
|||
|
|
import multer from 'multer';
|
|||
|
|
import { convertToDash } from '@grom13/adaptive-video-converter';
|
|||
|
|
import { promises as fs } from 'fs';
|
|||
|
|
|
|||
|
|
const app = express();
|
|||
|
|
const upload = multer({ dest: 'uploads/' });
|
|||
|
|
|
|||
|
|
app.post('/convert', upload.single('video'), async (req, res) => {
|
|||
|
|
try {
|
|||
|
|
const result = await convertToDash({
|
|||
|
|
inputPath: req.file.path,
|
|||
|
|
outputDir: './public/videos',
|
|||
|
|
onProgress: (progress) => {
|
|||
|
|
// Можно отправлять через WebSocket
|
|||
|
|
console.log(`${progress.percent}%`);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// Удалить временный файл
|
|||
|
|
await fs.unlink(req.file.path);
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
manifestPath: result.manifestPath
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
res.status(500).json({
|
|||
|
|
success: false,
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
app.listen(3000);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Следующие шаги
|
|||
|
|
|
|||
|
|
- [convertToDash()](/api/convert) — Подробная документация основной функции
|
|||
|
|
- [Утилиты](/api/utilities) — Вспомогательные функции
|
|||
|
|
- [Профили](/api/profiles) — Работа с профилями качества
|
|||
|
|
- [Типы](/api/types) — TypeScript типы и интерфейсы
|