# Сжатие видео: 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`.