Files
adaptive-video-converter/docs/VIDEO_QUALITY_TESTING.md

559 lines
19 KiB
Markdown
Raw 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.

# Тестирование качества видео и сравнение кодеков
Руководство по анализу качества видео, сравнению кодеков и измерению эффективности сжатия.
## 📋 Содержание
1. [Метрики качества](#метрики-качества)
2. [Протестированные кодеки](#протестированные-кодеки)
3. [Результаты тестирования](#результаты-тестирования)
4. [Команды для тестирования](#команды-для-тестирования)
5. [Интерпретация результатов](#интерпретация-результатов)
6. [Рекомендации](#рекомендации)
---
## Метрики качества
### PSNR (Peak Signal-to-Noise Ratio)
**Что измеряет:** Отношение сигнал/шум в децибелах (dB). Показывает математическое отличие между оригиналом и сжатым видео.
**Интерпретация:**
- `> 45 dB` - Отличное качество (практически неразличимо)
- `40-45 dB` - Очень хорошее качество
- `35-40 dB` - Хорошее качество
- `30-35 dB` - Приемлемое качество
- `< 30 dB` - Плохое качество (видимые артефакты)
**Формула расчета:**
```
PSNR = 10 × log₁₀(MAX²/MSE)
```
где MAX - максимальное значение пикселя (255 для 8-bit), MSE - средняя квадратичная ошибка.
### SSIM (Structural Similarity Index)
**Что измеряет:** Структурное сходство изображений. Более точно отражает восприятие человеческим глазом.
**Интерпретация:**
- `1.0` - Идентичные изображения (100%)
- `> 0.99` - Отличное качество (99%+ схожести)
- `0.95-0.99` - Хорошее качество
- `0.90-0.95` - Приемлемое качество
- `< 0.90` - Заметная потеря качества
**Преимущества SSIM:**
- Учитывает яркость, контраст и структуру
- Лучше коррелирует с субъективной оценкой качества
- Более устойчива к локальным искажениям
---
## Протестированные кодеки
### 1. H.264 / AVC
**Описание:** Широко распространенный кодек, поддерживается всеми устройствами.
**Энкодеры:**
- `libx264` - CPU энкодер (отличное качество/размер)
- `h264_nvenc` - NVIDIA GPU энкодер (быстрее, но менее эффективен)
**Параметры качества:**
- CRF: 0-51 (меньше = лучше качество)
- Рекомендуемый диапазон: 18-28
- Пресеты: ultrafast, fast, medium, slow, slower, veryslow
### 2. VP9
**Описание:** Открытый кодек от Google, часть WebM. На 20-50% эффективнее H.264.
**Энкодеры:**
- `libvpx-vp9` - CPU энкодер
- `vp9_vaapi` - аппаратное ускорение (Intel/AMD)
**Параметры качества:**
- CRF: 0-63 (меньше = лучше качество)
- Рекомендуемый диапазон: 28-35
- cpu-used: 0-5 (меньше = лучше качество, медленнее)
### 3. AV1
**Описание:** Современный кодек, следующее поколение после VP9. На 30-50% эффективнее H.264.
**Энкодеры:**
- `libsvtav1` - CPU энкодер (быстрый, хорошее качество)
- `libaom-av1` - CPU энкодер (лучшее качество, очень медленный)
- `av1_nvenc` - NVIDIA GPU энкодер (быстро, но менее эффективен)
- `av1_amf` - AMD GPU энкодер
- `av1_qsv` - Intel GPU энкодер
**Параметры качества:**
- CRF (libsvtav1): 0-63 (меньше = лучше качество)
- CQ (av1_nvenc): 0-51 (меньше = лучше качество)
- Рекомендуемый диапазон: 30-40
---
## Результаты тестирования
### Тестовое видео
**Параметры:**
- Файл: `tenexia.mp4`
- Разрешение: 1920×1080 (Full HD)
- FPS: 25
- Длительность: 135 секунд (2:15)
- Оригинальный размер: 167 MB
- Оригинальный кодек: H.264 (битрейт ~10 Mbps)
### Сводная таблица результатов
| Кодек | Энкодер | Параметр | Размер | PSNR | SSIM | Сжатие | Скорость |
|-------|---------|----------|--------|------|------|--------|----------|
| **Оригинал** | - | - | 167 MB | - | - | 1.0x | - |
| **VP9** | libvpx-vp9 | CRF 32 | 13 MB | 47.42 dB | 0.9917 | 12.8x | ~5-10 мин |
| **AV1** | libsvtav1 | CRF 35 | 9.5 MB | 48.01 dB | 0.9921 | 17.6x | ~10-15 мин |
| **AV1** | av1_nvenc | CQ 32 | 20 MB | N/A | N/A | 8.3x | ~10 сек |
| **AV1** | av1_nvenc | CQ 40 | 9.3 MB | 47.13 dB | 0.9914 | 18.0x | ~10 сек |
| **AV1** | av1_nvenc | CQ 45 | 7.1 MB | 45.49 dB | 0.9899 | 23.5x | ~10 сек |
| **H.264** | libx264 | CRF 28 | 9.7 MB | 44.85 dB | 0.9904 | 17.2x | ~3-5 мин |
| **H.264** | h264_nvenc | CQ 28 | 20 MB | 47.88 dB | 0.9922 | 8.4x | ~10 сек |
| **H.264** | h264_nvenc | CQ 32 | 12 MB | N/A | N/A | 14.0x | ~10 сек |
| **H.264** | h264_nvenc | CQ 35 | 7.9 MB | 44.48 dB | 0.9891 | 21.1x | ~10 сек |
### Победители по категориям
🥇 **Лучшее качество:** AV1 CPU (CRF 35) - PSNR 48.01 dB, SSIM 0.9921
🥇 **Лучшее сжатие при сохранении качества:** AV1 GPU (CQ 40) - 9.3 MB, PSNR 47.13 dB
🥇 **Максимальное сжатие:** AV1 GPU (CQ 45) - 7.1 MB, PSNR 45.49 dB (всё ещё отличное)
**Лучший баланс скорость/качество:** AV1 GPU (CQ 40) - быстро + малый размер + хорошее качество
---
## Команды для тестирования
### 1. Анализ исходного видео
#### Получить метаданные с помощью ffprobe
```bash
# Полная информация в JSON формате
ffprobe -v error -show_format -show_streams -print_format json input.mp4
# Краткая информация о видео
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height,r_frame_rate,bit_rate -of default=noprint_wrappers=1 input.mp4
# Информация об аудио
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name,sample_rate,bit_rate,channels -of default=noprint_wrappers=1 input.mp4
# Размер файла и битрейт
ffprobe -v error -show_entries format=size,duration,bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4
```
### 2. Конвертация видео
#### VP9 (CPU)
```bash
# Базовая конвертация
ffmpeg -i input.mp4 \
-c:v libvpx-vp9 \
-crf 32 \
-b:v 0 \
-row-mt 1 \
-cpu-used 2 \
-c:a libopus \
-b:a 128k \
output_vp9.webm
# Параметры:
# -crf 32 - качество (18-40, меньше = лучше)
# -b:v 0 - режим постоянного качества
# -row-mt 1 - многопоточность
# -cpu-used 2 - скорость кодирования (0-5)
```
#### AV1 (CPU) - libsvtav1
```bash
# Рекомендуемая конфигурация
ffmpeg -i input.mp4 \
-c:v libsvtav1 \
-crf 35 \
-preset 6 \
-svtav1-params tune=0 \
-c:a libopus \
-b:a 128k \
output_av1_cpu.mp4
# Параметры:
# -crf 35 - качество (0-63, меньше = лучше)
# -preset 6 - скорость (0-13, 6 = средняя)
# -svtav1-params tune=0 - оптимизация под PSNR
```
#### AV1 (GPU) - NVIDIA
```bash
# Оптимальный баланс качество/размер
ffmpeg -i input.mp4 \
-c:v av1_nvenc \
-preset p7 \
-cq 40 \
-b:v 0 \
-c:a libopus \
-b:a 128k \
output_av1_gpu.mp4
# Параметры:
# -preset p7 - качество пресета (p1-p7, p7 = лучшее)
# -cq 40 - constant quality (0-51, меньше = лучше)
# -b:v 0 - без ограничения битрейта
# Максимальное сжатие (хорошее качество)
ffmpeg -i input.mp4 -c:v av1_nvenc -preset p7 -cq 45 -b:v 0 -c:a libopus -b:a 128k output_av1_small.mp4
```
#### AV1 (GPU) - AMD
```bash
ffmpeg -i input.mp4 \
-c:v av1_amf \
-quality quality \
-qp_i 40 -qp_p 40 \
-c:a libopus \
-b:a 128k \
output_av1_amd.mp4
```
#### AV1 (GPU) - Intel
```bash
ffmpeg -i input.mp4 \
-c:v av1_qsv \
-preset veryslow \
-global_quality 40 \
-c:a libopus \
-b:a 128k \
output_av1_intel.mp4
```
#### H.264 (CPU)
```bash
# Лучшее качество/размер
ffmpeg -i input.mp4 \
-c:v libx264 \
-crf 28 \
-preset slow \
-c:a aac \
-b:a 128k \
output_h264_cpu.mp4
# Параметры:
# -crf 28 - качество (18-28, меньше = лучше)
# -preset slow - компромисс скорость/качество
# (ultrafast, fast, medium, slow, slower, veryslow)
```
#### H.264 (GPU) - NVIDIA
```bash
# Баланс качество/размер
ffmpeg -i input.mp4 \
-c:v h264_nvenc \
-preset p7 \
-cq 33 \
-b:v 0 \
-c:a aac \
-b:a 128k \
output_h264_gpu.mp4
# Параметры:
# -preset p7 - качество (p1-p7)
# -cq 33 - constant quality (0-51)
```
### 3. Измерение качества
#### PSNR (Peak Signal-to-Noise Ratio)
```bash
# Базовый расчет PSNR
ffmpeg -i encoded.mp4 -i original.mp4 \
-lavfi "[0:v][1:v]psnr" \
-f null - 2>&1 | grep "PSNR"
# С сохранением детальной статистики в файл
ffmpeg -i encoded.mp4 -i original.mp4 \
-lavfi "[0:v][1:v]psnr=stats_file=psnr_stats.log" \
-f null -
# Просмотр статистики
head -5 psnr_stats.log && echo "..." && tail -5 psnr_stats.log
```
**Формат вывода:**
```
PSNR y:46.02 u:53.92 v:53.54 average:47.42 min:41.20 max:52.27
```
- `y` - яркость (luminance)
- `u`, `v` - цветовые каналы (chrominance)
- `average` - средний PSNR
- `min`, `max` - минимальный и максимальный PSNR по кадрам
#### SSIM (Structural Similarity Index)
```bash
# Базовый расчет SSIM
ffmpeg -i encoded.mp4 -i original.mp4 \
-lavfi "[0:v][1:v]ssim" \
-f null - 2>&1 | grep "SSIM"
# С сохранением детальной статистики
ffmpeg -i encoded.mp4 -i original.mp4 \
-lavfi "[0:v][1:v]ssim=stats_file=ssim_stats.log" \
-f null -
# Просмотр статистики
head -5 ssim_stats.log && echo "..." && tail -5 ssim_stats.log
```
**Формат вывода:**
```
SSIM Y:0.9887 (19.46 dB) U:0.9979 (26.70 dB) V:0.9979 (26.75 dB) All:0.9917 (20.83 dB)
```
- Значения 0.0-1.0 (1.0 = идентичные изображения)
- dB - SSIM в децибелах (для удобства сравнения)
#### VMAF (Video Multimethod Assessment Fusion)
VMAF - современная метрика от Netflix, лучше всего коррелирует с человеческим восприятием.
```bash
# Установка модели VMAF (один раз)
# Скачать модель с https://github.com/Netflix/vmaf/tree/master/model
# Расчет VMAF
ffmpeg -i encoded.mp4 -i original.mp4 \
-lavfi "[0:v][1:v]libvmaf=model_path=/path/to/vmaf_v0.6.1.json:log_path=vmaf.json" \
-f null -
# Интерпретация VMAF:
# 90-100 - Отличное качество
# 75-90 - Хорошее качество
# 50-75 - Приемлемое качество
# < 50 - Плохое качество
```
### 4. Полный скрипт для тестирования
Создайте файл `test_codec.sh`:
```bash
#!/bin/bash
# Использование: ./test_codec.sh input.mp4 encoded.mp4 output_dir
INPUT="$1"
ENCODED="$2"
OUTPUT_DIR="${3:-.}"
mkdir -p "$OUTPUT_DIR"
echo "=== Анализ размеров файлов ==="
echo "Оригинал:"
ls -lh "$INPUT" | awk '{print $5, $9}'
echo "Сжатый:"
ls -lh "$ENCODED" | awk '{print $5, $9}'
echo ""
# Рассчет сжатия
ORIG_SIZE=$(stat -f%z "$INPUT" 2>/dev/null || stat -c%s "$INPUT")
ENC_SIZE=$(stat -f%z "$ENCODED" 2>/dev/null || stat -c%s "$ENCODED")
RATIO=$(echo "scale=2; $ORIG_SIZE / $ENC_SIZE" | bc)
echo "Сжатие: ${RATIO}x"
echo ""
echo "=== Метаданные закодированного видео ==="
ffprobe -v error -show_format -show_streams -print_format json "$ENCODED" | \
grep -E "(codec_name|width|height|bit_rate|size)" | head -10
echo ""
echo "=== Расчет PSNR ==="
ffmpeg -i "$ENCODED" -i "$INPUT" \
-lavfi "[0:v][1:v]psnr=stats_file=$OUTPUT_DIR/psnr_stats.log" \
-f null - 2>&1 | grep "PSNR"
echo ""
echo "=== Расчет SSIM ==="
ffmpeg -i "$ENCODED" -i "$INPUT" \
-lavfi "[0:v][1:v]ssim=stats_file=$OUTPUT_DIR/ssim_stats.log" \
-f null - 2>&1 | grep "SSIM"
echo ""
echo "Детальная статистика сохранена в $OUTPUT_DIR/"
```
**Использование:**
```bash
chmod +x test_codec.sh
./test_codec.sh original.mp4 encoded.mp4 ./test_results
```
---
## Интерпретация результатов
### Матрица принятия решений
| Сценарий | Рекомендуемый кодек | Параметры | Ожидаемый результат |
|----------|---------------------|-----------|---------------------|
| Максимальное качество | AV1 CPU | CRF 30-35 | Лучшее качество, малый размер |
| Быстрое кодирование | AV1 GPU | CQ 38-42 | Быстро, хорошее качество |
| Совместимость | H.264 CPU | CRF 23-28 | Работает везде |
| Веб-стриминг | VP9 | CRF 30-35 | Хороший баланс |
| Архивирование | AV1 CPU | CRF 25-30 | Лучшее качество |
### Соответствие метрик и визуального качества
| PSNR | SSIM | Визуальная оценка |
|------|------|-------------------|
| > 45 dB | > 0.99 | Практически неотличимо от оригинала |
| 40-45 dB | 0.98-0.99 | Отличное качество, артефакты незаметны |
| 35-40 dB | 0.95-0.98 | Хорошее качество, артефакты видны при внимательном просмотре |
| 30-35 dB | 0.90-0.95 | Приемлемое качество, видимые артефакты |
| < 30 dB | < 0.90 | Плохое качество, явные артефакты |
### Факторы, влияющие на результаты
1. **Контент видео:**
- Статичные сцены сжимаются лучше
- Быстрое движение требует больше битрейта
- Детализированные текстуры сложнее сжать
- Темные сцены могут показывать бандинг
2. **Разрешение:**
- Высокие разрешения требуют более высокого битрейта
- При одинаковом CRF, 4K будет весить больше чем 1080p
3. **Частота кадров:**
- 60 FPS требует ~1.5-2x больше битрейта чем 30 FPS
- Высокий FPS важнее для игрового контента
4. **Цветовое пространство:**
- HDR (10-bit) требует ~20-30% больше битрейта
- Широкий цветовой охват увеличивает размер
---
## Рекомендации
### Для продакшена
**Adaptive Streaming (DASH/HLS):**
```bash
# Используйте несколько профилей качества
# 360p, 480p, 720p, 1080p, 1440p, 2160p
# Dual codec для максимальной совместимости:
# - AV1 для современных браузеров
# - H.264 для старых устройств (iOS < 14)
# Пример: dvc-cli уже реализует это
dvc-cli input.mp4 output/ -c dual -f both -r 360,720,1080
```
### Для архивирования
```bash
# Используйте AV1 CPU с низким CRF
ffmpeg -i input.mp4 \
-c:v libsvtav1 -crf 25 -preset 4 \
-c:a libopus -b:a 192k \
archive.mp4
```
### Для быстрой обработки
```bash
# Используйте GPU кодирование
ffmpeg -i input.mp4 \
-c:v av1_nvenc -preset p7 -cq 35 \
-c:a aac -b:a 128k \
quick_encode.mp4
```
### Подбор оптимального CRF/CQ
**Метод бинарного поиска:**
1. Начните с среднего значения (CRF 28 для H.264, 32 для VP9, 35 для AV1)
2. Закодируйте короткий фрагмент (30-60 сек)
3. Проверьте качество (PSNR > 45, SSIM > 0.99 для отличного качества)
4. Если качество избыточное - увеличьте CRF на 2-3
5. Если качество недостаточное - уменьшите CRF на 2-3
6. Повторяйте до достижения баланса
**Быстрый тест:**
```bash
# Извлечь 60 секунд с 30-й секунды
ffmpeg -ss 30 -i input.mp4 -t 60 -c copy sample.mp4
# Протестировать разные CRF
for crf in 30 32 35 38 40; do
ffmpeg -i sample.mp4 -c:v libsvtav1 -crf $crf -preset 8 -c:a copy test_crf${crf}.mp4
# Измерить качество
ffmpeg -i test_crf${crf}.mp4 -i sample.mp4 -lavfi "[0:v][1:v]psnr" -f null - 2>&1 | grep "PSNR"
# Размер файла
ls -lh test_crf${crf}.mp4
done
```
---
## Дополнительные ресурсы
### Инструменты
- **FFmpeg** - https://ffmpeg.org/
- **ffprobe** - анализ медиа файлов
- **MediaInfo** - GUI инструмент для анализа
- **Handbrake** - GUI для кодирования
- **ab-av1** - инструмент для подбора оптимальных параметров AV1
### Документация
- [FFmpeg Encoding Guide](https://trac.ffmpeg.org/wiki/Encode)
- [x264 Settings](https://trac.ffmpeg.org/wiki/Encode/H.264)
- [VP9 Encoding Guide](https://trac.ffmpeg.org/wiki/Encode/VP9)
- [SVT-AV1 Documentation](https://gitlab.com/AOMediaCodec/SVT-AV1)
- [NVIDIA Video Codec SDK](https://developer.nvidia.com/video-codec-sdk)
### Научные статьи
- "The Netflix Tech Blog: Per-Title Encode Optimization"
- "VMAF: The Journey Continues" - Netflix
- "AV1 Performance vs x265 and libvpx" - Facebook Engineering
---
## Changelog
**2025-11-12** - Создан документ на основе реальных тестов
- Протестированы кодеки: VP9, AV1 (CPU/GPU), H.264 (CPU/GPU)
- Добавлены все команды для тестирования
- Добавлены результаты сравнения на видео 1920×1080, 135 сек