# Сжатие видео: lossless и почти lossless

Гайд для `ffmpeg` с акцентом на две задачи:
- **строго без потерь** (математический lossless);
- **существенно меньше размер** с визуально очень близким качеством.

## Ключевое правило

Нельзя одновременно гарантировать:
1) **существенно меньший размер**,  
2) **строго нулевые потери**.

Для реально меньших файлов обычно используют режим "почти lossless" (visually lossless).

## Быстрый выбор режима

- Нужен архив "бит-в-бит по кадрам" -> `x265 lossless` или `x264 lossless`.
- Нужен заметно меньший размер и хорошая совместимость (QuickTime, мессенджеры) -> `x264 CRF 18-20`.

---

## 1) Проверка исходника

```bash
ffprobe -v error -show_entries format=filename,format_name,duration,size,bit_rate -of default=nw=1:nk=0 "input.mov"
```

## 2) Строгий lossless (HEVC / x265)

```bash
ffmpeg -i "input.mov" \
  -map 0 \
  -c:v libx265 -x265-params lossless=1 \
  -preset medium \
  -c:a copy \
  -movflags +faststart \
  "output_lossless_x265.mp4"
```

Примечания:
- `lossless=1` — математически без потерь;
- `-c:a copy` — аудио без перекодирования;
- размер может стать больше исходника.

## 3) Строгий lossless (H.264, совместимее)

```bash
ffmpeg -i "input.mov" \
  -map 0 \
  -c:v libx264 -crf 0 -preset medium \
  -pix_fmt yuv420p \
  -c:a copy \
  -movflags +faststart \
  "output_lossless_x264.mp4"
```

## 4) Практичный режим: существенно меньше, визуально очень близко

Рекомендуемый профиль для QuickTime:

```bash
ffmpeg -i "input.mov" \
  -map 0 \
  -c:v libx264 -preset slow -crf 20 \
  -profile:v high -pix_fmt yuv420p \
  -c:a copy \
  -movflags +faststart \
  "output_smaller.mp4"
```

Подстройка качества:
- `crf 18` — выше качество, больше размер;
- `crf 20` — хороший баланс;
- `crf 22` — меньше размер, больше риск артефактов.

## 5) Как проверить, что lossless действительно lossless

```bash
ffmpeg -i "input.mov" -map 0:v:0 -f framemd5 "input.framemd5"
ffmpeg -i "output_lossless_x265.mp4" -map 0:v:0 -f framemd5 "output.framemd5"
diff "input.framemd5" "output.framemd5"
```

Если `diff` пустой — кадры эквивалентны после декодирования.

## 6) Batch-команда для папки (`.mov`)

### 6.1 Строгий lossless

```bash
for f in *.mov; do
  ffmpeg -i "$f" \
    -map 0 \
    -c:v libx265 -x265-params lossless=1 \
    -preset medium \
    -c:a copy \
    -movflags +faststart \
    "${f%.mov}_lossless.mp4"
done
```

### 6.2 Существенно меньше, но визуально близко

```bash
for f in *.mov; do
  ffmpeg -i "$f" \
    -map 0 \
    -c:v libx264 -preset slow -crf 20 \
    -profile:v high -pix_fmt yuv420p \
    -c:a copy \
    -movflags +faststart \
    "${f%.mov}_smaller.mp4"
done
```

## 7) Проблемы с открытием файла

Если файл не открывается в QuickTime или мессенджере:

1. Проверь контейнер:
```bash
ffprobe -v error "video.mp4"
```
2. Перемести метаданные в начало файла:
```bash
ffmpeg -i "video.mp4" -c copy -movflags +faststart "video_fixed.mp4"
```
3. Если кодек не поддерживается, перекодируй в H.264 (`libx264`) с `yuv420p`.
