К основному содержанию
правило

ffmpeg — правило для Cursor: как работать с FFmpeg в проекте

Правило для Cursor, которое задаёт агенту порядок работы с FFmpeg: вызовы через libav*, двухпроходное кодирование и закреплённые сборки в CI.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/ffmpeg.mdc
Открыть на GitHub

Что делает ffmpeg

Правило описывает, как встраивать FFmpeg в приложение. Главное требование — обращаться к библиотеке через API libav* (libavcodec, libavformat, libavfilter), а не дёргать ffmpeg из кода через subprocess. Командная строка годится для быстрых проверок, скриптов и отладки. Причина простая: прямой вызов CLI из продакшена даёт слабый контроль над ошибками, утечки ресурсов и дыру для инъекций в shell.

Для кодирования правило требует двухпроходного режима там, где битрейт ограничен: потоковая выдача, фиксированный размер файла. Ключевой интервал задаётся явно через -g и -keyint_min, иначе страдает перемотка. Для веб-доставки — несколько вариантов качества под HLS или DASH на современных кодеках вроде AV1 и HEVC. В аудио для архивных задач ставка на lossless: FLAC или WAV с явным указанием частоты и формата сэмплов, чтобы ничего не потерялось при конвертации.

Сборка закрепляется на конкретном коммите Git в CI, а не на системном ffmpeg из пакетного менеджера. После обновлений прогоняется FATE — тестовый набор самого проекта. Если в вашем пайплайне FFmpeg ставится через apt-get install, это повод проверить, что версия не поедет между сборками. Файл правила кладётся в .cursor/rules/ffmpeg.mdc и подхватывается для всех файлов проекта.

Какие задачи решает

  • выбрать между вызовом CLI и API libav* в коде приложения
  • настроить двухпроходное кодирование под ограничение по битрейту
  • задать ключевой интервал для нормальной перемотки в стриме
  • собрать несколько вариантов качества для HLS или DASH
  • закрепить версию FFmpeg в CI, чтобы сборки не расходились

Примеры запросов агенту

  • Проверь мой код транскодинга: если там subprocess с ffmpeg, перепиши на libav*
  • Настрой двухпроходное кодирование для этого файла с ограничением битрейта
  • Добавь в Dockerfile сборку FFmpeg с закреплённым коммитом вместо apt-get install ffmpeg

Как установить ffmpeg

Вручную: положить файлы

.cursor/rules/ffmpeg.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Из того же набора69

github-actions Правило для Cursor задаёт жёсткие требования к workflow GitHub Actions: переиспользуемые сборки, кэш зависимостей, минимум прав у токена. ★ 3 579звёзд репо gcp Правило для Cursor задаёт, как писать, разворачивать и сопровождать приложения на Google Cloud: IaC, идемпотентность, права сервисных аккаунтов. ★ 3 579звёзд репо flutter Правило задаёт Cursor единый стиль Flutter-кода: форматирование, линты, слои MVVM и Riverpod. Пригодится, когда агент пишет виджеты и состояние в одном файле. ★ 3 579звёзд репо flake8 Правило для Cursor задаёт, как настроить flake8 и какие проверки включить. Пригодится, если в проекте есть Python и хочется ловить стилевые ошибки и баги до коммита. ★ 3 579звёзд репо esbuild Правило для Cursor, которое задаёт агенту порядок работы с esbuild: один конфиг вместо россыпи флагов в package.json. Пригодится, когда сборка уже есть, но её никто не может поддерживать. ★ 3 579звёзд репо electron Правило для Cursor задаёт команде единый стиль разработки на Electron: контекстная изоляция, безопасный contextBridge, IPC через invoke и кросс-платформенные пути. ★ 3 579звёзд репо drizzle Правило задаёт агенту Cursor стиль работы с Drizzle ORM: модульные схемы, явные ограничения полей и единый нейминг в TypeScript-проекте. ★ 3 579звёзд репо django-rest-framework Правило Cursor, которое задаёт агенту единый стиль разработки API на Django REST Framework: структура проекта, сериализаторы, ViewSets. ★ 3 579звёзд репо

Похожие

media-transcoding Claude MPM Team Скилл для пакетной перекодировки видео по готовым пресетам FFmpeg: веб, мобильные, архив. Пригодится, когда надо привести библиотеку роликов к одному формату. CX Codex +1 335установок hyperframes-cli heygen-com Управляет проектами HyperFrames через терминал: собирает таймлайн, проверяет контраст кадров, запускает предпросмотр и рендерит видео локально или в облаке. CX Codex +1 1 300 000установок watch bradautomates Смотрит видео по URL или локальному пути, собирает кадры и расшифровку, чтобы агент отвечал на вопросы о содержимом. Подходит для разбора роликов прямо из IDE. CX Codex +1 17 200установок video-editing affaan-m Скилл выстраивает пайплайн монтажа реального видео через ИИ. Помогает нарезать сырые записи через FFmpeg, собрать титры в Remotion и добавить озвучку в ElevenLabs. CX Codex +1 6 600установок video-use browser-use Скилл монтирует видео через диалог: расшифровывает речь, режет материал, добавляет субтитры и графические оверлеи. Подходит для роликов, интервью и уроков. CX Codex +1 5 100установок manim-video affaan-m Собирает технические объясняющие ролики в Manim: графики, схемы систем и продуктовые walkthrough. Подходит, когда нужна точная анимация вместо talking-head сценария. CX Codex +1 4 700установок

Рядом в теме «Бэкенд и API»

Всё по теме «Бэкенд и API» →

Вопросы о ffmpeg

Как установить правило ffmpeg в Cursor?

Создайте файл .cursor/rules/ffmpeg.mdc в корне проекта и вставьте в него содержимое правила. Cursor подхватит его автоматически для файлов по маске **/*.

Что делает правило ffmpeg?

Задаёт агенту набор соглашений по работе с FFmpeg: вызовы через libav* вместо CLI, двухпроходное кодирование, явные ключевые интервалы, lossless-аудио для архивов и закреплённые сборки в CI.

Почему нельзя вызывать ffmpeg из кода приложения?

Правило прямо запрещает это: вызов CLI через subprocess даёт слабый контроль над ошибками, утечки ресурсов и риск инъекции в shell. CLI остаётся для тестов, скриптов и отладки.

Исходный текст

ffmpeg.mdc · CC0-1.0
---
description: This guide defines best practices for integrating and utilizing FFmpeg within our applications, emphasizing API-first development, secure and reproducible builds, and optimal multimedia encoding techniques for quality and performance.
globs: **/*
---
# FFmpeg Best Practices

FFmpeg is the bedrock of our multimedia processing. Adhering to these guidelines ensures our implementations are secure, performant, and maintainable.

## 1. API-First for Application Integration

**Always interact with FFmpeg via its `libav*` APIs (e.g., `libavcodec`, `libavformat`, `libavfilter`) for application-level logic.** The `ffmpeg` command-line tool is for quick tests, scripting, or debugging, *never* for direct invocation within production application code.

❌ **BAD: Shelling out to `ffmpeg` CLI from application code**
```python
import subprocess

# Insecure, slow, hard to manage errors, resource leaks
def transcode_video_bad(input_path, output_path):
    cmd = f"ffmpeg -i {input_path} -c:v libx264 -crf 23 {output_path}"
    subprocess.run(cmd, shell=True, check=True)
```

✅ **GOOD: Using `libav*` APIs (conceptual C/C++)**
```c
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
// ... other libav* headers

// Proper API usage for transcoding (simplified for brevity)
int transcode_video_good(const char* input_path, const char* output_path) {
    AVFormatContext *input_ctx = NULL, *output_ctx = NULL;
    AVCodecContext *decoder_ctx = NULL, *encoder_ctx = NULL;
    // ... Initialize FFmpeg libraries
    // ... Open input file (avformat_open_input)
    // ... Find stream info (avformat_find_stream_info)
    // ... Find best video/audio stream (av_find_best_stream)
    // ... Allocate and open decoder context (avcodec_alloc_context3, avcodec_open2)
    // ... Allocate and open encoder context (avcodec_alloc_context3, avcodec_open2)
    // ... Open output file (avio_open, avformat_write_header)
    // ... Main loop: read packet, decode, filter, encode, write packet
    // ... Write trailer, cleanup (avformat_close_input, avio_closep, etc.)
    return 0; // Or error code
}
```
**Rationale:** Direct API calls offer fine-grained control, robust error handling, better resource management, and eliminate shell injection vulnerabilities.

## 2. Encoding for Quality & Performance

Optimize video encoding for target platforms and quality requirements.

### 2.1 Two-Pass Encoding for Bitrate Control

For any bitrate-constrained output (e.g., streaming, fixed file size targets), **always use two-pass encoding**. This delivers superior quality at a given bitrate compared to single-pass.

❌ **BAD: Single-pass encoding for bitrate-critical scenarios**
```bash
# Inconsistent quality, less efficient bitrate distribution
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M output.mp4
```

✅ **GOOD: Two-pass encoding (using libx264 as an example)**
```bash
# Pass 1: Analyze video, no output
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -an -f null /dev/null && \
# Pass 2: Encode with optimized settings from pass 1
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 2 -c:a aac -b:a 128k output.mp4
```
**API Equivalent (conceptual):** Set `AVCodecContext::flags |= AV_CODEC_FLAG_PASS1` for the first pass and `AV_CODEC_FLAG_PASS2` for the second, managing log files between passes.

### 2.2 Keyframe Interval Optimization

Set explicit keyframe intervals (`-g` and `-keyint_min`) to balance seekability and compression efficiency, especially for streaming or interactive playback.

❌ **BAD: Relying on default keyframe intervals for streaming**
```bash
# Suboptimal seeking performance, larger file size for given seekability
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
```

✅ **GOOD: Explicit keyframe intervals (e.g., 2-second interval for 30fps)**
```bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -g 60 -keyint_min 60 output.mp4
```
**Rationale:** A consistent keyframe interval improves seeking and stream segmenting for ABR.

### 2.3 Adaptive Bitrate Streaming (ABR)

For web delivery, **always generate multiple renditions for ABR streaming (HLS/DASH)** using modern codecs like AV1 (`libaom-av1`, `libsvtav1`) or HEVC (`libx265`).

```bash
# Example for HLS ABR (simplified for multiple resolutions/bitrates)
# This requires multiple ffmpeg runs or a complex filtergraph
ffmpeg -i input.mp4 \
-map 0:v:0 -map 0:a:0 \
-c:v libx264 -preset medium -g 60 -keyint_min 60 -sc_threshold 0 -b:v 2000k -maxrate 2140k -bufsize 3000k -vf "scale=-2:1080" -c:a aac -b:a 128k \
-hls_time 10 -hls_playlist_type vod -hls_segment_filename "stream_1080p_%03d.ts" stream_1080p.m3u8 \
-map 0:v:0 -map 0:a:0 \
-c:v libx264 -preset medium -g 60 -keyint_min 60 -sc_threshold 0 -b:v 1000k -maxrate 1070k -bufsize 1500k -vf "scale=-2:720" -c:a aac -b:a 96k \
-hls_time 10 -hls_playlist_type vod -hls_segment_filename "stream_720p_%03d.ts" stream_720p.m3u8
# ... and so on for other resolutions, then generate master playlist
```
**Rationale:** ABR provides the best user experience by adapting to network conditions.

## 3. Audio Integrity

For audio-critical workflows (e.g., forensic, archival), **prioritize lossless formats and metadata preservation.**

✅ **GOOD: Lossless audio conversion for forensic/archival**
```bash
# Convert to FLAC, preserving original sample rate and metadata
ffmpeg -i input.mp3 -c:a flac -sample_fmt s32 -ar 48000 output.flac
```
**Rationale:** Lossless formats like FLAC or WAV (PCM) ensure no data degradation. Explicitly setting sample format and rate prevents accidental downsampling.

## 4. Reproducibility & Security

Integrate FFmpeg builds into CI pipelines and manage dependencies rigorously.

### 4.1 Pinning FFmpeg Versions

**Always pin a specific Git commit hash for FFmpeg builds in CI/CD** to ensure reproducibility. Periodically update to the latest master for security patches and new features.

❌ **BAD: Relying on system-installed `ffmpeg` or floating versions**
```dockerfile
# Unpredictable behavior across environments/builds
RUN apt-get update && apt-get install -y ffmpeg
```

✅ **GOOD: Building FFmpeg from a pinned Git commit**
```dockerfile
ARG FFMPEG_COMMIT="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" # Example commit hash
RUN git clone https://git.ffmpeg.org/ffmpeg.git /usr/src/ffmpeg && \
    cd /usr/src/ffmpeg && \
    git checkout ${FFMPEG_COMMIT} && \
    ./configure --enable-shared --disable-static --enable-gpl --enable-libx264 --enable-libx265 && \
    make -j$(nproc) && make install && ldconfig
```
**Rationale:** Pinning commits guarantees that your build environment uses the exact FFmpeg version, preventing unexpected regressions.

### 4.2 FATE Test Suite Integration

**Run the FFmpeg FATE test suite (or a subset) as part of your CI pipeline** after any FFmpeg-related changes or updates.

**Rationale:** FATE is the upstream project's verification suite, catching regressions and ensuring correctness with untrusted media data.

## 5. Configuration Management

### 5.1 Using Preset Files

Store common or complex FFmpeg configurations in preset files (`.ffpreset` or `.avpreset`) for consistency and maintainability.

❌ **BAD: Long, repetitive command-line options**
```bash
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 18 -profile:v high -level 4.1 -pix_fmt yuv420p -bf 2 -g 250 -keyint_min 25 -sc_threshold 40 -qcomp 0.6 -aq-mode 2 -aq-strength 1.0 -c:a aac -b:a 192k output.mp4
```

✅ **GOOD: Utilizing preset files**
```bash
# In your custom_x264_preset.ffpreset:
# preset=veryslow
# crf=18
# profile=high
# level=4.1
# pix_fmt=yuv420p
# bf=2
# g=250
# keyint_min=25
# sc_threshold=40
# qcomp=0.6
# aq-mode=2
# aq-strength=1.0

# Then use:
ffmpeg -i input.mp4 -c:v libx264 -fpre custom_x264_preset -c:a aac -b:a 192k output.mp4
```
**Rationale:** Presets centralize complex option sets, making commands cleaner and configurations reusable.

### 5.2 AVOption Naming Conventions

Adhere to `AVOption` naming conventions (e.g., `-c:v`, `-b:a`) for clarity and consistency when specifying stream-specific options.

```bash
# Explicitly target video codec and audio bitrate
ffmpeg -i input.mp4 -c:v libx264 -b:a 128k output.mp4
```
**Rationale:** Clear stream specifiers prevent ambiguity and improve readability.

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой