Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
#
|
|
|
|
|
|
# Сборка nlve.
|
|
|
|
|
|
#
|
|
|
|
|
|
# ./build.sh редактор под эту систему
|
|
|
|
|
|
# ./build.sh current то же самое
|
|
|
|
|
|
# ./build.sh windows редактор под Windows (кросс-сборка)
|
|
|
|
|
|
# ./build.sh tool консольный инструмент проверок
|
Сборка под macOS отдельной целью, ограничения записаны в бэклог
./build.sh macos делает две сборки: nlve_intel для Intel и nlve_arm для
Apple Silicon. Имя цели в проекте одно на все системы, и сборка под
darwin затирает линуксовую — поэтому каждый файл переименовывается сразу,
а сборка под эту систему в конце делается заново.
Обёртку .app, которую делает lazbuild, удаляем: внутри неё ссылка на файл
с именем nlve, которого после переименования уже нет.
BACKLOG.md — то, что известно и сознательно не сделано. Про macOS там
записано главное: собирается, но предпросмотра не будет, пока встраивание
mpv не научится работать через NSView; окно зависимостей советует маку
apt вместо brew; проверить нечем, потому что мака нет. Заодно туда
переехали лицензионный вопрос с libmpv и три мелочи: значок exe, кэш
наложений и четыре секунды на открытие окна кадрирования.
2026-08-22 12:53:05 +03:00
|
|
|
|
# ./build.sh macos две сборки под macOS: nlve_intel и nlve_arm
|
Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
# ./build.sh test инструмент плюс прогон проверок
|
|
|
|
|
|
# ./build.sh all всё перечисленное
|
|
|
|
|
|
# ./build.sh run собрать под эту систему и запустить
|
|
|
|
|
|
# ./build.sh clean убрать промежуточные файлы сборки
|
|
|
|
|
|
#
|
|
|
|
|
|
# Тулчейн берётся из fpcupdeluxe, а не из системы. Это не придирка:
|
|
|
|
|
|
# системный Lazarus другой версии, и собранные им модули LCL с нашими
|
|
|
|
|
|
# несовместимы — сборка падает на ровном месте.
|
|
|
|
|
|
|
|
|
|
|
|
set -u
|
|
|
|
|
|
|
|
|
|
|
|
HERE=$(cd "$(dirname "$0")" && pwd)
|
|
|
|
|
|
|
|
|
|
|
|
FPCUP=${FPCUP:-/home/chaiman/fpcupdeluxe}
|
|
|
|
|
|
LAZBUILD="$FPCUP/lazarus/lazbuild"
|
|
|
|
|
|
LAZCONF="$FPCUP/config_lazarus"
|
Показатель работы внизу: ход, участок на монтаже, переключатель журнала
Полоска выполнения теперь показывает всё, что делается в стороне от
окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она
знала только про звук и миниатюры, а самое долгое — пересборку участков
с прозрачностью — не показывала вовсе.
Как она растёт. Настоящая доля известна только вехами: вставка готова,
файл разобран. Между вехами не происходит ничего видимого, и полоска,
стоящая на месте, выглядит как зависшая программа. Поэтому между вехами
она ползёт сама — к следующей вехе, но никогда её не достигая: каждый
шаг покрывает малую долю оставшегося расстояния. Работа идёт как
задумано — веха приходит быстро и полоска прыгает к ней; затянулась —
шаги мельчают, и заполнение само собой замедляется. Назад не идёт
никогда, полной без настоящего конца не становится.
Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его
можно было прогнать числами, и прогоняется: проверки в
tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути
десять шагов таймера, до трёх четвертей — ещё десять.
Участок монтажа, который сейчас пересобирается, помечается косой
штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а
рамка на узком участке была бы неразличима; штрих наклонный, чтобы его
не спутать с курсором и границами клипов — те все вертикальные.
Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями,
состояние переживает перезапуск.
Системный TStatusBar не взят намеренно: его рисует система, и под
Windows он остался бы светлой полосой — ровно та беда, из-за которой уже
переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей
нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00
|
|
|
|
# Компилятор нужен напрямую для консольных проверок без формы.
|
|
|
|
|
|
FPC="$FPCUP/fpc/bin/x86_64-linux/fpc.sh"
|
Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
|
|
|
|
|
|
# Собранный виджетсет только один — gtk2. Ни qt5, ни gtk3 в этом
|
|
|
|
|
|
# тулчейне нет, подставлять их бессмысленно.
|
|
|
|
|
|
LCL_LINUX=gtk2
|
|
|
|
|
|
|
|
|
|
|
|
# Под Windows виджетсет называется win32 и работает в том числе на 64 битах:
|
|
|
|
|
|
# это имя интерфейса, а не разрядности.
|
|
|
|
|
|
LCL_WINDOWS=win32
|
|
|
|
|
|
|
|
|
|
|
|
status=0
|
|
|
|
|
|
|
|
|
|
|
|
fail() {
|
|
|
|
|
|
echo "ОШИБКА: $*" >&2
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
note() {
|
|
|
|
|
|
echo
|
|
|
|
|
|
echo "=== $* ==="
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
check_toolchain() {
|
|
|
|
|
|
[ -x "$LAZBUILD" ] || fail "не найден lazbuild: $LAZBUILD
|
|
|
|
|
|
Задайте другой корень через переменную FPCUP, например:
|
|
|
|
|
|
FPCUP=/путь/к/fpcupdeluxe ./build.sh"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Из вывода lazbuild интересны только ошибки и итог. Подсказок о
|
|
|
|
|
|
# неиспользованных параметрах там сотни, и за ними не видно главного.
|
|
|
|
|
|
run_lazbuild() {
|
|
|
|
|
|
local title=$1
|
|
|
|
|
|
local rc
|
|
|
|
|
|
shift
|
|
|
|
|
|
note "$title"
|
|
|
|
|
|
"$LAZBUILD" --primary-config-path="$LAZCONF" "$@" 2>&1 \
|
|
|
|
|
|
| grep -viE "^Hint: \(lazbuild\)|^Hint: \(lazarus\)|Start of reading config|End of reading config" \
|
|
|
|
|
|
| grep -iE "error|fatal|warning|Linking|lines compiled|Compiling package"
|
|
|
|
|
|
# Код возврата берём у lazbuild, а не у grep: grep возвращает 1 просто
|
|
|
|
|
|
# потому, что ничего не нашёл, и это не ошибка сборки.
|
|
|
|
|
|
#
|
|
|
|
|
|
# PIPESTATUS читается сразу же и в переменную. Любая следующая команда
|
|
|
|
|
|
# его затирает — даже двоеточие. На этом скрипт уже один раз соврал:
|
|
|
|
|
|
# сборка падала, а он докладывал «готово».
|
|
|
|
|
|
rc=${PIPESTATUS[0]}
|
|
|
|
|
|
return "$rc"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
build_current() {
|
|
|
|
|
|
check_toolchain
|
|
|
|
|
|
if run_lazbuild "Редактор под эту систему ($LCL_LINUX)" \
|
|
|
|
|
|
--ws="$LCL_LINUX" "$HERE/nlve.lpi"; then
|
|
|
|
|
|
echo "готово: $HERE/nlve"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
build_windows() {
|
|
|
|
|
|
check_toolchain
|
|
|
|
|
|
if run_lazbuild "Редактор под Windows (x86_64)" \
|
|
|
|
|
|
--cpu=x86_64 --os=win64 --ws="$LCL_WINDOWS" "$HERE/nlve.lpi"; then
|
|
|
|
|
|
echo "готово: $HERE/nlve.exe"
|
|
|
|
|
|
# Печатаем, что именно получилось: перепутать разрядность легко, а
|
|
|
|
|
|
# заметить это без запуска под Windows нечем.
|
|
|
|
|
|
file "$HERE/nlve.exe" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Кросс-сборка оставляет модули для Windows в том же каталоге, что и
|
|
|
|
|
|
# родные. Следующая сборка под Linux их не тронет и возьмёт как свои,
|
|
|
|
|
|
# после чего компоновщик выдаст непонятную ошибку. Поэтому чистим.
|
|
|
|
|
|
rm -rf "$HERE/lib/x86_64-win64"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
Сборка под macOS отдельной целью, ограничения записаны в бэклог
./build.sh macos делает две сборки: nlve_intel для Intel и nlve_arm для
Apple Silicon. Имя цели в проекте одно на все системы, и сборка под
darwin затирает линуксовую — поэтому каждый файл переименовывается сразу,
а сборка под эту систему в конце делается заново.
Обёртку .app, которую делает lazbuild, удаляем: внутри неё ссылка на файл
с именем nlve, которого после переименования уже нет.
BACKLOG.md — то, что известно и сознательно не сделано. Про macOS там
записано главное: собирается, но предпросмотра не будет, пока встраивание
mpv не научится работать через NSView; окно зависимостей советует маку
apt вместо brew; проверить нечем, потому что мака нет. Заодно туда
переехали лицензионный вопрос с libmpv и три мелочи: значок exe, кэш
наложений и четыре секунды на открытие окна кадрирования.
2026-08-22 12:53:05 +03:00
|
|
|
|
build_macos() {
|
|
|
|
|
|
check_toolchain
|
|
|
|
|
|
|
|
|
|
|
|
# Сборка под macOS кладёт файл туда же, куда и сборка под Linux, и
|
|
|
|
|
|
# затирает её: имя цели в проекте одно на все системы. Поэтому каждый
|
|
|
|
|
|
# файл переименовывается сразу, а линуксовая сборка в конце делается
|
|
|
|
|
|
# заново.
|
|
|
|
|
|
if run_lazbuild "Редактор под macOS (Intel)" \
|
|
|
|
|
|
--cpu=x86_64 --os=darwin --ws=cocoa "$HERE/nlve.lpi"; then
|
|
|
|
|
|
mv -f "$HERE/nlve" "$HERE/nlve_intel"
|
|
|
|
|
|
echo "готово: $HERE/nlve_intel"
|
|
|
|
|
|
file "$HERE/nlve_intel" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if run_lazbuild "Редактор под macOS (Apple Silicon)" \
|
|
|
|
|
|
--cpu=aarch64 --os=darwin --ws=cocoa "$HERE/nlve.lpi"; then
|
|
|
|
|
|
mv -f "$HERE/nlve" "$HERE/nlve_arm"
|
|
|
|
|
|
echo "готово: $HERE/nlve_arm"
|
|
|
|
|
|
file "$HERE/nlve_arm" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Обёртку .app делает lazbuild, и внутри неё ссылка на файл с именем
|
|
|
|
|
|
# nlve, которого после переименования уже нет. Обманчивая пустышка не
|
|
|
|
|
|
# нужна.
|
|
|
|
|
|
rm -rf "$HERE/nlve.app"
|
|
|
|
|
|
|
|
|
|
|
|
# Модули под darwin лежат отдельно, но сборку под Linux мы затёрли —
|
|
|
|
|
|
# возвращаем её на место.
|
|
|
|
|
|
note "Возвращаю сборку под эту систему"
|
|
|
|
|
|
build_current
|
|
|
|
|
|
|
|
|
|
|
|
echo
|
|
|
|
|
|
echo "ВНИМАНИЕ: под macOS предпросмотра не будет — встраивание mpv"
|
|
|
|
|
|
echo "написано под X11 и Windows. Подробности в BACKLOG.md."
|
|
|
|
|
|
}
|
|
|
|
|
|
|
Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
build_tool() {
|
|
|
|
|
|
note "Консольный инструмент проверок"
|
|
|
|
|
|
if "$HERE/tests/build.sh"; then
|
|
|
|
|
|
:
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
run_tests() {
|
|
|
|
|
|
build_tool
|
|
|
|
|
|
[ "$status" -eq 0 ] || return
|
|
|
|
|
|
|
|
|
|
|
|
note "Проверки уплощения монтажа"
|
|
|
|
|
|
if "$HERE/tests/nlvetool" flattest; then
|
|
|
|
|
|
echo "проверки пройдены"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "проверки не пройдены" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
Показатель работы внизу: ход, участок на монтаже, переключатель журнала
Полоска выполнения теперь показывает всё, что делается в стороне от
окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она
знала только про звук и миниатюры, а самое долгое — пересборку участков
с прозрачностью — не показывала вовсе.
Как она растёт. Настоящая доля известна только вехами: вставка готова,
файл разобран. Между вехами не происходит ничего видимого, и полоска,
стоящая на месте, выглядит как зависшая программа. Поэтому между вехами
она ползёт сама — к следующей вехе, но никогда её не достигая: каждый
шаг покрывает малую долю оставшегося расстояния. Работа идёт как
задумано — веха приходит быстро и полоска прыгает к ней; затянулась —
шаги мельчают, и заполнение само собой замедляется. Назад не идёт
никогда, полной без настоящего конца не становится.
Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его
можно было прогнать числами, и прогоняется: проверки в
tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути
десять шагов таймера, до трёх четвертей — ещё десять.
Участок монтажа, который сейчас пересобирается, помечается косой
штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а
рамка на узком участке была бы неразличима; штрих наклонный, чтобы его
не спутать с курсором и границами клипов — те все вертикальные.
Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями,
состояние переживает перезапуск.
Системный TStatusBar не взят намеренно: его рисует система, и под
Windows он остался бы светлой полосой — ровно та беда, из-за которой уже
переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей
нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00
|
|
|
|
|
Квадратные кнопки со значками, журнал перестал уезжать из-под курсора
Двойной щелчок по кнопке журнала. Причина оказалась не в кнопке: журнал
лежал ниже полосы состояния. Спрятали журнал — полоса уехала вниз на сто
тридцать пикселей, кнопка ушла из-под курсора, и следующий щелчок в то же
место попадал уже мимо. Порядок исправлен: полоса состояния теперь самая
нижняя, журнал над ней, и при переключении ничего не движется.
Прилипание, схлопывание и журнал стали квадратными кнопками со значками и
собраны в один набор. Надписи переехали в подсказки — целиком, вместе с
состоянием: у значка нет другого способа рассказать о себе. Подсказка
всплывает через десятую долю секунды и держится пятнадцать.
Значки рисуются кодом, а не берутся из файла: программа не должна
зависеть от того, лежит ли рядом с ней картинка. Рисунки придуманы в
icons/*.svg — оттуда их можно перегнать в png чем угодно, проверено
командой convert.
Свойства из файлов форм теперь проверяются отдельной программой по
сведениям о типах. Файл формы разбирается при запуске, а не при сборке:
опечатка в имени свойства или в значении перечисления даёт не ошибку
компиляции, а падение окна на старте. Проверка включена в build.sh.
2026-08-22 01:08:58 +03:00
|
|
|
|
# Свойства, записанные в файлах форм, проверяются по сведениям о типах.
|
|
|
|
|
|
# Файл формы разбирается при запуске, а не при сборке: опечатка в имени
|
|
|
|
|
|
# свойства даёт не ошибку компиляции, а падение окна на старте.
|
|
|
|
|
|
note "Проверка свойств из файлов форм"
|
|
|
|
|
|
if "$LAZBUILD" --primary-config-path="$LAZCONF" \
|
|
|
|
|
|
"$HERE/tests/lfmcheck/lfmcheck.lpi" >/dev/null 2>&1; then
|
|
|
|
|
|
if "$HERE/tests/lfmcheck/lfmcheck"; then
|
|
|
|
|
|
:
|
|
|
|
|
|
else
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
Показатель работы внизу: ход, участок на монтаже, переключатель журнала
Полоска выполнения теперь показывает всё, что делается в стороне от
окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она
знала только про звук и миниатюры, а самое долгое — пересборку участков
с прозрачностью — не показывала вовсе.
Как она растёт. Настоящая доля известна только вехами: вставка готова,
файл разобран. Между вехами не происходит ничего видимого, и полоска,
стоящая на месте, выглядит как зависшая программа. Поэтому между вехами
она ползёт сама — к следующей вехе, но никогда её не достигая: каждый
шаг покрывает малую долю оставшегося расстояния. Работа идёт как
задумано — веха приходит быстро и полоска прыгает к ней; затянулась —
шаги мельчают, и заполнение само собой замедляется. Назад не идёт
никогда, полной без настоящего конца не становится.
Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его
можно было прогнать числами, и прогоняется: проверки в
tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути
десять шагов таймера, до трёх четвертей — ещё десять.
Участок монтажа, который сейчас пересобирается, помечается косой
штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а
рамка на узком участке была бы неразличима; штрих наклонный, чтобы его
не спутать с курсором и границами клипов — те все вертикальные.
Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями,
состояние переживает перезапуск.
Системный TStatusBar не взят намеренно: его рисует система, и под
Windows он остался бы светлой полосой — ровно та беда, из-за которой уже
переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей
нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00
|
|
|
|
# Ход полоски выполнения проверяется отдельной программой: расчёт вынесен
|
|
|
|
|
|
# в uAppTypes именно затем, чтобы его можно было прогнать числами.
|
|
|
|
|
|
note "Проверка хода полоски выполнения"
|
|
|
|
|
|
if "$FPC" -Fu"$HERE/src" -FE"$HERE/tests/progress" \
|
|
|
|
|
|
-o"$HERE/tests/progress/progtest" \
|
|
|
|
|
|
"$HERE/tests/progress/progtest.lpr" >/dev/null 2>&1; then
|
|
|
|
|
|
if "$HERE/tests/progress/progtest"; then
|
|
|
|
|
|
:
|
|
|
|
|
|
else
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "не собралось" >&2
|
|
|
|
|
|
status=1
|
|
|
|
|
|
fi
|
Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
do_clean() {
|
|
|
|
|
|
note "Уборка"
|
|
|
|
|
|
rm -rf "$HERE/lib" "$HERE/tests/lib"
|
|
|
|
|
|
rm -f "$HERE/nlve.dbg"
|
|
|
|
|
|
echo "убраны промежуточные файлы сборки"
|
|
|
|
|
|
echo "готовые двоичные файлы (nlve, nlve.exe, tests/nlvetool) оставлены"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case "${1:-current}" in
|
|
|
|
|
|
current|linux|"")
|
|
|
|
|
|
build_current
|
|
|
|
|
|
;;
|
|
|
|
|
|
windows|win|win64)
|
|
|
|
|
|
build_windows
|
|
|
|
|
|
;;
|
Сборка под macOS отдельной целью, ограничения записаны в бэклог
./build.sh macos делает две сборки: nlve_intel для Intel и nlve_arm для
Apple Silicon. Имя цели в проекте одно на все системы, и сборка под
darwin затирает линуксовую — поэтому каждый файл переименовывается сразу,
а сборка под эту систему в конце делается заново.
Обёртку .app, которую делает lazbuild, удаляем: внутри неё ссылка на файл
с именем nlve, которого после переименования уже нет.
BACKLOG.md — то, что известно и сознательно не сделано. Про macOS там
записано главное: собирается, но предпросмотра не будет, пока встраивание
mpv не научится работать через NSView; окно зависимостей советует маку
apt вместо brew; проверить нечем, потому что мака нет. Заодно туда
переехали лицензионный вопрос с libmpv и три мелочи: значок exe, кэш
наложений и четыре секунды на открытие окна кадрирования.
2026-08-22 12:53:05 +03:00
|
|
|
|
macos|mac|darwin)
|
|
|
|
|
|
build_macos
|
|
|
|
|
|
;;
|
Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
tool)
|
|
|
|
|
|
build_tool
|
|
|
|
|
|
;;
|
|
|
|
|
|
test|tests)
|
|
|
|
|
|
run_tests
|
|
|
|
|
|
;;
|
|
|
|
|
|
all)
|
|
|
|
|
|
build_current
|
|
|
|
|
|
build_windows
|
|
|
|
|
|
run_tests
|
|
|
|
|
|
;;
|
|
|
|
|
|
run)
|
|
|
|
|
|
build_current
|
|
|
|
|
|
[ "$status" -eq 0 ] || exit 1
|
|
|
|
|
|
note "Запуск"
|
|
|
|
|
|
exec "$HERE/nlve"
|
|
|
|
|
|
;;
|
|
|
|
|
|
clean)
|
|
|
|
|
|
do_clean
|
|
|
|
|
|
;;
|
|
|
|
|
|
-h|--help|help)
|
|
|
|
|
|
# Печатаем шапку файла до первой строки, которая уже не комментарий.
|
|
|
|
|
|
awk 'NR>2 { if ($0 !~ /^#/) exit; sub(/^# ?/, ""); print }' "$0"
|
|
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
fail "неизвестная цель: $1
|
Сборка под macOS отдельной целью, ограничения записаны в бэклог
./build.sh macos делает две сборки: nlve_intel для Intel и nlve_arm для
Apple Silicon. Имя цели в проекте одно на все системы, и сборка под
darwin затирает линуксовую — поэтому каждый файл переименовывается сразу,
а сборка под эту систему в конце делается заново.
Обёртку .app, которую делает lazbuild, удаляем: внутри неё ссылка на файл
с именем nlve, которого после переименования уже нет.
BACKLOG.md — то, что известно и сознательно не сделано. Про macOS там
записано главное: собирается, но предпросмотра не будет, пока встраивание
mpv не научится работать через NSView; окно зависимостей советует маку
apt вместо brew; проверить нечем, потому что мака нет. Заодно туда
переехали лицензионный вопрос с libmpv и три мелочи: значок exe, кэш
наложений и четыре секунды на открытие окна кадрирования.
2026-08-22 12:53:05 +03:00
|
|
|
|
Доступны: current, windows, macos, tool, test, all, run, clean"
|
Нелинейный видеоредактор без перекодирования
Куски видео вырезаются и склеиваются копированием потока: сборка ролика
занимает время копирования файла, а не время рендера. Композитинга нет
принципиально — при перекрытии побеждает клип с верхней дорожки целиком,
и картинкой, и звуком. Именно это ограничение и делает сборку копированием
возможной.
Что внутри:
- монтажный стол со своей отрисовкой: дорожки, масштаб, прилипание,
схлопывание, громкость на клипе;
- предпросмотр прямо с монтажа через libmpv и виртуальный список кусков,
без промежуточных файлов;
- сборка через ffmpeg с точными резами: перекодируется только огрызок от
реза до ближайшего опорного кадра, остальное копируется;
- разбор заголовка MP4 для поиска опорных кадров — в 500 раз быстрее
опроса ffprobe;
- перепаковка контейнеров, кадрирование и поворот, сведения о проекте;
- свои цвета всего окна: системные элементы под Windows цвет не берут,
поэтому кнопки, полоса меню, журнал и полосы прокрутки нарисованы сами;
- окно зависимостей: недостающие ffmpeg, ffprobe и libmpv скачиваются с
официальных источников;
- кросс-сборка под Windows и работа под Wine.
Первый коммит: до этого история не велась.
2026-08-19 18:36:16 +03:00
|
|
|
|
;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
|
|
echo
|
|
|
|
|
|
if [ "$status" -eq 0 ]; then
|
|
|
|
|
|
echo "ИТОГ: без ошибок"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "ИТОГ: были ошибки"
|
|
|
|
|
|
fi
|
|
|
|
|
|
exit "$status"
|