# FFmpeg NVENC

Аппаратное ускоренное кодирование видео с помощью GPU NVIDIA.

{% hint style="success" %}
Все примеры можно запускать на GPU-серверах, арендуемых через [CLORE.AI Marketplace](https://clore.ai/marketplace).
{% endhint %}

## Аренда на CLORE.AI

1. Посетите [CLORE.AI Marketplace](https://clore.ai/marketplace)
2. Отфильтруйте по типу GPU, объему VRAM и цене
3. Выберите **On-Demand** (фиксированная ставка) или **Spot** (цена по ставке)
4. Настройте ваш заказ:
   * Выберите Docker-образ
   * Установите порты (TCP для SSH, HTTP для веб-интерфейсов)
   * Добавьте переменные окружения при необходимости
   * Введите команду запуска
5. Выберите способ оплаты: **CLORE**, **BTC**, или **USDT/USDC**
6. Создайте заказ и дождитесь развертывания

### Доступ к вашему серверу

* Найдите данные для подключения в **Моих заказах**
* Веб-интерфейсы: используйте URL HTTP-порта
* SSH: `ssh -p <port> root@<proxy-address>`

## Что такое NVENC?

NVENC (NVIDIA Video Encoder) обеспечивает:

* Кодирование в 5–10 раз быстрее, чем на CPU
* Поддержка H.264, H.265/HEVC, AV1
* Кодирование в реальном времени 4K/8K
* Низкая загрузка графического процессора

## Требования

| Кодек | Мин. GPU  | Рекомендуется |
| ----- | --------- | ------------- |
| H.264 | GTX 600+  | RTX 3060+     |
| HEVC  | GTX 900+  | RTX 3070+     |
| AV1   | RTX 4000+ | RTX 4090      |

## Быстрое развертывание

**Docker-образ:**

```
nvidia/cuda:12.1.0-devel-ubuntu22.04
```

**Порты:**

```
22/tcp
```

**Команда:**

```bash
apt-get update && \
apt-get install -y ffmpeg && \
echo "FFmpeg с поддержкой NVENC готов"
```

## Проверить поддержку NVENC

```bash

# Проверить доступные кодировщики
ffmpeg -encoders | grep nvenc

# Должно показать:

# V....D h264_nvenc

# V....D hevc_nvenc

# V....D av1_nvenc (RTX 4000+)
```

## Базовое кодирование

### Кодирование H.264

```bash
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -cq 23 output.mp4
```

### Кодирование HEVC/H.265

```bash
ffmpeg -i input.mp4 -c:v hevc_nvenc -preset p7 -cq 23 output.mp4
```

### Кодирование AV1 (RTX 4000+)

```bash
ffmpeg -i input.mp4 -c:v av1_nvenc -preset p7 -cq 23 output.mp4
```

## Пресеты

| Пресет | Качество     | Скорость       |
| ------ | ------------ | -------------- |
| p1     | Самый низкий | Самая быстрая  |
| p2-p3  | Низкая       | Быстро         |
| p4-p5  | Средне       | Сбалансировано |
| p6-p7  | Высокий      | Медленно       |

```bash

# Самое быстрое кодирование
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p1 output.mp4

# Лучшее качество
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 output.mp4
```

## Контроль качества

### Постоянное качество (CQ)

```bash

# Меньше = лучшее качество, больший размер файла
ffmpeg -i input.mp4 -c:v h264_nvenc -cq 18 output.mp4

# Рекомендуемые значения: 18-28
```

### Постоянная битрейтная скорость (CBR)

```bash
ffmpeg -i input.mp4 -c:v h264_nvenc -b:v 10M output.mp4
```

### Переменный битрейт (VBR)

```bash
ffmpeg -i input.mp4 -c:v h264_nvenc -b:v 10M -maxrate 15M -bufsize 20M output.mp4
```

## Разрешение и масштабирование

### Изменить размер видео

```bash

# Масштаб до 1080p
ffmpeg -i input.mp4 -vf "scale=1920:1080" -c:v h264_nvenc output.mp4

# Масштаб до 4K
ffmpeg -i input.mp4 -vf "scale=3840:2160" -c:v hevc_nvenc output.mp4

# Сохранить соотношение сторон
ffmpeg -i input.mp4 -vf "scale=-1:1080" -c:v h264_nvenc output.mp4
```

### Масштабирование на GPU (быстрее)

```bash
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
    -i input.mp4 \
    -vf "scale_cuda=1920:1080" \
    -c:v h264_nvenc output.mp4
```

## Аппаратное декодирование + кодирование

Полная конвейерная обработка на GPU:

```bash
ffmpeg \
    -hwaccel cuda \
    -hwaccel_output_format cuda \
    -i input.mp4 \
    -c:v h264_nvenc \
    -preset p4 \
    output.mp4
```

## Пакетная конвертация

### Shell-скрипт

```bash
#!/bin/bash
INPUT_DIR=$1
OUTPUT_DIR=$2

mkdir -p "$OUTPUT_DIR"

for file in "$INPUT_DIR"/*.{mp4,mkv,avi,mov}; do
    if [ -f "$file" ]; then
        filename=$(basename "$file")
        name="${filename%.*}"

        ffmpeg -hwaccel cuda -i "$file" \
            -c:v h264_nvenc -preset p5 -cq 23 \
            -c:a aac -b:a 192k \
            "$OUTPUT_DIR/${name}.mp4"

        echo "Конвертировано: $filename"
    fi
done
```

### Пакет на Python

```python
import subprocess
import os
from concurrent.futures import ThreadPoolExecutor

def convert_video(input_path, output_path):
    cmd = [
        'ffmpeg', '-y',
        '-hwaccel', 'cuda',
        '-i', input_path,
        '-c:v', 'h264_nvenc',
        '-preset', 'p5',
        '-cq', '23',
        '-c:a', 'aac',
        '-b:a', '192k',
        output_path
    ]
    subprocess.run(cmd, check=True)

input_dir = './videos'
output_dir = './converted'
os.makedirs(output_dir, exist_ok=True)

files = [f for f in os.listdir(input_dir) if f.endswith(('.mp4', '.mkv', '.avi'))]

# Обрабатывать параллельно (если много GPU или достаточно ресурсов)
for f in files:
    input_path = os.path.join(input_dir, f)
    output_path = os.path.join(output_dir, f.rsplit('.', 1)[0] + '.mp4')
    convert_video(input_path, output_path)
    print(f"Конвертировано: {f}")
```

## Частые задачи

### Конвертировать в оптимизированный для веба MP4

```bash
ffmpeg -i input.mp4 \
    -c:v h264_nvenc -preset p5 -cq 23 \
    -c:a aac -b:a 128k \
    -movflags +faststart \
    web_video.mp4
```

### Извлечь аудио

```bash
ffmpeg -i video.mp4 -vn -c:a copy audio.aac
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 320k audio.mp3
```

### Добавить субтитры

```bash

# Впечать субтитры в видео
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" -c:v h264_nvenc output.mp4

# Встроить как мягкие субтитры
ffmpeg -i input.mp4 -i subs.srt -c:v copy -c:a copy -c:s mov_text output.mp4
```

### Обрезать видео

```bash

# С 00:01:00 длительностью 30 секунд
ffmpeg -ss 00:01:00 -i input.mp4 -t 30 -c:v h264_nvenc output.mp4

# С начала до конечной метки времени
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:02:00 -c:v h264_nvenc output.mp4
```

### Объединение видео

```bash

# Создать список файлов
echo "file 'video1.mp4'" > list.txt
echo "file 'video2.mp4'" >> list.txt
echo "file 'video3.mp4'" >> list.txt

# Объединить
ffmpeg -f concat -safe 0 -i list.txt -c:v h264_nvenc output.mp4
```

### Создать GIF

```bash
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos" output.gif
```

### Извлечь кадры

```bash

# Каждый кадр
ffmpeg -i input.mp4 frames/frame_%04d.png

# Каждую 1 секунду
ffmpeg -i input.mp4 -vf "fps=1" frames/frame_%04d.png
```

### Кадры в видео

```bash
ffmpeg -framerate 30 -i frames/frame_%04d.png -c:v h264_nvenc output.mp4
```

## Потоковая передача (Streaming)

### RTMP-поток

```bash
ffmpeg -re -i input.mp4 \
    -c:v h264_nvenc -preset p4 -b:v 4M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream
```

### Вывод HLS

```bash
ffmpeg -i input.mp4 \
    -c:v h264_nvenc -preset p5 \
    -c:a aac \
    -f hls -hls_time 10 -hls_list_size 0 \
    output.m3u8
```

## Сравнение производительности

### Скорость кодирования (4K видео)

| Кодировщик  | GPU/CPU      | Скорость  |
| ----------- | ------------ | --------- |
| libx264     | CPU (8 ядер) | \~30 fps  |
| h264\_nvenc | RTX 3090     | \~300 fps |
| h264\_nvenc | RTX 4090     | \~450 fps |
| hevc\_nvenc | RTX 3090     | \~200 fps |
| hevc\_nvenc | RTX 4090     | \~350 fps |

## Дополнительные параметры

### Двухпроходное кодирование

```bash

# Проход 1
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -b:v 10M -pass 1 -f null /dev/null

# Проход 2
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -b:v 10M -pass 2 output.mp4
```

### B-кадры и GOP

```bash
ffmpeg -i input.mp4 \
    -c:v h264_nvenc \
    -bf 2 \           # B-кадры
    -g 60 \           # Размер GOP
    -keyint_min 30 \  # Мин. интервал ключевых кадров
    output.mp4
```

### Поддержка HDR (HEVC)

```bash
ffmpeg -i hdr_input.mp4 \
    -c:v hevc_nvenc \
    -preset p5 \
    -profile:v main10 \
    -pix_fmt p010le \
    hdr_output.mp4
```

## Много GPU

```bash

# Использовать конкретный GPU
ffmpeg -hwaccel cuda -hwaccel_device 0 -i input.mp4 -c:v h264_nvenc output.mp4

# Параллельное кодирование на разных GPU
ffmpeg -hwaccel cuda -hwaccel_device 0 -i video1.mp4 -c:v h264_nvenc out1.mp4 &
ffmpeg -hwaccel cuda -hwaccel_device 1 -i video2.mp4 -c:v h264_nvenc out2.mp4 &
wait
```

## Устранение неполадок

### NVENC не найден

```bash

# Проверить драйвер NVIDIA
nvidia-smi

# Проверить сборку FFmpeg
ffmpeg -encoders | grep nvenc
```

### Кодирование не удалось

```bash

# Уменьшить количество одновременных сессий (лимит NVENC)

# Потребительские GPU: 3-5 сессий

# Профессиональные GPU: безлимитно
```

### Плохое качество

* Используйте более высокий пресет (p6, p7)
* Понизьте значение CQ (18-20)
* Увеличьте битрейт

## Оценка стоимости

Типичные ставки на маркетплейсе CLORE.AI (по состоянию на 2024):

| GPU       | Почасовая ставка | Дневная ставка | Сессия 4 часа |
| --------- | ---------------- | -------------- | ------------- |
| RTX 3060  | \~$0.03          | \~$0.70        | \~$0.12       |
| RTX 3090  | \~$0.06          | \~$1.50        | \~$0.25       |
| RTX 4090  | \~$0.10          | \~$2.30        | \~$0.40       |
| A100 40GB | \~$0.17          | \~$4.00        | \~$0.70       |
| A100 80GB | \~$0.25          | \~$6.00        | \~$1.00       |

*Цены варьируются в зависимости от провайдера и спроса. Проверьте* [*CLORE.AI Marketplace*](https://clore.ai/marketplace) *для текущих тарифов.*

**Экономьте деньги:**

* Используйте **Spot** рынок для гибких рабочих нагрузок (часто на 30–50% дешевле)
* Платите с помощью **CLORE** токенов
* Сравнивайте цены у разных провайдеров

## Дальнейшие шаги

* [Генерация видео с помощью ИИ](https://docs.clore.ai/guides/guides_v2-ru/generaciya-video/ai-video-generation)
* [Интерполяция RIFE](https://docs.clore.ai/guides/guides_v2-ru/obrabotka-video/rife-interpolation)
* [Апскейл с помощью Real-ESRGAN](https://docs.clore.ai/guides/guides_v2-ru/obrabotka-izobrazhenii/real-esrgan-upscaling)
