y83 code / инструмент

Видеоредактор

Таймлайн-редактор видео с монтажом: несколько клипов, обрезка по кадрам, разделение, переходы, экспорт через ffmpeg. Собирается из записей экрана и произвольных видео с устройства. Статус — preview-сборка: интерфейс и рендер есть, но фича не объявлена пользователям.

раздел реестра
Инструменты
код
2 265 строк в 5 файлах
документ
05-video.md

Снимок: 2026-10-11. Секция хаба Tools, тайл «Видео» / «Edit», подпись «Preview-сборка · временно выключен» / «Preview build · temporarily disabled». Инструмент выключен в каталоге (enabled = false): карточка в хабе серая и не открывается. Открыть можно только из Записи экрана («Открыть видеоредактор») и из истории записей.

Экран и навигация

  • Screen.VideoEditor → VideoEditorScreen (771 строка).
  • Вход: из Записи экрана onOpenEditor, из истории записей (media_open_video_editor).

Возможности (подробно)

Клипы и таймлайн

  • initialProject/addClip — добавление клипа (из записей экрана или из галереи: media_add_video).
  • TimelineStrip (772 строки) — визуальная шкала: ClipStrip (клипы), TimeRuler (линейка времени), TransitionMarker (переходы между клипами), ZoomBar (масштаб шкалы), MiniButton.
  • Расчёт геометрии: msToPx/pxToMs/timelineMsAt/timelineToPx, buildLayout, dropIndex — куда вставить перетаскиваемый клип.

Воспроизведение и позиционирование

  • togglePlayback, onPlaybackStateChanged, PlaybackPositionState, captureAnchor/settleSeek/applySeek — точное позиционирование.
  • stepFrame — покадровая перемотка (FrameStepper).
  • Жесты: ScrubGestures (beginScrub/updateScrub/finishScrub), scrub-жесты, зум двумя пальцами, media_fit — вписать.

Редактирование

  • edit() — обрезка по началу/концу (media_start, media_end, media_frame_trimming).
  • Разделение клипа (media_split), слияние/добавление (media_add_clip).
  • Крайние проверки: media_too_close_to_clip_edge — нельзя резать вплотную к краю.
  • История правок: EditHistory (undo/redo — media_undo, media_redo), restore — откат.

Переходы

  • VideoTransitionCard — выбор перехода между двумя клипами: длительность (media_duration, media_ms), вид, «точный оверлей появится после рендера» (media_exact_overlap_after_render).
  • Проверка: клипы слишком короткие для перехода (media_clips_are_too_short_for_a_transition).

Экспорт (рендер)

Два пути, оба существуют:

  • Быстрый (по умолчанию) — VideoExporter через Media3 Transformer (внутри APK, без Termux): обрезка, склейка, скорость. ProgressHolder даёт процент, ExportState: Idle/Running(progress, output)/ Done(output, bytes)/Failed(error), isRunning защищает от второго рендера параллельно (media_ffmpeg_render_already_in_progress).
  • Тяжёлый — MediaExport через ffpeg в Termux (экспорт терминальной командой): переходы, субтитры, нормализация звука. Через ws-backend.

startExport/cancelExport — кнопки; media_retry_export — повтор после ошибки, media_cancel_render — отмена.

Вкладки и источники

VideoEditorTabContent — вкладки таймлайна, настроек и экспорта: ExportButton, FrameStepper, RecordingsCard (записи экрана как источник клипов), AppCard, Chip (переход, обрезка).

Где в коде

ФайлСтрокРоль
ui/video/VideoEditorScreen.kt771Экран, логика правок, экспорт
ui/video/TimelineStrip.kt772Таймлайн, клипы, линейка, переходы, зум
ui/video/VideoEditorTabContent.kt497Вкладки, кнопки, карточки источников
ui/video/VideoTransitionCard.kt167Карточка перехода
ui/video/ScrubGestures.kt58Жесты скраббинга

Плюс пакет video/ (вне ui, 1142 строки в 10 файлах): VideoProject (356) — модель проекта, VideoExporter (169) — Media3 Transformer, PlaybackPosition (125) — позиция/воспроизведение, VideoSources (124) — источники клипов, MediaExport (108) — ffmpeg-путь, MediaProbe (85) — метаданные, VideoProjectStore (72) — проекты на диске, EditHistory (40) — undo/redo, VideoMediaItems, TimelineGeometry.

Данные и API

  • Проекты лежат файлом на диске, не в Room: Download/y83ws/projects/<id>/project.json, экспорт в .../exports/. Причина в комментарии кода: проекты нужны и Termux, и ffmpeg (рендер по схеме), а каталог уже открыт Termux через MANAGE_EXTERNAL_STORAGE.
  • Источники: файлы записей экрана (bridge/ScreenRecordings) и галерея (MediaStore) — VideoSources.kt.
  • Быстрый экспорт локальный (Media3); тяжёлый (ffmpeg) — через Termux и backend.
  • Мост: bridge.BridgeState, app_video_status.

Агент

Мост

  • app_video_status — статус рендера/экспорта.
  • app_record_* — записи экрана (см. Запись экрана).

Агент не управляет монтажом напрямую: нет MCP-тулов монтажа. Он может проверить статус рендера (app_video_status) и работать с записями.

Подводные камни

  • Инструмент выключен в каталоге (enabled = false) — карточка серая, не нажимается. Это осознанный флаг preview-сборки, а не баг.
  • Два экспортных пути. По умолчанию Media3 Transformer (обрезка/склейка/ скорость, без Termux). Переходы, субтитры и нормализация звука идут в ffmpeg на Termux — без установленного ffmpeg тяжёлый рендер падает (media_ffmpeg_render_unavailable).
  • Один рендер за раз. isRunning/already_in_progress — второй экспорт не запустится, пока идёт первый.
  • Переходы видны только после рендера. В предпросмотре — «точный оверлей появится после экспорта».
  • Короткие клипы. Переход требует минимальной длины, иначе кнопка заблокирована.
  • Проект — файл в Download, не Room. Плюс MANAGE_EXTERNAL_STORAGE: файл проекта виден Termux и ffmpeg, поэтому удаление папки убивает проект. На диске он НЕ сохраняется как «черновик в БД» — EditHistory живёт в состоянии экрана.

Как обновлять

  • Каталог: data/InstrumentCatalog.kt (id video, флаг enabled = false).
  • Маршрут: ui/navigation/Screen.kt (Screen.VideoEditor).
  • Код UI: ui/video/*.
  • Движок: пакет video/ — VideoExporter (Media3), MediaExport (ffmpeg), VideoProjectStore (файлы проектов), MediaProbe.
  • Вход из записи: ScreenRecordScreen.onOpenEditor → MainRouter.
  • Статус: app_video_status в мосте.

Источник: docs/project/hub/05-video.md · Инструменты · 2 265 строк в 5 файлах. Страница собирается из документации проекта при сборке сайта.